Emacs
Emacs 是一个可扩展、可定制、自文档化的实时显示编辑器。Emacs 的核心是一个Emacs Lisp 解释器,它是实现 Emacs 大部分内置功能和扩展的语言。GNU Emacs 使用 GTK 作为其默认的 X 工具包,但它在 CLI 环境下同样工作良好。
安装
安装以下软件包之一
- emacs - 稳定版;
- emacs-nox - 无 GUI;仅在终端模拟器上运行;
- emacs-wayland - PGTK 已启用;
- 可以搜索其他变体,例如 emacs-lucidAUR 提供 Lucid(Athena)工具包代替 GTK。
如果您希望 Emacs 的拼写检查能正常工作,还需要安装 aspell 和一个 aspell 语言包,例如 aspell-en。
用法
在启动 emacs 之前,您应该知道如何关闭它(尤其是在终端中运行时):使用 Ctrl+xCtrl+c 组合键。如果您是 Emacs 新手,建议完成官方教程。要做到这一点,首先启动 Emacs,然后从启动屏幕选择“Tutorial”(教程),或者按 Ctrl+h 然后按 t。
要启动 Emacs,请运行
$ emacs
或者,从控制台使用
$ emacs -nw
或者,为了快速加载(无 .emacs)并在 CLI 中进行编辑
$ emacs -Q -nw
如果您安装了 nox 版本,emacs 和 emacs -nw 将是相同的。
也可以提供文件名来立即打开该文件
$ emacs filename.txt
无颜色
默认情况下,Emacs 会启动一个颜色主题,将超链接显示为深蓝色。要在文本终端中启动 Emacs 而不带任何颜色主题或方案
$ emacs -nw --color=no
这将导致所有文本显示为终端的前景色——通常是黑底白字,或白底黑字。
作为守护进程
为了避免每次 Emacs 启动时都重新加载 Emacs 配置文件,您可以将 Emacs 作为守护进程运行
$ emacs --daemon
然后,您可以通过运行以下命令连接到守护进程:
$ emacsclient -nc
这会创建一个新的框架-c(如果您更喜欢在终端中使用,则使用-t),并且不会占用终端-n(--no-wait)。请注意,某些程序(如 Mutt 或 Git(用于提交消息))会等待编辑器完成,因此您不能使用-n参数。如果您的默认编辑器设置为使用它,则必须为这些程序指定备用编辑器(*例如*:emacsclient -a "" -t)。
作为 systemd 服务
Emacs 26.1 中包含了一个 systemd 服务单元。该单元随 Emacs 一起安装,但安装 Emacs 后,必须将其启用为用户单元(而非系统范围的单元)。
$ systemctl --user enable --now emacs
启动服务后,Emacs 即可使用。
如果您想通过 emacsclient 在 Wayland 上启动图形化 Emacs 框架,则需要一个特定的插入片段(除非您正在运行 emacs-wayland),如 EmacsWiki 中所示。
请注意,systemd 用户单元不会继承登录 Shell 的环境变量(如 ~/.bash_profile)。有关更多信息,请参阅 systemd/User#Environment variables。
如果您将 emacs 作为守护进程启动,您可能希望将 VISUAL 和 EDITOR 环境变量设置为 emacsclient,这样启动编辑器的程序就会使用 emacsclient 而不是启动一个新的完整编辑器实例。使用外部编辑器的程序包括电子邮件程序(用于编辑消息)、Git(用于编辑提交消息)和 less(用于编辑显示文件的 v 命令)。请勿对 emacsclient 使用 -n(--nowait)选项,因为程序通常期望在编辑器退出时编辑已完成。
还建议更改 Emacs 的任何 GUI 启动菜单项(或等效项),使其指向 emacsclient 而不是 emacs,以便使用 emacs 守护进程而不是启动一个新的 emacs 进程。
寻求帮助
Emacs 包含一个内置教程,可以通过点击启动屏幕上的第一个链接并从菜单中选择 *Help>Emacs Tutorial*,或者按 C-h t 来访问。
要阅读英语以外语言的教程,请使用命令 Alt x,然后输入 help-with-tutorial-spec-language。
Emacs 本身就具有自文档化的设计。因此,有大量信息可用于确定特定命令的名称或其按键绑定,例如。使用 C-h C-h 查看所有上下文帮助绑定。您可以使用 C-h ? 访问 Emacs 帮助系统的快速帮助。
Emacs 还包含一套参考卡片,对初学者和专家都很有用,请参阅 /usr/share/emacs/version/etc/refcards/。
手册
如果您真的想精通 Emacs,最推荐的文档来源仍然是官方手册。
- Emacs:完整的 Emacs 用户手册。
- Emacs FAQ。
- Emacs Lisp 入门:如果您以前从未用过任何编程语言。
- Elisp:如果您已经熟悉某种编程语言。
您可以从 GNU.org 访问它们作为 HTML 文档或 PDF,或者通过嵌入的“info”阅读器直接从 Emacs 访问:C-h i。按 m 选择一本书。
一些用户喜欢使用“info”阅读书籍,因为它的快捷方式方便,段落可以适应窗口宽度,并且字体可以适应当前屏幕分辨率。有些人觉得它对眼睛的刺激较小。最后,您可以轻松地将书籍内容复制到任何 Emacs 缓冲区,甚至可以直接从示例中执行 Lisp 代码片段。
您可能想阅读 Info 书籍以了解更多关于它的信息:C-h i m info <RET>。在 info 模式下按 ? 可以获得快捷方式的快速列表。
您可以使用 Emacs 阅读man pages,命令是 M-x man <RET>。请注意,大多数 GNU 程序的 man pages 不如它们的 Info 手册完整。
配置
Emacs 的主要特点之一是其可扩展性和易于配置。Emacs 有一个内置的自定义引擎。您可以执行 M-x customize,它会显示一个自定义选项列表。有关如何使用此界面的信息,请参阅 Easy Customization info 节点:(info "(emacs) Easy Customization")。您可以仅为一个 Emacs 会话设置自定义选项,或将其保存到配置文件中,以便在 Emacs 会话之间保留。请注意,如果选择“*Apply and Save*”,自定义界面就是这样做的。
当 Emacs 启动时,它通常会尝试从一个“初始化文件”或简称为“init 文件”加载一个 Lisp 程序。该文件(如果存在)指定了如何为您初始化 Emacs。Emacs 在 ~/.emacs、~/.emacs.el、~/.emacs.d/init.el 或 ~/.config/emacs/init.el 中查找您的 init 文件。有关更多信息,请参阅 info 节点“Init File”: (info "(emacs) Init File")。
技巧与提示
TRAMP
TRAMP(Transparent Remote Access, Multiple Protocols,透明远程访问,多协议)是一个扩展,顾名思义,它提供了跨多种协议对远程文件的透明访问。当提示输入文件名时,输入特定格式将调用 TRAMP。一些示例:
在以 root 权限打开 /etc/hosts 之前提示输入 root 密码
C-x C-f /sudo::/etc/hosts
通过 SSH 连接到 'remotehost' 并以 'you' 的身份打开文件 ~/example.txt
C-x C-f /ssh:you@remotehost:~/example.txt
TRAMP 的路径通常是 '/[protocol]:[[user@]host]:<file>' 的形式。
连接到 'myhost' 并以 'you' 的身份使用 sudo 编辑 /etc/hosts
/ssh:you@remotehost|sudo:remotehost:/etc/hosts
TRAMP 支持的内容远不止以上示例所示。有关更多信息,请参阅随 Emacs 分发的 TRAMP info 手册。
将 Emacs 用作 git 合并工具
默认情况下,Git 支持将 Emacs 的 Emerge 模式用作合并工具。但是,您可能更喜欢 Ediff 模式。不幸的是,出于技术原因,git 不支持此模式。仍然可以通过在 emacs 调用时评估一些 elisp 代码来使用它。
.gitconfig
[mergetool.ediff]
cmd = emacs --eval \" (progn (defun ediff-write-merge-buffer () (let ((file ediff-merge-store-file)) (set-buffer ediff-buffer-C) (write-region (point-min) (point-max) file) (message \\\"Merge buffer saved in: %s\\\" file) (set-buffer-modified-p nil) (sit-for 1))) (setq ediff-quit-hook 'kill-emacs ediff-quit-merge-hook 'ediff-write-merge-buffer) (ediff-merge-files-with-ancestor \\\"$LOCAL\\\" \\\"$REMOTE\\\" \\\"$BASE\\\" nil \\\"$MERGED\\\"))\"
[merge]
tool = ediff
请注意,该命令必须在一行内。在上例中,我们启动了一个新的 Emacs 实例。您可能希望使用 emacsclient 以加快启动速度;但这并不推荐,因为 Ediff 调用并不真正干净:它可能会弄乱您当前的 Emacs 会话。
如果您想要即时启动,可以使用 -q 参数。如果您想快速启动 Emacs 同时保留至少一部分配置,可以调用 Emacs 执行以下操作:
emacs -q -l ~/.emacs-light
其中轻量级配置文件仅加载您为 Ediff 所需的内容。
有关此技巧和 Ediff 问题的更多详细信息,请参阅 kerneltrap.org 和 stackoverflow。
将 Caps Lock 用作 Control 键
一些用户喜欢这种行为,以避免所谓的“Emacs 手指”(emacs pinky)。一种在 GUI 桌面(Xorg 或 Wayland)、终端甚至控制台中实现此目的的好方法是使用 keyd。安装该软件包并创建此配置文件:
/etc/keyd/main.conf
[ids] * [main] capslock = overload(control, noop)
然后启用并启动 keyd 服务。
Emacs 和 emacsclient 的多路复用
在同一个 emacs-session 中打开新文件需要使用 emacsclient。emacs 命令本身可以被包装以实现更智能的文件打开功能(如果会话已存在)。
要启动会话,您需要 start-server。此片段将在第一个 Emacs 会话中创建服务器。将其添加到您的 emacs 配置文件中。
.emacs or .emacs.d/init.el
(require 'server) (unless (server-running-p) (server-start))
Shell 别名方法不足以完成此任务,因为您还需要传递变量或启动自己的独立会话。将其添加到 .bashrc 或任何 Shell 的 rc 文件中。这将使您的 emacs 命令在传递参数时表现得像 emacsclient。
function emacs {
if [[ $# -eq 0 ]]; then
/usr/bin/emacs # "emacs" is function, will cause recursion
return
fi
args=($*)
for ((i=0; i <= ${#args}; i++)); do
local a=${args[i]}
# NOTE: -c for creating new frame
if [[ ${a:0:1} == '-' && ${a} != '-c' && ${a} != '--' ]]; then
/usr/bin/emacs ${args[*]}
return
fi
done
setsid emacsclient -n -a /usr/bin/emacs ${args[*]}
}
如果您想在新会话中运行它,只需执行 emacs file -。
多个配置
您可以使用多个配置,并让 Emacs 加载其中一个或另一个。
例如,我们定义两个配置文件。
.emacs
(load "~/.emacs.d/main" nil t) (load "~/.emacs.d/functions" nil t) (load "~/.emacs.d/modes" nil t) (load "~/.emacs.d/plugins" nil t) (load "~/.emacs.d/theme" nil t)
这是用于守护进程的完整配置。但是 plugins 文件很大,加载速度慢。如果我们想启动一个不需要 plugins 功能的新 Emacs 实例,每次都加载它可能会很麻烦,从长远来看。
.emacs-light
(load "~/.emacs.d/main" nil t) (load "~/.emacs.d/functions" nil t) (load "~/.emacs.d/modes" nil t) (load "~/.emacs.d/theme" nil t)
现在我们用以下方式启动 Emacs:
emacs -q -l ~/.emacs-light
您可以创建一个别名来简化调用。
本地和自定义变量
您可以在配置文件中定义变量,这些变量以后可以为某个文件本地修改。
(defcustom my-compiler "gcc" "Some documentation")
现在,在任何文件中,您都可以通过两种方式定义局部变量,有关详细信息,请参阅手册。
- 使用
M-x add-file-local-variable-prop-line,它会在开头添加一行注释,类似于:
// -*- my-compiler:g++; mode:c++ -*-
- 或者,您可以使用
M-x add-file-local-variable在文件末尾附近添加行:
// Local Variables: // my-compiler: g++ // mode: c++ // End:
请注意,要使值生效,您需要调用 M-x revert-buffer。
自定义变量默认被认为是不安全的。如果您尝试打开一个包含重新定义自定义变量的局部变量的文件,Emacs 会要求您确认。
您可以声明该变量为安全变量,从而取消 Emacs 的确认提示。您需要指定一个谓词,任何新值都必须满足该谓词才能被认为是安全的。
(defcustom my-compiler "gcc" "Some documentation" :safe 'stringp)
在上面的例子中,如果您尝试设置字符串以外的任何内容,Emacs 将认为它不安全。
自定义颜色和主题
可以使用 face(面部)功能轻松自定义颜色。
(set-face-background 'region "color-17") (set-face-foreground 'region "white") (set-face-bold-p 'font-lock-builtin-face t )
您可以让 Emacs 告诉您当前光标所在位置的面部名称。为此,请使用 customize-face 函数。该功能将向您展示如何设置颜色、粗体、下划线等。
控制台中的 Emacs 可以处理 256 种颜色,但您需要使用适当的终端。例如 URxvt 支持 256 种颜色。您可以使用 list-colors-display 来获取支持颜色的完整列表。这在很大程度上取决于终端。
参见
- https://www.emacswiki.org/emacs/ColorThemes
- https://gnu.ac.cn/software/emacs/manual/html_node/emacs/Custom-Themes.html
SyncTeX 支持
Emacs 是一个强大的 LaTeX 编辑器。这很大程度上归功于您可以根据自己的需求调整或创建 LaTeX 模式。
但是,可能存在一些挑战,例如 SyncTeX 支持。首先,您需要确保您的 TeX 发行版包含它。如果您手动安装了 TeX Live,您可能需要安装 synctex 软件包。
# umask 022 && tlmgr install synctex
SyncTeX 支持取决于查看器。这里我们以 Zathura 为例,因此如果您想使用其他 PDF 查看器,则需要调整代码。
(defcustom tex-my-viewer "zathura --fork -s -x \"emacsclient --eval '(progn (switch-to-buffer (file-name-nondirectory \"'\"'\"%{input}\"'\"'\")) (goto-line %{line}))'\""
"PDF Viewer for TeX documents. You may want to fork the viewer
so that it detects when the same document is launched twice, and
persists when Emacs gets closed.
Simple command:
zathura --fork
We can use
emacsclient --eval '(progn (switch-to-buffer (file-name-nondirectory \"%{input}\")) (goto-line %{line}))'
to reverse-search a pdf using SyncTeX. Note that the quotes and double-quotes matter and must be escaped appropriately."
:safe 'stringp)
这里我们定义自定义变量。如果您使用 AucTeX 或 Emacs 的默认 LaTeX-mode,您需要相应地设置查看器。
现在用 Emacs 打开一个 LaTeX 源文件,编译文档,然后启动查看器。Zathura 将会启动。如果您按 Ctrl+左键单击,Emacs 应该会将光标定位到相应的位置。
systemd 文件的语法高亮
您可以使用 systemd-mode。
或者,您可以简单地告诉 emacs 为 systemd 文件(服务、计时器等)着色,方法是将以下内容添加到您的 init 文件:
(add-to-list 'auto-mode-alist '("\\.service\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.timer\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.target\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.mount\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.automount\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.slice\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.socket\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.path\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.netdev\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.network\\'" . conf-unix-mode))
(add-to-list 'auto-mode-alist '("\\.link\\'" . conf-unix-mode))
emacs-nox 的剪贴板支持
要在 emacs-nox 中使用 Xorg 剪贴板,请安装 xclip 并将以下函数添加到 ~/.emacs [1]。
;; use xclip to copy/paste in emacs-nox
(unless window-system
(when (getenv "DISPLAY")
(defun xclip-cut-function (text &optional push)
(with-temp-buffer
(insert text)
(call-process-region (point-min) (point-max) "xclip" nil 0 nil "-i" "-selection" "clipboard")))
(defun xclip-paste-function()
(let ((xclip-output (shell-command-to-string "xclip -o -selection clipboard")))
(unless (string= (car kill-ring) xclip-output)
xclip-output )))
(setq interprogram-cut-function 'xclip-cut-function)
(setq interprogram-paste-function 'xclip-paste-function)
))
;; xterm mouse support (require 'mouse) (xterm-mouse-mode t)
另请参阅 [2]。
软件包
Emacs 的功能可以通过第三方软件包进行扩展。内置的包管理器 package.el 是官方支持的实现方式,尽管 Emacs 社区成员还编写了其他几种包管理器。package.el 依赖于 package-archives 变量来查找软件包。默认情况下,这包括 Emacs Lisp Package Archive (ELPA)。M-x list-packages 将创建一个缓冲区,列出 Emacs 所知的所有软件包。手册((info "(emacs) Packages"))包含更多信息。
可以添加第三方软件包存档。其中最常用的是 MELPA。
许多流行的扩展作为软件包在官方仓库中可用,还有更多可通过 AUR 获取。这类软件包的名称通常带有 'emacs-' 前缀(例如,emacs-lua-mode),但并非总是如此(例如,auctexAUR)。
某些软件包可能需要您修改配置文件才能激活它们,以便在 Emacs 会话中使用它们的功能。例如,如果您安装了 auctexAUR,您需要将以下内容添加到您的配置文件中:
(load "auctex.el" nil t t) (load "preview-latex.el" nil t t)
其他软件包应告知您如何激活它们,信息在其源代码的注释部分或 README 文件中。
故障排除
Emacs 启动失败并出现错误消息“Undefined color: "WINDOW_FOREGROUND"”
您需要安装 mcpp 软件包或 gcc 软件包。C 预处理器 cpp 用于 xrdb 预处理 X 资源。如果系统中未安装 C 预处理器,xrdb 将静默跳过运行 C 预处理器,符号 WINDOW_FOREGROUND 未被展开为十六进制颜色代码。
使用 Gccemacs 时 Emacs systemd 服务启动失败
当使用 Gccemacs(无论是 emacs-native-comp 还是 pgtk-nativecomp 分支)并尝试为其启动 systemd 服务时,可能会记录一条错误消息,提示找不到 .eln 文件。
$ journalctl --user -xb -g eln
emacs[7507]: emacs: ../native-lisp/28.0.50-x86_64-pc-linux-gnu-fc9c33938bf279333039c28064d363e8/lisp-mode-410874a46ab8852855281f021ca61fe7-1738806322de892570d69dfc55b437c2.eln: cannot open shared object file: No such file or directory
作为一种解决方法,请编辑 [Service] 部分中的 emacs.service 的 WorkingDirectory 行。
emacs.service
[Service] ... WorkingDirectory=/usr/lib/emacs/28.0.50/x86_64-pc-linux-gnu/ ...
WorkingDirectory 参数必须定义在可能的现有 Restart 参数*之前*。彩色输出问题
默认情况下,Emacs Shell 会显示用于打印颜色的原始转义序列。换句话说,它会显示奇怪的符号而不是期望的彩色输出。
将以下内容包含到 ~/.emacs 中可以解决此问题:
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
在 X Windows 中显示字符的问题
如果在 X windows 中启动 emacs 时,主窗口中的所有字符都是带有黑框的白框(如果您尝试查看没有安装相应字体的字符时看到的那些),您需要安装 xorg-fonts-75dpi 和/或 xorg-fonts-100dpi 并重新启动 X windows。
启动缓慢
启动缓慢通常由以下两种原因之一引起。
要确定是哪种原因,请使用以下命令运行 Emacs:
$ emacs -q
- 错误,尤其是
/etc/hosts中的错误,通常会导致 Emacs 启动时延迟 5 秒以上。有关信息,请参阅网络配置指南中的“设置主机名”。 - 您可能需要监控从您的计算机发送的任何网络数据包(使用 Wireshark 等程序)以查看是否有任何奇怪的行为。
- 搜索原因的一个简单方法是注释掉(即在行首添加“;”)您的
~/.emacs(或~/.emacs.d/init.el)中的可疑部分,然后重新启动 Emacs 查看是否有任何变化。请记住,“require”和“load”的使用会减慢启动速度,尤其是在与大型扩展一起使用时。作为一项规则,它们只应在目标是:Emacs 启动后需要,或只为扩展提供“自动加载”时使用。否则,请直接使用“autoload”函数。例如,而不是:(require 'anything)
您可以使用:(autoload 'anything "anything" "Select anything" t)
无法打开加载文件:...
此错误的最常见原因是 'load-path' 变量未包含扩展所在的目录的路径。要解决此问题,请在尝试加载扩展之前,将适当的路径添加到要搜索的列表中:
(add-to-list 'load-path "/path/to/directory/")
在尝试使用扩展的软件包并且 Emacs 的前缀配置为 /usr 以外的值时,需要更新 load-path。将以下内容放在 ~/.emacs 中,在软件包提供的说明之前:
(add-to-list 'load-path "/usr/share/emacs/site-lisp")
如果手动编译 Emacs,请记住默认前缀是 /usr/local。
死音键问题:“<dead-acute> is undefined”
在 Google 上搜索此 bug,我们找到了这个链接:https://lists.gnu.org/archive/html/help-gnu-emacs/2009-05/msg00167.html,它解释了问题。正常使用重音键的方式无法按预期工作。尝试为“fiancé”这样的单词添加重音将产生上述消息。
一种解决方法是将以下行放入您的启动文件 ~/.emacs 中:
(require 'iso-transl)
并且,这不是一个 bug,而是新 Emacs 版本的一项功能。阅读邮件列表上后续的关于此问题的消息,我们发现它[3]。
- 似乎没有任何东西被自动加载,因为在 iso-transl 和 iso-acc 之间有一个选择。两者似乎都提供了带有 C-x 8 或 Alt-<accent> 前缀的输入法,但您和我所做的是仅按一个死键(^、´、`、~、¨)然后按另一个键来“组合”带重音的字符。而且这里没有使用 Alt 键!根据文档,它似乎适用于 8 位编码,因此在 UTF-8 中应该非常无用。当它被引入时我报告了这个 bug,但这个 bug似乎被归类为一项功能……也许只是因为它被自动加载了,尽管它相当无用。
C-M-% 和其他一些绑定在 emacs nox 中不起作用
这是因为终端比 Xorg 的功能更有限。一些终端可能比其他终端支持更多绑定。两个解决方案:
- 要么使用图形版本,
- 或者更改绑定到受支持的绑定。
示例
.emacs
(global-set-key (kbd "C-M-y") 'query-replace-regexp)
Emacs 挂起
由于其单线程的特性,许多操作会阻塞 Emacs。这可能以几种方式发生。例如,Emacs 可能正在等待您的输入(例如,您在一个框架中打开了 minibuffer,但正尝试在另一个框架中工作)。或者,Emacs 可能正在运行一个耗时较长的代码。或者,您可能遇到了一个 bug。有几种方法可以尝试解阻塞 Emacs 而不终止 Emacs 进程。
- 尝试按
C-g。根据 Emacs 的操作,您可能需要按多次。 - 尝试按
ESC ESC ESC。 - 从另一个终端运行
killall -SIGUSR2 emacs。
Emacs-nox 输出混乱
在终端中工作时,颜色、缩进或任何与输出相关的内容可能会变得混乱。这是因为(可能?)Emacs 在某个时候接收到了一个特殊字符,该字符可能与当前终端冲突。如果发生这种情况,您可以执行 M-x redraw-display,这将重绘终端的显示。如果此问题经常发生,您可能想将此命令绑定到一个键,例如,通过将以下内容放入您的 .emacs 文件:
(global-set-key (kbd "<f7>") 'redraw-display)
在您的 .emacs 文件中。
图形 Emacs 不会出现此问题。
Emacs 终端中显示奇怪的转义数字(utf-8)
在您的 .bashrc 或 .zshrc 中导出这些值:
$ ~/.bashrc or ~/.zshrc
export LANG\='en_US.UTF-8' export LC_ALL\="en_US.UTF-8" export TERM\=xterm-256color
这可能是错误的来源,因为在 Linux 发行版中,正确的值使用小写 utf(例如 en_US.utf-8)。
要查看所有可用的区域设置,请使用 locale -a。
在 tmux 中的 emacs 里 Shift + 方向键不起作用
在您的 tmux 配置中启用 xterm-keys:
~/.tmux.conf
setw -g xterm-keys on
因为这会破坏其他按键组合,所以将以下内容放入您的 emacs 配置中:
~/.emacs
(defadvice terminal-init-screen
;; The advice is named `tmux', and is run before `terminal-init-screen' runs.
(before tmux activate)
;; Docstring. This describes the advice and is made available inside emacs;
;; for example when doing C-h f terminal-init-screen RET
"Apply xterm keymap, allowing use of keys passed through tmux."
;; This is the elisp code that is run before `terminal-init-screen'.
(if (getenv "TMUX")
(let ((map (copy-keymap xterm-function-map)))
(set-keymap-parent map (keymap-parent input-decode-map))
(set-keymap-parent input-decode-map map))))
有关详细信息,请参阅 tmux FAQ。
KDE 中窗口大小调整不正确
KDE 用户可能会注意到 Emacs 窗口没有正确调整大小,而是调整的部分是透明的,并且鼠标点击会发送到下面的窗口。要纠正此行为,请将 KDE 的 GTK3 主题更改为除 oxygen-gtk 以外的其他主题。例如,使用 Emacs 主题,该主题包含在 gtk3 中。
要强制 Emacs 在 KDE 中完全最大化,请单击标题栏中的 Emacs 图标,然后选择 *More Actions > Special Window Settings*。然后在“*Size & Position*”选项卡中,选择“*Obey geometry restrictions*”,在下拉菜单中选择“*Force*”,然后选择右侧单选按钮中的“*No*”。
缺少 info 页面
有时 texinfo 的 dir 文件会不同步,并且系统中存在的 info 页面在 info 浏览器中不可用。下面的脚本会重新创建 dir info 文件,将系统中所有的 info 页面都放入其中。
pushd /usr/share/info
rm -v dir
for f in *
do install-info "$f" dir 2>/dev/null
done
popd
替代方案
有许多“较小的”文本编辑器,至少在表面上与 GNU Emacs 相似。以下是一些:
- mg — 用 C 语言编写的轻量级 Emacs 实现。请注意,它不支持 UTF-8。
- Zile — “Zile Is Lossy Emacs”,一个轻量级克隆,旨在尽可能类似于 Emacs。Zile 不支持 UTF-8。
- uemacs — Linus Torvalds 定制的“Micro-emacs”版本。
- emacs-ng — Emacs 的新方法 - 包括 TypeScript、多线程、异步 I/O 和 WebRender。
- qemacs — “Quick Emacs”,基于 Emacs Lisp 解释器,但代码库更小,用户界面更简洁。
- sxemacs — xemacs 的一个分支。
- lem — Emacs 的一个 WIP 克隆,用 Common Lisp 编写。
- jove — Jonathan's Own Version of Emacs,一个没有 Lisp 的类 Emacs 编辑器。
- jed — JED 是一个类 Emacs 编辑器,使用 S-Lang 库实现。
- jmacs — Joe 编辑器附带可选的 Emacs 仿真。
其他 GNU Emacs 发行版
Emacs“发行版”是一系列 emacs 软件包和自定义项的集合。它们比自己定制 emacs 更容易安装和使用(但对您来说自定义程度较低)。
- Spacemacs - 社区驱动的 Emacs 发行版 - 最佳编辑器既不是 Emacs 也不是 Vim,而是 Emacs *和* Vim!
- Doom Emacs - 坚韧火星黑客的 Emacs 框架。
- Witchmacs - 最可爱的 Emacs 发行版。
- Yukimacs - 一个从头开始构建的 GNU/Emacs 配置(无 Spacemacs 或 Doom Emacs),深受 Uncle Dave’s Emacs 和 Witchmacs 的启发。它现在不推荐使用,建议使用 yukimacs-doom,下面将提到。
- yukimacs-doom - Yukimacs,但 Doom 版。
更多:入门套件。