组织〜/ .emacs.d / init.el和〜/ emacs.d?的内容?


28
  1. 当我们~/.emacs.d/init.el出于各种目的(针对python-mode,emacs-eclim,for ...)添加越来越多的行时,文件变得冗长且可读性较差。有没有一种方法可以帮助组织其内容?
  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/

Answers:


32

人们使用较少的编辑器喜欢将其代码拆分为多个文件。如果您使用的是Emacs,则没有必要这样做:只需使用一个大文件,然后将其分成多个部分即可。

每个部分应以

^L
;;; title of the section

^L通过键入在其中插入字符的位置C-q C-l。然后,您可以使用C-x ]forward-page)或C-x n pnarrow-to-page)之类的命令浏览文件。有关更多信息,请参见Emacs手册的25.4(页)


16
也没有特殊原因将代码拆分为多个文件。这取决于您希望将事物分组在一起意味着什么-您希望其行为如何。它可能取决于LARGE有多大。并且它可能取决于您的代码片段是否与其他人(例如库)共享。
提请2014年

2
@带@Drew的注释,用户可能希望针对不同的emacs版本和环境具有不同的配置,并相应地加载相关的elisp。就是说,我喜欢分页技巧。
哈维

3
@Harvey:分页和使用单独的文件是组织文本的独立方法。显然,您可以同时使用两者。我在所有库中都使用分页来分隔各个部分。但是我也有单独的库(文件)。
提请2014年

1
@jch如果使用此样式,则可能还希望启用“大纲次要模式”或类似功能,以允许折叠部分和功能。折叠所有顶级标题可以使您对Emacs配置中的所有部分都有一个很好的概览。
lunaryorn 2014年

@lunaryorn,我已经尝试过了,但是我发现它分散了注意力-在大多数情况下,我发现页面移动命令足够用,只是偶尔需要缩小范围。也许我.emacs.wl还不够长。
2014年

20

一种典型的方法是将您的.emacs文件拆分为多个单独的文件。例如,您可以将所有Web内容移至其中~/.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吗?我可以将它们移到其他地方吗?
蒂姆(Tim)

2
您可以通过设置custom-file变量来为Customize变量指定一个单独的文件。来源
Kaushal Modi 2014年

@Tim:package.el管理的目录是elpa。Elpa不是Lisp软件包,而是软件包存储库。Package.el仍会在目录elpa中添加它安装的所有软件包(例如从elpa或从另一个存储库-例如,在您看来,eclim和s都不来自elpa)。是的,您不必担心该目录的内容。
T. Verron 2014年

(无法再编辑)我上面写的并不完全正确:elpa是软件包档案的格式,package.el是软件包管理器。对于用户而言,两者之间没有真正的区别。我上面的评论使elpa与GNU elpa失之交臂,后者是可用的elpa软件包之一(也是唯一的官方软件包)。
T. Verron 2014年

16

如果您喜欢组织模式,则可以使用它来组织您的工作,.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
肖恩奥尔雷德

有关在此问题上为Emacs配置使用组织模式的更多信息:我可以使用组织模式来构造.emacs或其他.el配置文件吗?
ShreevatsaR

9

只需将代码从init.el移到单独的文件(库)中,然后即可require。(provide在要使用的库中使用require。)将那些文件放置在所需的位置,并进行相应的更新load-path


谢谢。(1)例如?(2)您建议组织〜/ .emacs.d /吗?
蒂姆(Tim)

1
“组织内容~/.emacs.d/?”的意思是什么?您没有提供所需的说明。您不必将所有内容都放在一个目录中。您可以将所需的内容放在任意位置,然后进行相应的修改load-path。如果某些程序/工具仅包含在东西~/.emacs.d/(也就是说,如果你不能告诉它在哪里放的东西),然后将它放在你想要这个程序/工具完成后。
德鲁

