16

为什么 Ctrl+M 在 Ubuntu Jaunty 中必须输入 Enter?如何关闭它?

我正在使用 Emacs 并想将 Ctrl+M 绑定到其他命令。

4

8 回答 8

34

我认为你的问题是倒退的。不是C-mthat 绑定到Enter,而是 Enter 绑定到C-m。和C-m是一样的RET

如果你运行C-h k C-m,你会看到类似“ RET runs the command ...”的东西。C-m发送RET,因为它是控制代码,请参阅http://en.wikipedia.org/wiki/Control_character

密钥Enter绑定到; C-m如果你运行C-h k Enter,你会看到类似“ RET (translated from <return>) runs the command ...”的东西。看,Enter被 emacs 解释为 <return> 然后那个键被翻译成C-m.

您要做的是首先RET通过将其直接绑定到当前间接绑定的内容(例如(global-set-key (kbd "<return>") 'newline). 然后你可以自由地绑定C-m到你想要的任何东西,而不会影响 Enter。

这假设您使用的是图形 emacs。如果您在终端中运行它,这将不起作用,因为 Enter 将发送 Cm,而不是 <return>。您可以使用window-system变量进行检查。

于 2010-02-19T19:22:17.917 回答
7

注意:问题不仅限于 Linux,它也存在于 Windows(可能还有 Mac)上。阅读所有知识的另一个(非堆栈溢出)来源:Wikipedia on Carriage Return

如果要重新绑定C-m,请确保全部绑定,<return>否则您将面临无法再使用 Enter/Return 键的风险。此外,在终端中,Emacs 无法区分两者 (C-m<return>)。

在普通的 Emacs 中,Enter/Return 键绑定到<return>,(默认情况下)翻译为RET(与 相同C-m)。如果你只反弹C-m,你也会影响 Enter/Return 键。

试试看C-h k <return>,你会看到

RET(翻译自 <return>)

因此,在适当的键盘映射中重新绑定两者以确保您获得所需的行为。

使用以下代码可能很有启发性:

(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*缓冲区并C-j在每行之后按(以评估性)。然后使用 Enter/Return 键和C-m.

于 2010-02-19T19:22:27.727 回答
5

input-decode-map成功了。引用emacs手册:

此键映射与其他键映射具有相同的结构,但使用方式不同:它指定在读取键序列时要进行的翻译,而不是键序列的绑定。

这与我上面介绍的原理相同,将Ctrl+转换m为某物,例如Ctrl+并将+1 映射到您的命令。我用+表示。Ctrl1Ctrlmbackward-kill-word

干得好:

(global-set-key (read-kbd-macro "C-1") 'backward-kill-word)
(define-key input-decode-map "\C-m" [?\C-1])
于 2010-11-29T18:28:45.837 回答
3

目前尚不清楚之前的答案是否已经解决了这个问题,所以这里有另一个旋转:

从历史上看,“ return”通常意味着两件事:回车和换行。

引用维基百科

最初,回车是打字机上的一种机构或杠杆的术语,它会在输入一行文本后导致保持纸张的圆柱体(马车)返回到纸张的左侧,并且会通常也将纸张移动到下一行。后来它被用于电传打字机上 Baudot 代码中的控制字符,用于行尾返回到行首,并且不包括换行符。

长话短说,有两个 ASCII 代码与行尾相关(因此可能与返回键相关):CR(ASCII 十进制 13,或Ctrl-m)和 LF(ASCII 十进制 10,或Ctrl-J)。

我认为这些天的一般约定是将returnorenter键映射到 ASCII 13,因此是“返回”(RET在 emacs 消息中)。但是,如果您从终端仿真器运行 emacs,这可能意味着您无法选择使用C-m不同于RET. 当我尝试在终端中运行 emacs(在 Terminal.app 中的 MacOS X 上的 GNU Emacs 23.2.1)并尝试输入C-h c <return>(即按我的返回/输入键)时,我得到:

RET runs the command newline

相反,如果我键入C-h c C-m(即按住 control 并按 M),我会得到:

RET runs the command newline

换句话说,完全相同的东西。Emacs(也不是从终端运行的任何其他程序)无法区分两者之间的区别。(知道这一点有时会很方便——如果您登录的系统映射的东西与您来自的系统不同,您可以键入C-mC-j获取您想要的东西,具体取决于映射的方式向上。)

说到搞砸映射,我只想提一下,有一些stty设置可能与这些事情相关:inlcrinlcrigncr(这三个与输入的处理方式有关 - 还有一些与输出相关的设置)。我怀疑进行 stty 更改是否会对这个特定问题有用,但我认为值得一提。

最后,我认为您的选择是:

  1. 生活在没有C-m这意味着任何与return/不同的地方enter

  2. 运行 emacs 的图形版本,而不是终端版本。这应该可以访问终端模拟器没有传递的不同键码(因为它正在模拟一个终端,它没有像现代计算机那样拥有这样的东西)。

于 2010-12-01T07:55:53.010 回答
2

(global-set-key (kbd "C-m") 'cmd) ;

Where cmd is your command should remap control m...

As for why ctrl+m is bound to enter. I believe it had something to do with some older keyboard not having enter,tab, backspace, etc... ( I could be grossly mistaken)

For example ctrl+h is backspace, some unix operating systems will output ^H when you hit backspace on them!

于 2010-02-19T19:12:59.247 回答
2

实际上,这是一个非常棘手的问题,你不会用: (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 中搜索类似的东西。

于 2010-11-28T23:36:26.413 回答
2

问题的主要来源是 Enter 和 Ctrl-M 都映射到相同的 ASCII 代码 (13)。您只能将它们清楚地映射到可以区分它们的系统上。

于 2010-02-19T19:23:30.737 回答
2

对于问题的性质,这里有一些很好的解释,我不会详细说明这些问题。但是,我想直接解决原始问题。我通过文件中的以下代码解决了更改(control m)绑定到命令的序列的问题:'newline~/.xemacs/custom.el

(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)

在上面的示例中,我已更改为在or处于活动状态时(control m)运行'compile命令 ( M-x compile) 。c-modec++-mode

请注意,您也可以更改(control m)全局的行为,而无需模式相关的绑定。在这种情况下,只需将以下内容添加到您的~/.xemacs/custom.el文件中:

(global-set-key [(control m)] 'compile)
于 2012-06-01T00:45:02.283 回答