5

这可能很简单,但我在谷歌搜索时没有发现任何有用的东西。所以就这样了:)

我在守护程序模式下使用 Emacs ( emacs --daemon),它真的很方便。我也使用 dvorak 并且发现从长远来看重新映射C-jC-c(反之亦然)非常方便,并使用以下内容进行翻译:

(keyboard-translate ?\C-j ?\C-c)
(keyboard-translate ?\C-c ?\C-j)

这在使用 Emacs 作为守护进程时非常有用。当我启动一个新客户端 (cli/gui)C-j时不再绑定到C-c. 什么?

所以我想我需要keyboard-translate在创建一个新的客户端框架之后运行,但我不知道该怎么做。我已经尝试过defadvice在某个地方找到的,但无法使其正常工作,所以我放弃并删除了它。

4

3 回答 3

8

C-h f keyboard-translate RET说:

这个变量对每个终端都有一个单独的绑定。参见信息节点`(elisp)Multiple display'。

这为我们指明了正确的方向,尽管该文档中存在错误,因为引用的信息节点不存在。搜索表明该节点实际上已重命名(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."
  (with-selected-frame (or frame (selected-frame))
    (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)

从实验上看,重复你的命令似乎是安全的,所以我们不必担心每个终端只执行一次(但如果我们这样做了,我们可以(get-device-terminal FRAME)用来帮助解决这个问题)。

于 2011-02-21T13:06:50.890 回答
2

扩展菲尔斯的答案:

在 Emacs 26.1 上,我必须在新框架的上下文中运行键盘翻译,如下所示:

(defun make-keyboard-translations ()
  (keyboard-translate ?\C-j ?\C-c))

(defun setup-frame-keyboard (frame)
  (with-selected-frame frame
    (make-keyboard-translations)))

(make-keyboard-translations)
(add-hook 'after-make-frame-functions #'setup-frame-keyboard)
于 2018-12-11T19:07:41.730 回答
0

每次调用 emacsclient 时运行的另一个挂钩是server-visit-hook,它可能比after-make-frame-functions.

(add-hook 'server-visit-hook 
     (lambda ()
          (keyboard-translate ?\C-j ?\C-c)
          (keyboard-translate ?\C-c ?\C-j)))
于 2012-04-19T17:04:36.350 回答