几乎所有 Emacs 的定制都是通过 Lisp 代码完成的。你可以修改影响 Emacs 运行方式的变量,或者向 Emacs 添加新的函数(或者覆盖现有函数——用你自己的函数替换它们)。
在尝试 Emacs 定制时,你可能希望以临时的方式进行。如果你做了非常糟糕的事情,你可以直接 C-x C-c
退出 Emacs 并重新运行它。一旦你弄清楚了你想永久保留哪些更改,你可以将它们添加到你自己的 .emacs
文件中,以便它们在你每次启动 Emacs 时生效。这将在下一节中讨论。
最简单的定制是通过更改 Emacs 中变量的值来实现的。执行此操作的列表代码如下所示
(setq variable-name new-value)
其中 variable-name
是变量的名称,而 new-value
是你想赋予变量的值。(用 Lisp 术语来说,你正在将变量绑定到一个值。)lisp 中的 setq
函数类似于其他编程语言中的赋值运算符(通常是 =
)。
注意:为了简单起见,我在这里忽略了很多细节。你可能还会看到我或其他人使用 Lisp 函数 set
甚至是 setq-default
。如果你真的好奇,可以随时在 Emacs Lisp 参考中查找它们。
让我们看一下我的 .emacs
文件中的一行
(setq-default transient-mark-mode t)
变量 transient-mark-mode
控制当我标记一个区域时,该区域是否会高亮显示。在许多 GUI 应用程序中,如果你单击并拖动鼠标来选择一段文本,它会以反色或其他颜色高亮显示。如果 transient-mark-mode
变量被设置(为非 nil 值),Emacs 也会做同样的事情。
什么值?
好的。简单说明一下。大多数编程语言都有真/假值的概念。在 C/C++ 中,如果一个值是非零值,则被认为是真。在 Perl 中,非空或非零值是真。在 Lisp 中,相同的概念适用,但名称和符号不同。
真通常写成 t
,假(或空)写成 nil
。就像在其他语言中一样,任何非 nil 值都被认为是真。
要获得关于 transient-mark-mode
功能的完整描述,你可以使用在线帮助。输入 C-h v
或 M-x describe-variable
,然后输入 transient-mark-mode
。如果你像我一样懒,你可以利用 Tab 键进行变量名补全。只需输入变量名的一部分,然后按 Tab 键。如果你输入的足够多,Emacs 已经可以唯一识别它,你就会看到整个名称为你补全。
人们经常设置的另一个变量是 fill-column
。它告诉 Emacs 屏幕应该有多宽以用于自动换行(并且 auto-fill-mode
尊重此值)。要将值设置为某个荒谬的值,你可以输入
(setq fill-column 20)
但这实际上不会做任何事情。你需要告诉 Emacs 评估 你输入的表达式。要做到这一点,将光标放在表达式末尾,然后输入 C-x C-e
,它会调用函数 eval-last-sexp
,以防你关心。当你这样做时,请注意 20
(或你使用的任何值)会在屏幕底部的迷你缓冲区中回显给你。那只是你评估的表达式的返回值。
为了证明它有效,输入一两个句子。如果你碰巧启用了 auto-fill-mode
(你可能没有),你会注意到文本在第 20 列标记处换行。否则,在你输入一些内容后,输入 M-q
,它会调用函数 fill-paragraph
。然后它将执行自动换行。
你可以配置 Emacs 在你打开特定类型的文件时自动执行某些操作(就像某些 GUI 会在你点击特定文件的图标时自动启动特定应用程序一样)。例如,我可能希望 Emacs 在我每次打开扩展名为 .txt
的文件时自动切换到 text-mode
。好吧,这已经发生了。 :-) 那么让我们告诉 Emacs 在你打开名为 ``README`` 的文件时始终进入 text-mode
。
(setq auto-mode-alist (cons '("README" . text-mode) auto-mode-alist))
嗯?
无需深入研究你真的不需要知道的大量 Lisp 编程(但学习它对你没有坏处),我们只需说变量 auto-mode-alist
包含一个对列表。每对包含一个正则表达式和一个 Emacs 模式名称。如果你打开的文件与正则表达式匹配(在本例中,是字符串 README
),Emacs 就会启动你指定的模式。
上面的奇怪语法是因为我们实际上正在向该模式列表添加另一对。你不会想直接赋值给 auto-mode-alist
而不确保它已经包含的值不会丢失。
如果我希望 Emacs 在我每次打开以 .html
或 .htm
结尾的文件时自动切换到 html-helper-mode
,我会将此添加到我的 .emacs 文件中
(setq auto-mode-alist (cons '("\\.html$" . html-helper-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("\\.htm$" . html-helper-mode) auto-mode-alist))
可能性是真正无限的。
在你花了一些时间使用 Emacs 并对定制可以为你做什么有一个基本概念之后,你可能想要永久定制一些东西(或者至少在你改变主意之前)。如果你发现自己每天都在使用 Emacs,你也会注意到你的 .emacs
文件随着时间的推移变得越来越大。这是一件好事,因为它意味着你已经弄清楚如何让 Emacs 按照你想要的方式工作。遗憾的是,更多软件产品不允许你这样做。
如果你还没有猜到,每次你启动 Emacs 时,它都会在你的主目录中查找名为 .emacs
的文件。你的 .emacs
文件是你应该放置任何你想自动运行的 Lisp 代码的地方,包括我们在这里处理的这类定制。
我的 .emacs
文件中的另一个例子
(setq inhibit-startup-message t)
变量 inhibit-startup-message
控制 Emacs 在启动时是否显示欢迎消息。过了一段时间,我厌倦了看到它(因为我知道如何找到帮助等等),所以我开始寻找一种关闭它的方法。
作为一个练习,尝试创建你自己的 .emacs
文件并将该行添加到其中。然后退出并重新启动 Emacs。你应该不会看到欢迎消息。
通常,当你阅读关于 Emacs 模式(或软件包)的信息时,文档会建议一些要添加到你的 .emacs
文件中的代码,以便使该模式或软件包以特定方式工作。
GNU Emacs FAQ (C-h F
) 包含一些与 .emacs
文件相关的条目,你可能会觉得有用。
随着 Emacs 的普及和持续发展,最终有人说“必须有一种更好的方法让新手用户定制他们的 Emacs。”于是 customize
就诞生了。
Customize 提供了一种更直观的定制 Emacs 部分内容的方法。要试用它,可以访问你的“帮助”菜单中的“Customize”子菜单,或者输入 M-x customize
。
Customize 将定制分组为逻辑组,例如“编辑”、“编程”、“文件”等等。一些组包含子组。
如果你使用 customize 界面进行更改,Emacs 会将更改保存到你的 .emacs
文件中。这非常方便,因为你可以轻松检查(和更改)它为你所做的更改。
我不使用 Customize 界面,所以我不能说更多关于它的信息。.
像任何表现良好的 X 应用程序一样,Emacs 尊重你的 X 资源。这意味着你可以控制初始颜色、几何形状和其他 X 特定的东西,就像你可以使用 xterm
、nxterm
或其他任何东西一样。
这是我的 ~/.Xdefaults
文件中的相关部分
emacs*Background: DarkSlateGray emacs*Foreground: Wheat emacs*pointerColor: Orchid emacs*cursorColor: Orchid emacs*bitmapIcon: on emacs*font: fixed emacs.geometry: 80x25
有关 X 资源的更多详细信息,请参阅你的 X 手册页。
Chris Gray ( cgray4@po-box.mcgill.ca) 还指出
在 Debian 中,~/.Xdefaults
似乎没有被使用。但是,Debian 用户可以将你给出的内容放在/etc/X11/Xresources/emacs
中,他们就可以拥有他们在使用 RedHat 时拥有的漂亮颜色。