我的 init 文件设置为.emacs
指向特定于操作系统的 init 的符号链接,该 init 反过来会加载主 init 文件,其中包含不受操作系统影响的配置。对于非服务器 emacs,我使用此设置没有遇到任何问题。
但是,使用 emacsclient 时它无法正常工作。例如,我有一个设置,以便org-mode
在 OSX 上的终端中S-Tab
映射到 backtab,以便它正常工作,而不是抛出有关未定义键的错误。如果我不使用 emacs 服务器,此设置可以正常工作。当我使用 emacsclient 时,我收到未定义键绑定的错误。
我知道我的所有 init 文件都已加载且没有错误,因为在服务器启动时,我放入文件中的任何 (消息“whatever”) 行都显示正常。因此,这并不是说 emacs 服务器不知为何丢失了文件。就好像映射的键已为服务器加载,但在客户端连接时被遗忘了。我甚至eval
在 emacsclient 缓冲区中尝试过一次键映射,但没有错误,也没有变化。有什么想法吗?
(顺便说一句,--debug-init
没有显示任何奇怪的东西。一切都加载没有错误。)
答案1
我认为您的问题是您的 .emacs 文件设置了类似local-function-key-map
或的input-decode-map
内容,但这些变量是终端本地的,这意味着每个“终端”(您的 GUI 是一个“终端”,并且通过文本终端的每个 emacsclient 连接将是另一个“终端”)都会获得这个变量的不同值。
因此,您需要为每个新终端重新运行该代码。您可以按照after-make-frame-functions
reza.safiyat 的建议从以下位置执行此操作,尽管它会比需要的更频繁地运行(每帧一次,而不是每个终端一次)。但由于这可能只需要“xterm”终端,因此另一个不错的选择是从以下位置执行此操作terminal-init-xterm-hook
:
(defun my-text-terminal-keys ()
(define-key input-decode-map ...)
(define-key local-function-key-map ...))
(add-hook 'terminal-init-xterm-hook #'my-text-terminal-keys)
顺便说一句,有时另一种方法是使用function-key-map
,因为这是一个全局变量,并且同样适用于所有终端。
答案2
最终找到了解决办法。
这是复制的解决方案,但遗憾的是我丢失了它的链接。只需将其添加到您的init
文件中即可。
(defun startup_func(_)
(load-file "/path/to/custom-keybindings.el"))
(add-hook 'after-make-frame-functions #'startup_func)