在Emacs中使用守护程序/客户端在新框架上运行命令

时间:2011-02-21 09:46:21

标签: emacs dvorak emacsclient

这可能很简单,但在google搜索时我没有找到任何有用的东西。所以在这里:)

我在守护进程模式(emacs --daemon)中使用Emacs,这非常方便。我也使用dvorak并且发现将 Cj 重新映射到 Cc (反之亦然)从长远来看非常方便,并使用以下内容进行翻译:

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

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

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

3 个答案:

答案 0 :(得分:6)

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)

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

答案 1 :(得分: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)))

答案 2 :(得分:0)

要扩展phils的答案:

在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)