如何设置全局覆盖的键绑定,并优先于该键的所有其他绑定?我想覆盖所有主要/次要模式映射,并确保我的绑定始终有效.
这当然不起作用:
(global-set-key "\C-i" 'some-function)
Run Code Online (Sandbox Code Playgroud)
它起作用text-mode,但是当我使用时lisp-mode,C-i它会反弹lisp-indent-line.
我可以lisp-mode单独完成并在每个其他模式中覆盖此绑定,但必须有一个更简单的方法.每次我为新文件类型安装新模式时,我都必须返回并检查以确保所有的键绑定都没有被新模式覆盖.
我想这样做是因为我想模仿我已经学习并从其他编辑器根深蒂固的绑定.
在定制了我的.emacs文件几年后,我发现我使用了两种不同的结构来设置特定于主模式的键绑定:
1.使用钩子和local-set-key.例如:
(defun my/bindkey-recompile ()
"Bind <F5> to `recompile'."
(local-set-key (kbd "<f5>") 'recompile))
(add-hook 'c-mode-common-hook 'my/bindkey-recompile)
Run Code Online (Sandbox Code Playgroud)
我想说这个结构可以很容易地为不同的主模式使用相同的键绑定,方法是将相同的函数添加到所有相关的主模式钩子(换句话说," 我想要的哪个键绑定 "明确地与" 我想要哪些模式 ").但是,我对这种自定义在缓冲级别完成这一事实感到不舒服,而我认为它们属于主要模式.
2.使用define-key(通常与eval-after-load延迟评估相结合,直到加载相关的键映射).例如:
(eval-after-load "cc-mode"
'(progn
(define-key c-mode-map (kbd "C-c o") 'ff-find-other-file)
(define-key c++-mode-map (kbd "C-c o") 'ff-find-other-file)))
Run Code Online (Sandbox Code Playgroud)
相比之下,这个构造定制了主模式本身,但不太灵活:如果我想为另一个模式使用相同的键绑定,我将不得不为这个模式找到正确的文件和键映射名称,并且几乎复制了eval-after-load表达式(虽然这可能是使用函数/宏自动化).
问题:虽然两种构造类型都能很好地工作并产生我想要的结果,但它们在技术上非常不同,在不同的时间在不同的键盘映射中设置键绑定.所以我的问题是:在这两个结构中,有一种"首选/更好"的方法吗?(或者也许"最好的"构造是我不知道的第三个构造?)
"首选/更好",我的意思是: