Організуйте вміст ~ / .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.


16
Також немає особливих причин не розділити код на кілька файлів. Це залежить від того, що ви хочете, щоб групування речей означало - як ви хочете, щоб воно поводилося. І це може залежати від того, наскільки велика велика. І це може залежати від того, поділяються фрагменти вашого коду з іншими, як, наприклад, бібліотеки.
Дрю

2
Piggybacking на коментарі @ Drew, користувач може захотіти мати різні конфігурації для різних версій та середовищ emacs та відповідно завантажити відповідний elisp. Це сказав, що мені подобається порада щодо сторінки.
Харві

3
@Harvey: Пагинація та використання окремих файлів - це незалежні способи впорядкування тексту. Можна використовувати обоє, очевидно. Я використовую пагинацію у всіх своїх бібліотеках, для окремих розділів. Але я також маю окремі бібліотеки (файли).
Дрю

1
@jch Якщо ви використовуєте цей стиль, ви також можете увімкнути режим малого контуру або подібну функцію, щоб дозволити складання розділів і функцій. Складання всіх заголовків верхнього рівня дає хороший огляд усіх розділів у вашій конфігурації Emacs.
місячник

@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 - це не пакетний пакет, це сховище пакунків. 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пошуку чогось тощо. Крім того, простіше додати кілька рівнів до вашої організації.


1
На даний момент я це роблю, хоча не думав використовувати org-babel-load-file. Солодке! (Приклади: github.com/vermiculus/dotfiles/blob/… , github.com/larstvei/dot-emacs )
Шон

Детальніше про використання org-mode для конфігурації Emacs з цього питання: Чи можна використовувати org-режим для структури мого .emacs або іншого файлу конфігурації .el?
ShreevatsaR

9

Просто перемістіть фрагменти коду init.elдо окремих файлів (бібліотек), які ви потім require. (Використовуйте provideв бібліотеках, що є requireд.) Покладіть ці файли куди завгодно, і оновіть 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 було встановлено вручну, тоді як emacs-eclim-20140809.207 було встановлено elpa. Це обидва пакети? Якщо вони є, чи варто їх розмістити під одним підкаталогом ~ / .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

Гм. Принаймні, люб’язно, ви, напевно, повинні сказати, що код, який ви перекочували дослівно, був написаний targzeta . Узагальнення перехресної сторінки не означає плагіатування її змісту. (Звичайно, якщо ви перебуваєте targzeta, то немає ніяких проблем , по- видимому.)
Drew

Знову ти прав, відредагований. Спасибі.
Boccaperta-IT

Спасибі. (Я знаю, що потрібно трохи часу, щоб зробити це правильно, але це допомагає всім трохи більше.)
Дрю

5

Очевидно, існує більше ніж один спосіб шкірити цього конкретного кота. Моя нинішня улюблена - використання outline-minor-modeз підкладкою . Витяг:

;; * 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
Я почав з контуру-мінорного режиму, але вважав, що палітурки клавіш є занадто болючими, і ніколи не знаходив часу, щоб зробити щось з цього питання сам. Тож я перейшов у режим orgstruct після виявлення org-mode, але потім дізнався про перекриття. Блаженство! В даний час я використовую контур + 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-гак. Потім додайте у розділи файлів «ясніппет», «упаковка», «режим java» тощо. Це добре підходить для моїх 1000 рядків коду (коментарі включені).

EDIT: Нарешті, я перемикаюся між розділами за допомогою керма-імені. Насправді керма зачіпляється до нормальної імені, функціонує автоматично, тому все, що мені потрібно

       (local-set-key (kbd "C-*") 'imenu)

Ви можете використовувати локальну змінну файлу замість гака.
ЯнгФрог

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

Чому слід за майстром? Основним моментом мого "Master emacs за один рік" є те, що новачки можуть таким чином ефективно уникнути встановлення накладних витрат та "gotchas".

Я розумію, що багато людей не згодні зі мною, але ось мій випадок (детально в моїй статті ):

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

Але якщо ви дуже впевнені у своїх навичках або багато віддаєте перевагу самонавчанню, це не шлях для вас.


2
" Клонування налаштування від головного ": Без особливого врахування посилань, які ви цитуєте, які можуть надавати чудові функції або поради (я не перевіряв), я взагалі не погоджуюся з тим, що люди повинні починати з клонування init-файлів чи інших налаштувань у інших. Це навіть була відверто відвертою політикою, IIRC, оскільки це може призвести до проблем. Краще почати з нуля і бути в курсі (і навіть розуміти!), Що б ви не використовували в якості базової установки. Звичайно, немає нічого поганого в тому, щоб вчитися та вчитися тому, що зробили інші. Але сліпо копіювати файли init не бажано. (Лише одна думка.)
Дрю

1
Насправді я пишу свою статтю, тому що все ще багато людей вважає, що вони повинні починатись з нуля під час налаштування. Це не найкращий спосіб для більшості людей, як я зауважував, і надмірно важкий спосіб для новачків. просто пошук
Чень Бін

1
Це є « кращим способом для більшості людей ». Просто шукайте дискусії та поради проти початку, використовуючи чужий файл init. Пошук help-gnu-emacs@gnu.org, і www.emacswiki.org, і emacs-devel@gnu.org, і навіть debbugs.gnu.org. З цього приводу немає нічого поганого в тому, щоб ділитися файлами init одного, щоб служити іншим як їжу для роздумів. Рада для новачків не починати так; порада не для людей, щоб не ділитися власними підходами та порадами щодо запуску.
Дрю

1
Це через "упередженість уцілілих". Багато людей відмовляються, перш ніж знають emacswiki або список розсилки.
Чень бен

0

Інноваційний та простий спосіб очищення вашої .emacs.dпапки - використовувати org-modeта окреслити все за допомогою вихідних блоків. Потім у своєму .emacsфайлі вкажіть на ваш config.org.

Чудовим ресурсом в цьому є Гаррі Шварц. У нього є відео на YouTube, яке торкається, і повідомлення в блозі, в якому пояснюються деталі . Мені вдалося прослідкувати за ним як emacs noob і отримати все налаштування. Працює як шарм. 1 файл на весь мій init.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.