为特定Emacs模式设置自定义键绑定

为特定Emacs模式设置自定义键绑定,emacs,key-bindings,Emacs,Key Bindings,虽然我知道如何在Emacs中设置全局键绑定,但我发现很难用谷歌搜索出本地(次要模式特定)键绑定的代码。例如,我的.emacs中有此代码: ;; PDFLaTeX from AucTeX (global-set-key (kbd "C-c M-p") (lambda () (interactive) (shell-command (concat "pdflatex " buffer-file-name)))) 我不想将其设置为全局。是否有类

虽然我知道如何在Emacs中设置全局键绑定,但我发现很难用谷歌搜索出本地(次要模式特定)键绑定的代码。例如,我的
.emacs
中有此代码:

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

我不想将其设置为全局。是否有类似于
本地设置键
的功能?

您需要识别该模式的键映射(例如,
LaTeX模式映射
),并使用功能
定义键
。例如,除了在LaTeX模式中激活
大纲次要模式
,我还有:

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

在这种情况下,主模式(LaTeX)保留键绑定,但也有一个
大纲次要模式映射

要在模式中绑定键,您需要等待加载模式,然后再定义键。您可以需要该模式,或使用加载后评估

   (eval-after-load 'latex 
                    '(define-key LaTeX-mode-map [(tab)] 'outline-cycle))
不要忘记
-
加载后评估
不是宏,因此它需要它们。

我使用以下方法:

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

仅为LaTeX模式定义绑定。

其他答案都不能满足我的需要。所以这可能会帮助其他人。我希望
选项卡
跳到行的开头,如果我处于邪恶的正常模式(基本上:这意味着在Emacs中无处不在),但是我希望它在组织模式文档中的组织项目状态之间循环

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

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

我在这里使用的技术也可以通过
global set key
调用您的自定义函数来代替,用于使用常规非邪恶emac的用户

对于那些不懂Emacs lisp的人来说,“if”语句后面的第一行是true操作,后面的一行是false操作。因此,如果
主要模式
等于
组织模式
,我们运行
组织周期
,否则我们在所有其他模式下运行
邪恶第一非空

(取消我的/选项卡跳转或组织周期()
在所有模式下跳转到行的开头,组织模式除外,组织模式循环
(互动)
(如果(等于专业模式“组织模式”)
(组织周期)
(第一个非空)
)
(定义键正常状态映射(kbd“”)“我的/选项卡跳转或组织周期”)

如何以编程方式确定加载后
eval的第一个参数?我认为提供属于该模式的任何函数就足够了,例如
'LaTeX-mode
而不是
'LaTeX
也可以。对我来说,该变量称为LaTeX mode map(全小写)。LaTeX模式映射不存在。
[(tab)]
(kbd“tab”)
@LenarHoyt的旧语法:实际上,否:
[(tab)]
[tab]
相同,这是在Emacs的GUI版本中点击
选项卡时发送的键序列
(kbd“TAB”)
oth与
[?\t]
相同,这是在文本终端中点击相同的
选项卡时发送的键序列(也是点击
C-i
时发送的键序列)。这两个选项在Emacs内部通过
功能键映射“统一”,如果没有绑定到
[tab]
,则该映射将
[tab]
重新映射到
(kbd“tab”)
。因此,如果希望绑定在GUI和tty中都能工作,最好使用
(kbd“TAB”)
#
对我来说是多余的。我必须设置
“latex-mode-hook
(无上限)。我还发现
是不必要的。我越来越多地去Emacs Wiki寻求帮助:在那里,它显示您可以向模式键映射添加键绑定,并显示如何找到该映射。是的。。。我已经看到了那个,但我一直得到
符号的值,因为变量是void:LaTeX mode map
。六羟甲基三聚氰胺六甲醚。。。