mon*_*tux 4 dvorak emacs emacsclient
这可能很简单,但在google搜索时我没有找到任何有用的东西.所以在这里:)
我在守护进程模式(emacs --daemon
)中使用Emacs,它非常方便.我也使用dvorak并且发现重新映射C-j到C-c(反之亦然)从长远来看非常方便,并使用以下内容进行翻译:
(keyboard-translate ?\C-j ?\C-c)
(keyboard-translate ?\C-c ?\C-j)
Run Code Online (Sandbox Code Playgroud)
当不使用Emacs作为守护进程时,这非常有用.当我开始新的客户端(cli/gui)C-j不再受约束C-c.Whaaat?
所以我想我需要keyboard-translate
在创建一个新的客户端框架后运行,但我不知道该怎么做.我尝试了一个defadvice
我找到的地方,但无法使它工作,所以我放弃并删除它.
C-h f keyboard-translate
RET 说:
此变量对每个终端都有单独的绑定.请参阅信息节点`(elisp)多个显示'.
这指出了我们正确的方向,尽管该文档中存在错误,因为引用的信息节点不存在.搜索表明该节点实际上已重命名(elisp)Multiple terminals
,您也可以在此处阅读:http://www.gnu.org/s/emacs/manual/html_node/elisp/Multiple-Terminals.html
在GNU和Unix系统上,每个X显示器都是一个单独的图形终端[...] Emacs甚至可以通过与emacsclient程序交互连接到其他纯文本终端.
因此,当您将emacs作为守护程序启动时,您还没有连接到终端(或者至少没有连接到对您有用的终端),因此您的命令不会为您最终生成的终端生成绑定使用.
该after-make-frame-functions
变量提供了一种解决方法.
(defun my-dvorak-translations (&optional frame)
"Re-map keys in the current terminal."
(keyboard-translate ?\C-j ?\C-c)
(keyboard-translate ?\C-c ?\C-j))
;; Evaluate both now (for non-daemon emacs) and upon frame creation
;; (for new terminals via emacsclient).
(my-dvorak-translations)
(add-hook 'after-make-frame-functions 'my-dvorak-translations)
Run Code Online (Sandbox Code Playgroud)
在实验上,重复命令似乎是安全的,因此我们不必担心每个终端只执行一次(但如果我们这样做,我们可以(get-device-terminal FRAME)
用来帮助它).