如何在 Linux 中使用 Ctrl+M 关闭替代 Enter
为什么 Ubuntu Jaunty 中 Ctrl+M 绑定到 Enter?如何关闭它?
我正在使用 Emacs,并且想将 Ctrl+M 绑定到其他命令。
Why is Ctrl+M bound to Enter in Ubuntu Jaunty? How to turn it off?
I'm using Emacs and would like to bind Ctrl+M to some other command.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(8)
注意:该问题不仅限于 Linux,它也存在于 Windows(可能还有 Mac)上。阅读所有知识的其他(非堆栈溢出)来源:有关回车的维基百科。
如果您想重新绑定 Cm,请务必全部绑定
在普通的 Emacs 中,Enter/Return 键绑定到
尝试 Ch k
RET(翻译自
)
因此,在适当的键盘映射中重新绑定两者,以确保获得所需的行为。
使用以下代码可能会有所帮助:
(defun my-return ()
(interactive)
(message "return"))
(defun my-ret ()
(interactive)
(message "RET"))
(defun my-c-m ()
(interactive)
(message "C-m"))
(global-set-key (kbd "<return>") 'my-return)
(global-set-key (kbd "C-m") 'my-c-m)
(global-set-key (kbd "RET") 'my-ret)
将其放入 *scratch*
缓冲区中,并在每行后按 Cj (以评估 sexp)。然后使用 Enter/Return 键和 Cm 进行操作。
input-decode-map
就可以了。引用 emacs 手册:
此键映射与其他键映射具有相同的结构,但使用方式不同:它指定在读取键序列时进行的转换,而不是键序列的绑定。
这与我上面介绍的原理相同,将 Ctrl+m 转换为 Ctrl+1
并将 Ctrl+1 映射到您的命令。我使用 Ctrl+m 来表示 backward-kill-word
。
干得好:
(global-set-key (read-kbd-macro "C-1") 'backward-kill-word)
(define-key input-decode-map "\C-m" [?\C-1])
目前还不清楚前面的答案是否已经解决了这个问题,所以这里有另一个问题:
历史上,“return”通常意味着两件事:回车和换行。
引用维基百科:
最初,回车符是
机械装置或杠杆的术语
打字机会导致
盛放纸张的圆筒
(马车)返回左侧
一行文本之后的纸张一侧
已被输入,并且通常会移动
也将纸张移到下一行。
后来用于控制
博多码中的字符
用于行尾返回的电传打字机
到行首并且没有
包括换行。
长话短说,有两个 ASCII 代码与行尾相关(因此也可能与返回键相关):CR(ASCII 十进制 13,或 Ctrl-m)和 LF (ASCII 十进制 10,或 Ctrl-J)。
我认为现在的通用约定是将 return 或 enter 键映射到 ASCII 13,因此是“return”(RET
emacs 消息传递)。但如果您从终端模拟器运行 emacs,这可能意味着您无法选择使用与 RET
不同的 Cm 绑定。当我尝试在终端(MacOS X 上的 Terminal.app 中的 GNU Emacs 23.2.1)中运行 emacs 时,我尝试输入 Ch c
RET runs the command newline
如果我输入 Ch c Cm (即按住 control 并按 M),我得到:
RET runs the command newline
换句话说,完全相同的事情。 Emacs(或从终端运行的任何其他程序)无法区分两者之间的区别。 (了解这一点有时会很方便 - 如果您登录的系统与您所在的系统映射的内容不同,您可以键入 Cm 或 Cj 得到你想要的东西,这取决于映射被搞砸的方式。)
说到映射被搞砸,我只想提到有一些相关的 stty 设置诸如此类:inlcr
、inlcr
和 igncr
(这三个与输入的处理方式有关 - 还有一些与输出相关)的)。我怀疑进行 stty 更改对于这个特定问题是否有用,但我认为值得一提。
最后,我认为你的选择是:
生活在没有Cm的情况下,这意味着与返回/输入不同的东西
运行 emacs 的图形版本,而不是终端版本。这应该可以访问不同的键码,终端仿真器不会传递这些键码(因为它正在仿真终端,而终端没有像现代计算机那样具有此类功能)。
事实上,这是一个非常棘手的问题,你不会回答正确的:
(global-set-key (kbd "") 'newline)
因为返回 (RET) 在某些特定情况下是换行符。如果您在 .emacs 中尝试,您会发现我所说的奇怪之处,
我通过使用一些 KDE 事件应用程序找到了一个丑陋但有效的解决方案,并将 Ctrl+m 绑定到 Ctrl+1 。我选择它是因为我不会使用该组合 (Ctrl+1),但您可以选择其他组合。
这样,在 emacs 中(但在我的 X 环境中),当我按 Ctrl+m 时,我不会得到 RET(或换行符),而是得到 Ctrl+1。
然后,我做了类似的事情:
(global-set-key "\C-1" 'mycmd)
问题是,现在我使用很棒的窗口管理器,但我不知道如何再次进行 X 映射。
如果您不使用 KDE,您可以在 Gnome 中搜索类似的内容。
关于问题的本质,这里有一些很好的解释,我不会阐述这些问题。但是,我想直接回答原来的问题。我通过 ~/.xemacs/custom.el'newline
命令的 (control m)
序列的问题code> 文件:
(defun my-compile-hook-for-c-and-cpp-mode ()
"My compile hook for C and C++ mode"
(local-set-key [(control m)] 'compile)
)
(add-hook 'c-mode-hook 'my-compile-hook-for-c-and-cpp-mode)
(add-hook 'c++-mode-hook 'my-compile-hook-for-c-and-cpp-mode)
在上面的示例中,我已将 (control m)
更改为在 < code>c-mode 或 c++-mode
处于活动状态。
请注意,您也可以全局更改 (control m)
的行为,而无需模式相关的绑定。在这种情况下,只需将以下内容添加到您的 ~/.xemacs/custom.el
文件中:
(global-set-key [(control m)] 'compile)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我认为你的问题问反了。绑定到 Enter 的不是 Cm,而是 Enter 绑定到 Cm。而Cm与
RET
相同。如果运行 Ch k Cm,您将看到类似“
RET 运行命令...
”的内容。 Cm 发送RET
因为它是控制代码,请参阅 http://en.wikipedia.org/wiki/Control_character。Enter 键绑定到 Cm;如果您运行Ch k Enter,您将看到类似“然后该密钥将被转换为 Cm。
RET(翻译自)运行命令...
”的内容。请注意,Enter 被 emacs 解释为您要做的就是首先从中删除翻译通过将其直接绑定到当前间接绑定的内容来实现
RET
,例如(global-set-key (kbd "") 'newline)
。然后你就可以随意将 Cm 绑定到你想要的任何内容,而不会影响 Enter 键。这假设您使用的是图形化 emacs。如果您在终端中运行它,这将不起作用,因为 Enter 将发送 Cm,而不是。不过,您可以使用
window-system
变量进行检查。I think your question is backwards. It is not C-m that is bound to Enter, it is Enter that is bound to C-m. And C-m is the same as
RET
.If you run C-h k C-m, you will see something like "
RET runs the command ...
". C-m sendsRET
because it is a control code, see http://en.wikipedia.org/wiki/Control_character.The Enter key is bound to C-m; if you run C-h k Enter, you will see something like "
RET (translated from <return>) runs the command ...
". See, Enter is being interpreted by emacs as <return> and then that key is getting translated to C-m.What you want to do is first remove the translation from <return> to
RET
by binding it directly to what it's currently indirectly bound, e.g.(global-set-key (kbd "<return>") 'newline)
. Then you're free to bind C-m to whatever you want without affecting Enter.This assumes you're using the graphical emacs. If you're running it in a terminal, this won't work, because Enter will send C-m, not <return>. You can check that using the
window-system
variable though.