【问题标题】:Set custom keybinding for specific Emacs mode为特定 Emacs 模式设置自定义键绑定
【发布时间】:2011-07-26 21:09:46
【问题描述】:

虽然我知道如何在 Emacs 中设置全局键绑定,但我发现甚至很难通过 Google 搜索出本地(特定于次要模式)键绑定的代码。例如,我的.emacs 中有这段代码:

;; PDFLaTeX from AucTeX
(global-set-key (kbd "C-c M-p")
        (lambda ()
          (interactive)
          (shell-command (concat "pdflatex " buffer-file-name))))

我不想全局设置它。有local-set-key这样的功能吗?

【问题讨论】:

  • 我发现自己越来越多地去 Emacs Wiki 寻求帮助:emacswiki.org/emacs/KeyBindingDiscussion 那里显示您可以将键绑定添加到模式键映射,并显示如何找到该映射。
  • 是的...我已经看到了,但我一直收到Symbol's value as variable is void: LaTeX-mode-map。嗯...

标签: emacs key-bindings


【解决方案1】:

要在一个模式中绑定一个键,你需要等待模式被加载,然后再定义键。可能需要该模式,或使用eval-after-load

   (eval-after-load 'latex 
                    '(define-key LaTeX-mode-map [(tab)] 'outline-cycle))

不要忘记'——eval-after-load 不是宏,所以它需要它们。

【讨论】:

  • 如何以编程方式确定eval-after-load 的第一个参数?
  • 我认为提供任何属于该模式的功能就足够了——例如'LaTeX-mode 而不是 'latex 也可以。
  • 对我来说,该变量称为latex-mode-map(全小写)。 LaTeX-mode-map 不存在。
  • [(tab)] 是 (kbd "TAB") 的旧语法
  • @LenarHoyt:实际上,不:[(tab)] 与[tab] 相同,这是您在 GUI 版本的 Emacs 中按下 TAB 键时发送的键序列。 (kbd "TAB") OTOH 与[?\t] 相同,这是您在文本终端中按下相同的TAB 键时发送的键序列(这也是您按下C-i 时发送的相同键序列)。这两个选项在 Emacs 中由 function-key-map “统一”,如果没有绑定到 [tab],则将 [tab] 重新映射到 (kbd "TAB")。因此,如果您希望您的绑定在 GUI 和 tty 中都可以工作,最好使用(kbd "TAB")。
【解决方案2】:

其他答案都不能满足我的需求。所以这可能会帮助其他人。如果我处于 Evil 的正常模式,我希望 Tab 跳转到行首(基本上:这意味着 Emacs 中的 everywhere),但我希望它在 org 项目状态之间循环,如果我在一个 org-mode 文档中。

一种选择是在我切换缓冲区时使用单独的绑定和不断的绑定重新绑定(因为在正常状态下,邪恶只允许每个键一个绑定)。

但更有效的选择是让Tab 运行我自己的代码,该代码根据当前缓冲区使用的主要模式运行所需的函数。因此,如果我在 org 缓冲区中,则此代码运行 org-cycle,否则运行 evil-first-non-blank(转到该行的第一个非空白字符)。

我在这里使用的技术也可以通过 global-set-key 调用您的自定义函数来使用,对于使用常规非邪恶 Emacs 的人。

对于那些不了解 Emacs lisp 的人来说,“if”语句之后的第一行是 true-action,之后的行是 false-action。所以如果major-mode等于org-mode,我们运行org-cycle,否则我们在所有其他模式下运行evil-first-non-blank:

  (defun my/tab-jump-or-org-cycle ()
    "jumps to beginning of line in all modes except org mode, where it cycles"
    (interactive)
    (if (equal major-mode 'org-mode)
        (org-cycle)
      (evil-first-non-blank))
    )
  (define-key evil-normal-state-map (kbd "<tab>") 'my/tab-jump-or-org-cycle)

【讨论】:

    【解决方案3】:

    我使用以下:

    (add-hook 'LaTeX-mode-hook
              (lambda () (local-set-key (kbd "C-0") #'run-latexmk)))
    

    为 LaTeX 模式单独定义一个绑定。

    【讨论】:

    • # 对我来说是多余的。
    • 我不得不设置 'latex-mode-hook 代替(没有大写)。我还发现# 是不必要的。
    • 关于尖锐引用#' endlessparentheses.com/…
    【解决方案4】:

    您需要识别该模式的键映射(例如,LaTeX-mode-map)并使用函数define-key。例如,除了在 LaTeX 模式下激活 outline-minor-mode 外,我还有:

      (define-key LaTeX-mode-map [(tab)] 'outline-cycle))
    

    在这种情况下,主要模式 (LaTeX) 拥有键绑定,但也有一个 outline-minor-mode-map。

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 2012-04-06
      • 1970-01-01
      • 2010-11-27
      • 2011-03-08
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多