Чи можна використовувати org-режим для структурування мого .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))
Лі Х

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 / ...
Сеск

23

Якщо ви хочете лише вибіркове відображення розділів та навігації між заголовками, вам не потрібен режим Org. Все, що вам потрібно, це режим Контур . Режим контуру - це, головним чином, управління рівнем заголовка та роздільної здатності розділу Org. Насправді, Org mode спочатку були розширенням автора на режим Outline, і зростали, і зростали, і зростали… Навіть сьогодні org-modeце похідне outline-mode.

Режим контуру існує і як основний режим, і як другорядний режим. Незначний режим можна використовувати в будь-якому головному режимі. Ви можете налаштувати його на використання формату заголовка, сумісного з вашим синтаксисом програми, і багато основних режими роблять це, встановивши outline-regexpзмінну на регулярний вираз, який відповідає початку заголовка. Наприклад, це значення за замовчуванням у режимі Emacs Lisp:

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

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

Якщо вам не подобається формат заголовка за замовчуванням, встановіть змінну outline-regexpв локальній декларації змінної файлу . Це те, що я використовую - мої заголовки розділів складаються з ;;;класичної послідовності зірок:

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

Якщо ви хочете, щоб режим Outline minor автоматично включався під час завантаження файлу, додайте наступний рядок у розділі Локальні змінні - зауважте, що це попередить вас про небезпечний код у Emacs ≤23.x.

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

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


4
Я другий це. Орган - це чудово, але для цього все, що вам потрібно, - це контурний режим. І це стає ще краще, якщо поєднувати його з режимом outshine, outorg та navi-mode. За допомогою outshine та outorg вам не потрібно використовувати org-babel та його переплутування в окремі файли, щоб отримати хороші коментарі в стилі org-mode. Ось суть коду elisp, який я використовую для того, щоб Python, elisp і оболонка оболонки працювали і красиво складалися в контур / контур.
blujay

14

Грамотне програмування веде вас найбільше, орг-режим підтримує це через org-babel . У блозі @malabarba пояснено два можливі рішення :

Найпростіший спосіб - завантажити org-режим, а потім використовувати його функцію розкручування для завантаження грамотної конфігурації 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
ми можемо використовувати директиви , як в орг-режимі: наприклад , #+STARTUP: overviewчи show allабо contentsопції.
докторантура

@doktori: підтримка складання org-режиму також складається на вершині контуру. Ми не можемо використовувати лише директиви: адже на відміну від org-mode - в elisp #- це не знак коментаря, тому вбудований інтерпретатор elisp буде заплутаний, коли він потрапляє на #+STARTUPщось подібне. (чи я вас неправильно зрозумів?)
Adobe

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

3

З наступного відповіді ТА ви побачите, як це зробити, приклади проектів, що використовують один єдиний файл 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. І це стає трохи на шляху до налагодження.

Моя порада: почніть з розбиття файлу init на невеликі шматки, спробуйте там якийсь звужуючий пакет, використовуйте 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.