Могу ли я использовать org-mode для структурирования моего .emacs или другого файла конфигурации .el?


48

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

Я заметил, что я могу активировать org-modeтакже в .emacsбуфере и что можно добавить заголовки и свернуть их. Но сможет ли Emacs / Aquamacs по-прежнему загружать код Elisp из документа, если я добавлю org-modeзаголовки (т. Е. Строки, начинающиеся с одной или нескольких звездочек)?

Могу ли я иметь все это в одном файле или мне нужно иметь один .*orgфайл, а затем регулярно экспортировать код Elisp в другой файл?

Ответы:


46

Да, вы, конечно, можете, вы можете использовать org-babel-load-fileдля этого.

В вашем init.el, поставьте следующее:

(require 'org)
(org-babel-load-file
 (expand-file-name "settings.org"
                   user-emacs-directory))

(Я использую ~ / .emacs.d / settings.org, но это личное предпочтение). В settings.orgфайле вы можете расположить его так, как захотите, обернув elisp в:

* Turn off menu bar
#+BEGIN_SRC emacs-lisp
(menu-bar-mode -1)
#+END_SRC

Когда вы запустите Emacs, он автоматически определит, изменился ли файл settings.org, и при необходимости запустите его, чтобы получить settings.elфайл, который будет загружен.


1
Как бы вы изменили это, чтобы загрузить последнюю orgверсию из elpa вместо того, orgчто доступно в чистом emacs? Кажется, packageкод инициализации нужно извлечь settings.orgи вставить в init.el?
mankoff

3
@mankoff Это правильно, это мое init.el: (require 'package) (package-initialize) (setq custom-file "~/.emacs.d/custom.el") (when (file-exists-p custom-file) (load custom-file)) (require 'org) (org-babel-load-file (expand-file-name "settings.org" user-emacs-directory))
Lee H

2
@mankoff Извините за плохое форматирование, у меня есть более читаемая версия в верхней части writequit.org/org/settings.html
Lee H

2
Есть более чем несколько примеров грамотных конфигов Emacs. Возможно, пришло время начать индекс. Вот мой например github.com/grettke/home
grettke

1
Помните, что не следует настраивать связанные с org вещи внутри файла org, если вы хотите использовать последнюю версию org (9), доступную на Melpa. Я делаю это github.com/cescoferraro/dotfiles/blob/master/src/emacs.d/…
CESCO

23

Если все, что вам нужно, это выборочное отображение разделов и навигация между заголовками, вам не нужен режим Org. Все, что вам нужно, это режим Outline . Режим Outline - это, в основном, уровень заголовка и управление видимостью раздела в режиме Org. Фактически, режим Org изначально был авторским расширением для режима Outline, и рос, и рос, и рос… Даже сегодня org-modeпроисходит от outline-mode.

Режим Outline существует как основной и второстепенный режимы. Дополнительный режим можно использовать в любом основном режиме. Вы можете настроить его для использования формата заголовка, который совместим с синтаксисом вашей программы, и многие основные режимы делают это, устанавливая для outline-regexpпеременной регулярное выражение, соответствующее началу заголовка. Например, это значение по умолчанию в режиме Emacs Lisp:

";;;\\(;* [^ \t\n]\\|###autoload\\)\\|("

то есть заголовки разделов начинаются с трех или более точек с запятой и одного пробела или открывающей скобки в левом поле. Переменная outline-levelсодержит имя функции для определения глубины заголовка; значение по умолчанию - длина строки, с которой совпадает outline-regexp, и режим Emacs Lisp переопределяет ее, чтобы назначить большую глубину (и ;;;###autoload.

Если вам не нравится формат заголовка по умолчанию, установите переменную outline-regexpв объявлении локальной переменной файла . Это то, что я использую - мои заголовки разделов состоят из ;;;классической последовательности звезд:

;;; Local Variables:
;;; outline-regexp: ";;;\\*+\\|\\`"
;;; End:

Если вы хотите, чтобы вспомогательный режим Outline автоматически включался при загрузке файла, добавьте следующую строку в раздел Local Variables - обратите внимание, что это предупредит вас о небезопасном коде в Emacs ≤23.x.

;;; eval: (outline-minor-mode 1)

Команды для режима вспомогательного контура C-c @по умолчанию используют довольно неудобный префикс. Я перемещаю его в M-o(я никогда не использую привязки FaceMenu), вы можете предпочесть другую клавишу или реплицировать привязки режима Org (которые немного отличаются от режима Outline).


4
Я второй это. Org отлично, но для этого все, что вам нужно, это контурный режим. И это станет еще лучше, если вы объедините его с режимами outshine, outorg и navi-mode. С outshine и outorg вам не нужно использовать org-babel и его переплетение в отдельные файлы, чтобы получить хорошие комментарии в стиле режима org. Вот суть кода elisp, который я использую для того, чтобы Python, elisp и шелл-код работали и красиво складывались в контур / затенение.
Блюджей

14

Грамотное программирование поможет вам в этом, org-mode поддерживает его через org-babel . Два возможных решения описаны в блоге @malabarba :

Самый простой способ - загрузить org-mode, а затем использовать его распутывающую функцию для загрузки грамотной конфигурации Emacs:

(require 'org)
(org-babel-load-file
 (expand-file-name "emacs-init.org"
                   user-emacs-directory))

В качестве альтернативы (чтобы избежать полной загрузки org), распутывание можно выполнить с помощью примитивов Emacs Lisp:

(defvar endless/init.org-message-depth 3
  "What depth of init.org headers to message at startup.")

(with-temp-buffer
  (insert-file "~/.emacs.d/init.org")
  (goto-char (point-min))
  (search-forward "\n* init.el")
  (while (not (eobp))
    (forward-line 1)
    (cond
     ;; Report Headers
     ((looking-at
       (format "\\*\\{2,%s\\} +.*$"
               endless/init.org-message-depth))
      (message "%s" (match-string 0)))
     ;; Evaluate Code Blocks
     ((looking-at "^#\\+BEGIN_SRC +emacs-lisp.*$")
      (let ((l (match-end 0)))
        (search-forward "\n#+END_SRC")
        (eval-region l (match-beginning 0))))
     ;; Finish on the next level-1 header
     ((looking-at "^\\* ")
      (goto-char (point-max))))))

6

Еще один голос за контурный режим. Например, для упорядочивания .emacsя использую следующий синтаксис:

;;; HEADING:

важные части ;;;и:\n

(add-hook 'emacs-lisp-mode-hook 
          (lambda ()
            (make-local-variable 'outline-regexp)
            (setq outline-regexp "^;;; ")
            (make-local-variable 'outline-heading-end-regexp)
            (setq outline-heading-end-regexp ":\n")
            (outline-minor-mode 1)
            ))

Вот пример .emacs:

;;; preliminaries:
;; load-path:
;; This little monster adds all non-dot dirs to Your load path recursively
(let* ((my-lisp-dir "~/.emacs.d/site-lisp/")
       (default-directory my-lisp-dir)
       (orig-load-path load-path))
  (setq load-path (cons my-lisp-dir nil))
  (normal-top-level-add-subdirs-to-load-path)
  (nconc load-path orig-load-path))

;; ...

;;; modes:

;; python-mode:
(setq py-install-directory "~/.emacs.d/site-lisp/python-mode")
(add-to-list 'load-path py-install-directory)
(require 'python-mode)

;; ...

;;; customizations:
(custom-set-variables
 '(blink-cursor-mode nil)
)

;; ...

Нужно включить, outline-minor-modeа затем два необходимых нажатия клавиш:

  • C-c @ C-t - показать структуру верхнего уровня

    выше становится

    ;;; preliminaries:
    ;;; modes:
    ;;; customizations:
    
  • C-c @ C-a - показать все снова

Типичное использование - показать структуру верхнего уровня, перейти к интересующему заголовку и снова показать все.


1
Можем ли мы использовать директивы как в режиме org: например, #+STARTUP: overviewили show allили contentsпараметры.
докторантура

@doctorate: поддержка режима сворачивания в org-режиме также встроена в контур-режим. Мы не можем использовать только директивы: потому что в отличие от org-mode - в elisp #это не знак комментария, поэтому встроенный в emacs интерпретатор elisp будет сбит с толку, когда он нажмет #+STARTUPили что-то в этом роде. (или я вас неправильно понял?)
Adobe

Я имею в виду, есть ли способ реализовать STARTUPдирективу внутри orgstruct-mode, например, это был буфер R, но та же идея: emacs.stackexchange.com/a/8065/2443
докторантура

3

В следующем ответе SO вы увидите, как это сделать, например, проекты, использующие один или несколько org-файлов, каковы преимущества использования Cask и ссылки на документацию.

https://stackoverflow.com/questions/25430029/whats-the-best-way-to-package-my-emacs-installation-packages-and-config-so-tha/25430745#25430745

Я переключил свой конфиг на org несколько месяцев назад, и я не совсем доволен им. Требуется некоторая настройка и чтение руководства org, чтобы иметь полезный файл org, который облегчает редактирование кода elisp. Нужно включить распознавание блоков src (по умолчанию отключено -> использовать переменную для каждого файла), проверить, не конфликтуют ли другие режимы при редактировании блоков src (режим автозаполнения) и т. Д. Нельзя использовать Cc (backtick) (org-edit-src-block`) для редактирования блока src. И это немного мешает отладке.

Мой совет: начните с разбивки файла инициализации на небольшие части elisp, попробуйте сузить пакет, используйте его helm-swoopдля быстрой навигации, а затем подумайте об использовании org-mode.


1

Недавно я потратил некоторое время, чтобы сделать именно это. Я получил конфигурацию, которая - поддерживается в режиме org - использует 'use-package' для автоматической установки отсутствующих пакетов - это репозиторий github такого рода автоматической установки (бесстыдный плагин: https://github.com / pascalfleury / emacs-config )

Я «загрузил» несколько машин (Linux и Mac), клонировав репозиторий и добавив одну строку в ~ / .emacs et voila. Я настроен так, как мне нравится.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.