【问题标题】:Run command on new frame with daemon/client in Emacs在 Emacs 中使用守护程序/客户端在新框架上运行命令
【发布时间】:2011-07-01 03:59:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: emacs dvorak emacsclient


    【解决方案1】:

    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."
      (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) 来帮助解决这个问题)。

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • 我不知道after-make-frame-functions当时是否自动选择框架,但最近肯定没有这样做......我有点惊讶地发现这个老回答并注意我的错误。很高兴看到您添加了此更正。
      【解决方案3】:

      每次调用 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)))
      

      【讨论】:

      • 这是否可以解释在没有文件列表的情况下打开新客户端/框架的情况?
      猜你喜欢
      • 2021-07-13
      • 1970-01-01
      • 2013-09-06
      • 2011-05-22
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2022-06-13
      • 2014-05-31
      相关资源
      最近更新 更多