Организовать содержимое ~ / .emacs.d / init.el и ~ / emacs.d?

28
  1. Когда мы добавляем все больше и больше строк ~/.emacs.d/init.elдля различных целей (для режима python, для emacs-eclim, для ...), файл становится длинным и менее читаемым. Есть ли способ помочь организовать его содержание?
  2. Мой нынешний ~/.emacs.dвыглядит так

    $ ls *
    init.el
    
    auto-save-list:
    
    elisp:
    python-mode.el-6.1.3
    
    elpa:
    archives        auctex-readme.txt         s-20140910.334
    auctex-11.87.7  emacs-eclim-20140809.207
    
    eshell:
    history
    

    python-mode.el-6.1.3был установлен вручную, в то время как emacs-eclim-20140809.207был установлен elpa, и я не уверен на 100%, что другие вещи под elpa/были elpa. Как я могу организовать содержание ~/.emacs.d/?

Тим
источник

Ответы:

32

Люди, использующие меньшие редакторы, любят разбивать свой код на несколько файлов. Если вы используете Emacs, для этого нет причин: просто используйте один большой файл, который вы разбили на разделы.

Каждый раздел должен начинаться с

^L
;;; title of the section

где вы вставляете ^Lсимвол, печатая C-q C-l. Затем вы можете использовать такие команды, как C-x ]( forward-page) или C-x n p( narrow-to-page) для навигации по файлу. См. Раздел 25.4 (Страницы) руководства Emacs для более подробной информации.

JCH
источник
16
Также нет особой причины не разбивать код на несколько файлов. Это зависит от того, что вы хотите, чтобы группировка вещей означала - как вы хотите, чтобы она себя вела. И это может зависеть от того, насколько большой LARGE. И это может зависеть от того, передаются ли части вашего кода другим, например, библиотекам.
Дрю
2
Пользуясь комментариями @ Drew, пользователь может захотеть иметь разные конфиги для разных версий emacs и сред и соответственно загружать соответствующие elisp. Тем не менее, мне нравится совет по нумерации страниц.
Харви
3
@Harvey: разбиение на страницы и использование отдельных файлов являются независимыми способами организации текста. Вы можете использовать оба, очевидно. Я использую нумерацию страниц во всех моих библиотеках, чтобы разделить разделы. Но у меня также есть отдельные библиотеки (файлы).
Дрю
1
@jch Если вы используете этот стиль, вы также можете включить Outline Minor Mode или аналогичную функцию, чтобы разрешить сворачивание разделов и функций. Сложив все заголовки верхнего уровня, вы получите хороший обзор всех разделов в вашей конфигурации Emacs.
lunaryorn
@lunaryorn, я пытался, но я нашел это отвлекающим - я нахожу команды перемещения страницы достаточно большую часть времени, мне только иногда нужно сужаться. Возможно, мои .emacsи .wlне достаточно длинные.
JCH
20

Классический способ сделать это - разделить ваши .emacsфайлы на отдельные. Например, вы можете переместить все свои веб-материалы ~/.emacs.d/web-config.elи затем загрузить их внутрь init.el:

(load "~/.emacs.d/web-config.el")

Если вы хотите, чтобы ваша работа ~/.emacs.dбыла более организованной, вы также можете переместить эти файлы конфигурации в их собственный каталог:

(load "~/.emacs.d/config/web.el")

Теперь вы можете просто перейти к соответствующему файлу при внесении изменений в вашу конфигурацию.

Единственное, чего здесь не хватает - это переменные, установленные через систему настройки. Они все еще будут в вашем главном init.el. По-видимому, есть небольшая утилита под названием init split, которая позволяет вам создавать правила, в которых указываются настройки, но я никогда не использовал ее сам. Кроме того, система «Настройка» может быть настроена на использование отдельного файла для своих настроек. Задайте custom-fileпеременную, чтобы указать, куда следует читать и записывать настройки «настройки» .

