我可以使用org-mode来构造我的.emacs或其他.el配置文件吗?


48

我的.emacs配置文件越来越大,我希望通过添加标题,子标题并能够像我使用Emacs一样隐藏或显示它们来获得更好的概述和结构org-mode

我注意到我也org-mode可以在.emacs缓冲区中激活,并且可以添加标题并折叠它们。但是,如果添加org-mode标题(例如,以一个或多个星号开头的行),Emacs / Aquamacs是否仍可以从文档中加载Elisp代码?

我可以将所有内容保存在一个文件中,还是必须拥有一个.*org文件,然后定期将Elisp代码导出到另一个文件中?

Answers:


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 2014年

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 2015年

1
如果要使用Melpa上可用的最新版本的org(9),请记住不要在org文件中配置与org相关的内容。我正在做这个github.com/cescoferraro/dotfiles/blob/master/src/emacs.d/…–
CESCO

23

如果只需要选择性地显示部分和标题之间的导航,则不需要组织模式。您只需要大纲模式。大纲模式基本上是组织模式的标题级别和部分可见性管理。实际上,组织模式最初是作者对“大纲”模式的扩展,并且成长,成长,成长……即使到今天,它org-mode也源自outline-mode

大纲模式既作为主要模式又作为次要模式存在。次要模式可以在任何主要模式下使用。您可以将其配置为使用与程序语法兼容的标头格式,许多主要模式都可以通过将outline-regexp变量设置为与标头的开头相匹配的regexp来实现。例如,这是Emacs Lisp模式下的默认值:

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

即,节标题以三个或更多分号和一个空格开头,或者在左页边空白处加一个括号。变量outline-level包含确定标题深度的函数名称;默认值是匹配的字符串的长度outline-regexp,Emacs Lisp模式会覆盖它以给(和分配更大的深度;;;###autoload

如果您不喜欢默认的标头格式,请outline-regexp文件局部变量声明中设置变量。这就是我使用的—我的节头全部由;;;星号组成,后面是经典的星号序列:

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

如果要在加载文件时自动打开“大纲”次要模式,请在“本地变量”部分添加以下行—请注意,这将警告您有关Emacs≤23.x中不安全代码的警告。

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

大纲次要模式的命令C-c @默认情况下使用相当不方便的前缀。我将其移至M-o(我从不使用facemenu绑定),您可能更喜欢另一个键,或者复制Org模式的绑定(与Outline模式有很大的出入)。


4
我第二。组织非常棒,但是为此,您只需要大纲模式即可。如果将其与outshine-mode,outorg和navi-mode结合使用,它将变得更好。使用outshine和outorg,您无需使用org-babel及其缠结到单独的文件中即可获得漂亮的org-mode风格的注释。 是elisp代码的要点,我使用它来使Python,elisp和shell代码正常工作并在大纲/外观中很好地折叠。
blujay 2015年

14

精巧的编程使您获得最大的收益org-mode通过org-babel支持它。@malabarba的博客中解释了两种可能的解决方案

最简单的方法是加载组织模式,然后使用其解缠功能加载有文化的Emacs配置:

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

另外(为了避免完全加载组织),可以使用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: overviewor show allcontentsoptions。
博士学位

@doctorate:组织模式对折叠的支持也建立在大纲模式的基础上。我们不能仅使用指令:因为与org-mode相比,elisp #中的注释不是注释符号,因此emacs的内置elisp解释器在命中#+STARTUP或类似内容时会感到困惑。(或者我是否误解了您的评论?)
Adobe

我的意思是,有一种方法可以在STARTUP内部实现指令orgstruct-mode,例如,这是一个R缓冲区,但思路相同:emacs.stackexchange.com/a/8065/2443
博士

3

在以下SO答案中,您将看到如何执行此操作,使用一个或多个组织文件的示例项目,使用Cask和指向文档的链接有什么好处。

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

几个月前,我将配置转到了组织,但我对此并不完全满意。它需要一些配置和组织手册的阅读才能有一个有用的组织文件,使编辑elisp代码变得容易。一个必须启用src块字体化(默认情况下处于关闭状态->使用每个文件变量),检查其他模式是否与编辑src块不冲突(自动填充模式),等等。一个人不想使用Cc (backtick) (org-edit-src-block`)来编辑src块。而且它为调试提供了一些便利。

我的建议是:首先将您的init文件分解成小的elisp片段,在那里尝试一些缩小的包,helm-swoop用于快速导航,然后考虑使用org-mode


1

我最近花了一些时间来做到这一点。我最终得到了一个配置-用org-mode维护-使用'use-package'自动安装丢失的软件包-是那种自动安装的github存储库(无耻的插件:https : //github.com / pascalfleury / emacs-config

我通过克隆存储库并在〜/ .emacs et voila中添加了一行来“引导”了几台机器(Linux和Mac)。我可以随意设置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.