1
“举例”是什么意思?您想要一个什么例子?(require 'foobar)是使用的示例require(add-to-list 'load-path "/my/lisp/dir")是修改的示例load-path(provide 'foobar)是使用的示例provide
2014年

通过“组织〜/ .emacs.d /的内容,我作为人类可以更好地理解它,而不是让emacs理解。这是一种习惯,就像组织橱柜,抽屉,书架一样。例如python -mode.el-6.1.3是手动安装的,而elmacs-eclim-20140809.207是elpa安装的。这两个软件包都是吗? /?
蒂姆(Tim)

您是可以回答什么组织可以帮助您更好地理解它的人。(Emacs一无所知。)使用您喜欢的任何文件夹结构。称它们为橱柜,抽屉,书架或文件夹。同样,您init.el可以加载位于任何地方的库,而不仅限于~/.emacs.d/
提请2014年

7

我使用在Emacs Wiki:Load目录中找到的targzeta的建议。

基本上我有一个〜/ .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")

希望我们提供不仅仅是链接的更多信息-例如,该链接上的内容的摘要说明。
2014年

您说得对,我编辑了答案。
Boccaperta-IT 2014年

嗯 至少出于礼貌,您可能应该说您逐字记录的代码是由targzeta编写的。总结交叉引用的页面并不意味着窃其内容。(当然,如果您塔格萨塔,那么大概没有问题。)
Drew

您又是正确的,已编辑。谢谢。
Boccaperta-IT 2014年

谢谢。(我知道做对它需要花费一些时间,但是对每个人都有帮助。)
Drew

5

显然,有多种方法可以使这只猫皮化。我目前最喜欢的是outline-minor-modeoutshine一起使用。摘抄:

;; * 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-mode,但是后来我发现了一些令人惊奇的地方。极乐!我目前使用我自己的主模式对elisp,乳胶和其他文件进行的所有结构都使用outline + outshine,而对各种笔记使用org-mode。
Harald Hanche-Olsen 2014年

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,我用于管理加载了哪些软件包以及为每个软件包设置了哪些自定义设置。大多数的只是时间hackelpa需要更新,其他文件夹往往是一次性的包装,我想测试或使用简单,但并不需要负载(甚至袖手旁观)。

custom.el 用于自定义设置,我不希望使用(即使使用,也不要版本化)。

defaults.el用于常规配置(菜单栏,字体,编码等),然后可以在任何.el文件中覆盖该常规配置,user-config/以使系统可以按我期望的方式工作,但可以根据环境进行调整。

我以前曾试图保持functionsmacrosadvice分别包装,以允许内容之间的描绘,而是跑进定义/要求问题,所以已经把这些放回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。然后将“ yasnippet”,“ packaging”,“ java mode”等部分添加到文件中。这对于我的1000行代码(包括注释)非常有用。

编辑:最后,我在与helm-imenu的部分之间切换。实际上,头盔会自动钩入正常的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用于代码而非配置:从非标准源位置而不是从packages目录加载我自己的库,并定义各种功能(大多数情况是在没有适当软件包的情况下进行复制和修改);这是.emacs行数的另一大减少。

    (load "~/lg-lib")
    
  • 主要的.emacs文件:没有庞大的代码和庞大的自定义变量,它包含require对程序包的调用,不属于Customize系统的变量,以及用于加载和初始化程序包的各种函数调用。我通过仔细地将属于同一软件包或功能的所有行放在一起,并进一步将软件包的加载和与软件包相关的设置与“核心”功能区分开来“组织”它。一个相当有代表性的节选:

    (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安装的软件包,Steven Purcell的设置包括

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”的主要要点是,新手可以因此有效地避免设置开销和“陷阱”。

我了解很多人不同意我的看法,但这是我的情况(在我的文章中详细介绍):

我通过使用Purcell备受推崇的(截至2014年11月,已有1403个 GitHub明星!),稳定(开发5年)的配置开始使用Emacs 。尽管从那开始,我仍然有很多问题。史蒂夫·珀塞尔(Steve Purcell)帮助我解决了所有这些问题。(实际上我已经成为他的Padawan了一年多。)通过使用他的设置,并使用他的回购协议中的问题来报告问题,并利用他的经验,我避免浪费很多时间。即使在今天,我仍然观察到许多人正在使用git submodule这些插件来管理第三方插件。我和史蒂夫都放弃了使用git submodule因为它可能是这样的PITA

但是,如果您对自己的技能很有信心,或者更喜欢自学,那么这不是您的路。


2
从母版克隆安装程序 ”:在没有特别注意您引用的引用的情况下,这些引用可能会提供出色的功能或建议(我尚未检查),我通常不同意人们应该从其他人克隆init文件或其他安装程序。这甚至是IIRC明确禁止的政策,因为它可能导致问题。不管您用作基本设置如何,最好从头开始并意识到(甚至理解!)。当然,学习和学习别人的所作所为没有错。但是不建议盲目的复制初始化文件。(只有一种意见。)
Drew

1
实际上,我写我的文章是因为仍然有很多人认为他们应该从头开始。正如我所观察到的那样,对于大多数人来说,这并不是最好的方法,对于新手来说,这并不是不必要的困难方法。只是搜索
chen bin

1
对大多数人来说最好的方式 ”。只需搜索讨论和建议,以防止使用别人的init文件开始使用。搜索help-gnu-emacs@gnu.org,和www.emacswiki.orgemacs-devel@gnu.org甚至debbugs.gnu.org。就是说,共享一个人的init文件并为他人提供思想服务没有错。建议初学者不要以这种方式开始。建议不要让人们不要分享自己的启动方法和技巧。
Drew

1
这是因为“生存偏见”。许多人在知道emacswiki或邮件列表之前就放弃了。
陈斌

0

清理.emacs.d文件夹的一种新颖而简单的方法是org-mode使用源代码块并概述所有内容。然后,在.emacs文件中,指向config.org

Harry Schwartz是一个很好的资源。他有感人的youtube视频解释详细内容博客。我能够将其作为emacs菜鸟跟随并进行所有设置。奇迹般有效。我的整个档案有1个init

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.