如何在Emacs中创建区分大小写的键绑定?

7
根据Emacs手册,修饰键由于“历史原因”是大小写不敏感的。我能改变这个行为吗?我的目标是使M-aM-A有不同的含义。谢谢!

据我所知,只有在存在一个键定义的情况下,它们才被视为不区分大小写。如果你创建了两个——即一个小写键定义和一个大写键定义,那么它们就不再被视为不区分大小写。使用你所寻找的方法非常常见。例如,(global-set-key [?\s-m] 'minimize)(global-set-key [?\s-M] 'maximize) - lawlist
1个回答

8
根据手册,

Control 修改的字母字符始终被视为不区分大小写:Emacs 总是将 C-A 视为 C-a,C-B 视为 C-b,以此类推。这样做的原因是历史原因。

所以你不能像这样定义它们:
(global-set-key (kbd "C-a") 'xxx)
(global-set-key (kbd "C-A") 'yyy)

但是S-可以用于Shift,因此:

(global-set-key (kbd "C-a") 'xxx)
(global-set-key (kbd "C-S-a") 'yyy)  ;; C-A

没问题。并且

对于所有其他修饰符,在自定义Emacs时,您可以使修改的字母字符区分大小写。例如,您可以使M-a和M-A运行不同的命令。

因此,您可以像这样定义按键绑定:

(global-set-key (kbd "M-a") 'xxx)
(global-set-key (kbd "M-A") 'yyy)

实际上,我经常这样做。这意味着在我的代码文档中调用,C-A 也就是 C-S-a(反之亦然)。Emacs本身总是使用后一种表示法,并显式地使用Shift修饰符。 - Drew
在Emacs 29.1中,describe-key进行了翻译。C-c l e(从C-c l E翻译而来)运行了命令lsp-execute-code-action,这是‘lsp-mode.el’中的一个交互式的字节编译的Lisp函数。绑定是通过以下方式设置的: (define-key map "E" #'lsp-treemacs-errors-list) (define-key map "e" #'lsp-execute-code-action) 和 (define-key scala-mode-map "\C-cl" map) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接