Что касается самого каталога, я всегда был доволен макетом по умолчанию. Основным изменением, которое я сделал, было создание каталога для всех моих собственных пользовательских пакетов и библиотек, которые не управляются package.el. Это дает один дом для моего пользовательского elisp, который не связан с конфигурацией.

Тихон Джелвис
источник
Спасибо. (1) Что такое каталог для пакетов и библиотек, которыми управляет package.el? (2) содержимое директории elpaуправляется elpa? Могу ли я переместить их в другое место?
Тим
2
Вы можете указать отдельный файл для настройки переменных, установив custom-fileпеременную. Источник
Каушал Моди,
@Tim: каталогом, управляемым package.el, является elpa. Elpa - это не пакет lisp, это репозиторий пакетов. Package.el по-прежнему будет добавлять все пакеты, которые он устанавливает (будь то из elpa или из другого репозитория - например, в вашем случае, я не думаю, что eclim и s из elpa) в каталог elpa. И да, вам не нужно беспокоиться о содержимом этого каталога.
Т. Веррон
(Больше не могу редактировать) То, что я написал выше, не совсем верно: elpa - это формат архивов пакетов, package.el - менеджер пакетов. Для пользователя нет реальной разницы между ними. Мой комментарий выше содержит ошибку elpa с GNU elpa, который является одним из доступных пакетов elpa (и единственным официальным).
Т. Веррон
16

Если вам нравится Org-режим, вы можете использовать его, чтобы организовать, .emacsне разбивая его. В моей текущей конфигурации мой .emacsфайл просто загружает файл init.org, который находится под~/.emacs.d/init/init.org

(require 'org)

;; Load the actual configuration file
(org-babel-load-file
  (expand-file-name (concat user-emacs-directory "init/init.org")))

Используя разные файлы, вам нужно grepвместо простого C-sчто-то искать и так далее. Кроме того, проще добавить несколько уровней в вашу организацию.

rlazo
источник
1
В настоящее время я делаю это, хотя я и не думал использовать org-babel-load-file. Милая! (Примеры: github.com/vermiculus/dotfiles/blob/… , github.com/larstvei/dot-emacs )
Шон Оллред
Подробнее об использовании org-mode для конфигурации Emacs по этому вопросу: Могу ли я использовать org-mode для структурирования моего .emacs или другого файла конфигурации .el?
ShreevatsaR
9

Просто перенесите фрагменты кода из init.elотдельных файлов (библиотек), которые вы потом require. (Используйте provideв библиотеках required.) Поместите эти файлы куда хотите, и обновите load-pathсоответственно.

Нарисовался
источник
Спасибо. (1) например? (2) что вы предлагаете организовать ~ / .emacs.d /?
Тим
1
Что вы имеете в виду «организовать содержание ~/.emacs.d/? Вы не предлагают спецификации , что вы хотите. Вы не ограничены иметь все в одном каталоге. Вы можете положить вещи в любом месте вы хотите, и изменить load-pathсоответствующим образом . Если какая - то программа / инструмент только ставит вещи в ~/.emacs.d/(то есть, если вы не можете сказать ему, куда поместить вещи), затем переместите его туда, куда вы хотите, после того, как эта программа / инструмент будет завершен
Дрю
1
Что вы подразумеваете под "например"? Что вы хотите пример? (require 'foobar)это пример использования require. (add-to-list 'load-path "/my/lisp/dir")пример модификации load-path. (provide 'foobar)это пример использования provide.
Дрю
По "организовать содержимое ~ / .emacs.d /, я, как человек, могу понять его лучше, а не emacs, чтобы понять. Это привычка, такая же, как организация вашего кабинета, ящиков, книжных полок. Например, python -mode.el-6.1.3 был установлен вручную, тогда как elpa установил emacs-eclim-20140809.207. Являются ли они обоими пакетами? Если это так, целесообразно ли поместить их в один подкаталог ~ / .emacs.d /?
Тим
Вы - человек, который может ответить, какая организация может помочь вам лучше понять это. (Emacs ничего не понимает.) Используйте любую структуру папок, которая вам нравится. Назовите их шкафами, ящиками, книжными полками или просто папками. И снова, вы init.elможете загружать библиотеки, расположенные где угодно , а не только внутри ~/.emacs.d/.
Дрю
7

Я использую предложение от targzeta, найденное в каталоге Emacs Wiki: Load .

В основном у меня есть ~ / .emacs.d / load-directory.el:

;;;; ~/.emacs.d/load-directory.el

;; Handy function to load recursively all '.el' files in a given directory
(defun load-directory (directory)
  "Load recursively all '.el' files in DIRECTORY."
  (dolist (element (directory-files-and-attributes directory nil nil nil))
    (let* ((path (car element))
           (fullpath (concat directory "/" path))
           (isdir (car (cdr element)))
           (ignore-dir (or (string= path ".") (string= path ".."))))
      (cond
       ((and (eq isdir t) (not ignore-dir))
        (load-directory fullpath))
       ((and (eq isdir nil) (string= (substring path -3) ".el"))
        (load (file-name-sans-extension fullpath)))))))

Затем я просто помещаю отдельные файлы в мой ~ / .emacs.d / config:

~/.emacs.d/config ls
01-packages.el  02-style.el  03-modes.el  04-keybindings.el  05-functions.el

И, наконец, у меня есть это в моем ~ / .emacs.d / init.el:

;; Load all ".el" files under ~/.emacs.d/config directory.
(load "~/.emacs.d/load-directory")
(load-directory "~/.emacs.d/config")
Boccaperta-IT
источник
Мы хотим, чтобы мы предоставили больше информации, чем просто ссылку - например, краткое описание того, что находится по этой ссылке.
Дрю
Вы правы, я отредактировал свой ответ.
Boccaperta-IT
Гектометр В качестве вежливости, по крайней мере, вы, вероятно, должны сказать, что код, который вы сильно ударили, был написан targzeta . Обобщение страницы с перекрестными ссылками не означает плагиат ее содержимого. (Конечно, если вы находитесь targzeta, то нет никаких проблем , по- видимому.)
Drew
Вы снова правы, отредактировано. Спасибо.
Boccaperta-IT
Спасибо. (Я знаю, что требуется немного времени, чтобы сделать это правильно, но это помогает всем немного больше.)
Дрю
5

Очевидно, есть несколько способов снять кожу с этой конкретной кошки. Мой текущий фаворит - использовать outline-minor-modeс outshine . Выдержка:

;; * This here is my emacs init file
;; ** Many subsections with headlines like this one omitted
;; ** Customising modes
;; […] more lines omitted
;; *** Org and outline modes
(autoload 'outshine-hook-function "outshine")
(add-hook 'outline-minor-mode-hook 'outshine-hook-function)
;; […] and more
;; * Emacs Magic
;;; Local Variables:
;;; mode: emacs-lisp
;;; coding: utf-8
;;; mode: outline-minor
;;; fill-column: 79
;;; End:

Обратите внимание, что вам нужно получить затмение из вашего любимого хранилища пакетов.

Харальд Ханче-Олсен
источник
1
Я начал с режима outline-minor-mode, но нашел слишком болезненные сочетания клавиш и так и не нашел времени самому что-нибудь с этим поделать. Итак, я перешел в режим orgstruct после обнаружения режима org, но затем я узнал о затмении. Блаженство! В настоящее время я использую outline + outshine для всех своих структур elisp, latex и других файлов с их собственным основным режимом и org-mode для всех видов заметок.
Харальд Ханче-Олсен
2

Я использую следующую структуру для отслеживания пакетов и файлов

~/.emacs.d
|-- elpa            ;; Package.el packages
|-- hack            ;; Development versions of packages (e.g. org, personal packages)
|-- single-lisp     ;; Individual lisp files from outside sources (e.g. EmacsWiki)
|-- site-lisp       ;; Lisp packages not managed by package.el (directories)
|-- user-config     ;; Machine/situation specific customization (work vs home)
|   `-- custom.el   ;; Customization settings
|-- lisp            ;; Individual .el files to keep init.el clean
|   `-- defaults.el ;; Default configuration settings
`-- init.el

Затем я использую use-packageдля управления, какие пакеты загружены и какие настройки установлены для каждого пакета. Только в большинстве случаев hackи elpaтребуют обновления, остальные папки часто предназначены для одноразовых пакетов, которые я хочу протестировать или использовать кратко, но не нужно загружать (даже праздно).

custom.el предназначен для настройки параметров, которые я предпочитаю не использовать (и не версию, даже если я использую).

defaults.elпредназначен для общей конфигурации (строка меню, шрифт, кодировка и т. д.), которая затем может быть перезаписана в любом файле .el, user-config/чтобы обеспечить систему, которая будет работать, как я ожидаю, но ее можно настроить в соответствии с окружающей средой.

Ранее я пытался сохранить functions, macros, adviceв отдельных упаковках , чтобы обеспечить разграничение между содержанием, но натолкнулся на определение / требуют вопросы , поэтому поставили их обратно в init.el. В конечном итоге они могут быть возвращены в ~/.emacs.d/lisp/.

Я стараюсь поддерживать init.elпорядок, сортирую контент по функциям и целям, чтобы найти его снова было несложно. У меня был монолитный init.elфайл, и я продолжал добавлять новый контент в конце (или там, где я думал, что он мог бы подойти), и в конечном итоге не знал, что я добавил или где я его добавил, когда я пошел искать его (и иногда поиск с помощью isearchне помог, так как я не мог вспомнить, как я назвал вещи в то время).

Джонатан Лич-Пепин
источник
2

Во всех существующих ответах приведены рекомендации по организации созданных вручную файлов, например, init.elдрузей. Не менее важна организация всех автоматически создаваемых файлов из различных пакетов, и для этого пакет no-litteringпревосходен.

Радон Росборо
источник
1

я добавил

  (when (string= (buffer-name) "init.el")
    (setq imenu-generic-expression
      '((nil "^;; \\[ \\(.*\\)" 1))))

в emacs-lisp-mode-hook. Затем добавьте в файл разделы «Ясниппет», «Упаковка», «Режим Java» и т. Д. Это хорошо работает для моих 1000 строк кода (включая комментарии).

РЕДАКТИРОВАТЬ: Наконец я переключаюсь между разделами с helm-imenu. На самом деле руль автоматически подключается к обычной функции имен, так что все, что мне нужно, это

       (local-set-key (kbd "C-*") 'imenu)
Матиас
источник
Вы могли бы использовать локальную переменную файла вместо ловушки.
YoungFrog
1

Я разделил мой относительно маленький .emacsфайл на три части:

  • emacs-custom.el для настроек, вырывающих много громоздких и бесполезных данных; файл автоматически перезаписывается, не затрагивая основной файл .emacs , предотвращая ложные изменения.

    (setq custom-file "~/.emacs-custom.el")
    (load custom-file)
    
  • lg-lib.el для кода, а не для конфигурации: загрузка моих собственных библиотек из нестандартных исходных расположений, а не из каталога пакетов и определение различных функций (в основном копируются и взламываются при отсутствии подходящего пакета); это еще одно значительное сокращение числа строк .emacs .

    (load "~/lg-lib")
    
  • Основной файл .emacs : без громоздкого кода и громоздких переменных настройки, он содержит requireвызовы для пакетов, переменные, которые не являются частью системы настройки, и различные вызовы функций для загрузки и инициализации пакетов. Я «организовал» его, тщательно собрав все строки, относящиеся к одному и тому же пакету или функции, и дополнительно отделив загрузку пакета и параметры, связанные с пакетом, от «основной» функциональности. Довольно представительный отрывок:

    (require 'ido)
    (ido-mode t)
    
    (require 'auto-complete)
    (add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
    
    (require 'auto-complete-config)
    (ac-config-default)
    (global-auto-complete-mode t)
    

    Эти разделы крошечные, но они останутся управляемыми с большим количеством строк конфигурации для каждого пакета.

Лоренцо Гатти
источник
1

Следуйте настройке мастера Emacs, например, https://github.com/purcell/emacs.d

Например, в отношении того, как организовать вручную установленные пакеты и пакеты, установленные из ELPA, в настройках Стивена Пурселла есть

a place for 3rd party code which isn't available in MELPA or other
package repositories. This directory and its immediate
subdirectories will be added to load-path at start-up time.

Notably, in Emacs 23.x, a backported package.el is automatically
downloaded and installed here

Зачем следовать за мастером? Основной момент моих «Основных emacs за один год» заключается в том, что новички могут эффективно избежать накладных расходов на установку и «ошибок».

Я понимаю, что многие люди не согласны со мной, но вот мой случай (подробно в моей статье ):

Я начал использовать Emacs, используя уважаемую стабильную (5 лет в разработке) конфигурацию Purcell ( 1403 звезды GitHub по состоянию на ноябрь 2014 года!). Несмотря на это, у меня все еще было много проблем . Стив Перселл помог мне решить все эти проблемы. (Я фактически стал его падаваном более года.) Используя его настройки и используя проблемы его репо для сообщения о проблемах, и используя его опыт, я избегал тратить много времени. Даже сегодня я все еще наблюдаю, как многие люди используют git submoduleсторонние плагины. И Стив, и я прекратили использовать git submoduleэто, потому что это может быть такой PITA .

Но если вы очень уверены в своих навыках или предпочитаете самообучаться, это не путь для вас.

чен бен
источник
2
« Клонирование установки от мастера ». Без конкретного упоминания цитируемых вами ссылок, которые могут предоставить замечательные функции или советы (я не проверял), я в целом не согласен с тем, что люди должны начинать с клонирования файлов инициализации или других установок от других. Это даже явное препятствие для политики, IIRC, поскольку это может привести к проблемам. Лучше начать с нуля и знать (и даже понимать!) Все, что вы используете в качестве базовой настройки. Конечно, нет ничего плохого в том, чтобы учиться и учиться на том, что сделали другие. Но слепое копирование файлов инициализации не рекомендуется. (Только одно мнение.)
Дрю
1
На самом деле, я пишу свою статью, потому что все еще есть много людей, которые считают, что они должны начать с нуля при настройке. как я заметил, для большинства людей это не лучший способ, а для новичков - излишне трудный. просто поиск
чен бен
1
Это является « лучшим способом для большинства людей ». Просто ищите обсуждения и советы против начала, используя чужой файл инициализации. Поиск help-gnu-emacs@gnu.org, и www.emacswiki.org, и emacs-devel@gnu.org, и даже debbugs.gnu.org. Тем не менее, нет ничего плохого в том, чтобы делиться своим файлом инициализации, чтобы служить другим в качестве пищи для размышлений. Для новичков совет не начинать таким образом; Совет не для людей, чтобы не поделиться своими собственными подходами и советами при запуске.
Дрю
1
Это из-за "предвзятости выживания". Многие люди сдаются, прежде чем они узнают emacswiki или список рассылки.
Чен бин
0

Инновационный и простой способ очистить вашу .emacs.dпапку - использовать org-modeи обрисовывать все, используя исходные блоки. Затем в вашем .emacsфайле укажите на свой config.org.

Замечательный ресурс об этом - Гарри Шварц. У него есть видео на YouTube, которое затрагивает, и пост в блоге, который объясняет детали . Я был в состоянии следовать за ним как за emacs noob и получить все настройки. Работает как шарм. 1 файл для всего моего init.

SeaDude
источник