为什么Ctrl + M绑定在Ubuntu Jaunty中输入?如何关闭它?
我正在使用Emacs,并希望将Ctrl + M绑定到其他命令。
答案 0 :(得分:32)
我认为你的问题是倒退的。它不是 C-m 绑定到 Enter ,它是绑定到 C-m 的Enter。 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 ...
”的内容。请参阅,emacs将 Enter 解释为&lt; return&gt;然后该密钥被转换为 C-m 。
您要做的是首先从&lt; return&gt;中删除翻译。通过将其直接绑定到它当前间接绑定的内容来到RET
,例如(global-set-key (kbd "<return>") 'newline)
。然后你可以自由地将 C-m 绑定到你想要的任何内容而不会影响Enter。
这假设您正在使用图形化emacs。如果您在终端中运行它,这将无效,因为Enter将发送C-m,而不是&lt; return&gt;。您可以使用window-system
变量检查它。
答案 1 :(得分:7)
注意:问题不仅限于Linux,它也存在于Windows(也可能是Mac)上。阅读所有知识的另一个(非堆栈溢出)来源:Wikipedia on Carriage Return。
如果要重新绑定 Cm ,请确保所有绑定&lt; return&gt; ,否则您将面临无法再使用Enter / Return键的风险。此外,在终端中,Emacs无法区分两者( C-m 和&lt; return&gt; )。
在简单的Emacs中,Enter / Return键绑定到&lt; return&gt; ,这是(默认情况下)转换为 RET (与 CM )。如果你只反弹 C-m ,你也会影响Enter / Return键。
尝试 C-h k&lt; return&gt; ,你会看到
RET(翻译自&lt; return&gt;)
因此,请在相应的键盘映射中重新绑定,以确保获得所需的行为。
使用以下代码可能会有所帮助:
(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 进行播放。
答案 2 :(得分:5)
input-decode-map
可以解决问题。引用emacs手册:
此键映射具有与其他键映射相同的结构,但使用方式不同:它指定在读取键序列时进行的翻译,而不是键序列的绑定。
这与我上面提到的原理相同,将 Ctrl + m 转换为某些内容,例如 Ctrl + 1 < / KBD>
并将 Ctrl + 1 映射到您的命令。我对backward-kill-word
使用 Ctrl + m 。
你走了:
(global-set-key (read-kbd-macro "C-1") 'backward-kill-word)
(define-key input-decode-map "\C-m" [?\C-1])
答案 3 :(得分:3)
目前还不清楚之前的答案是否已经解决了这个问题,所以这是另一个问题:
历史上,“ return ”经常意味着两件事:回车和换行。
引用wikipedia:
最初,回车是 一个机制或杠杆的术语 打字机,会导致 拿着纸的圆筒 (马车)返回左侧 一行文字后的一面纸 已打字,通常会移动 这篇论文也在下一行。 后来它被用于控制 Baudot代码中的字符 电传打字机用于线路返回 到行的开头并没有 包括换行。
长话短说,有两个与行尾相关的ASCII码(因此可能与返回键相关):CR(ASCII十进制13,或 Ctrl-m )和LF(ASCII十进制10,或 Ctrl-J )。
我认为现在的一般约定是 return 或输入键映射到ASCII 13,因此是“return”(RET
in emacs消息)。但是,如果您从终端模拟器运行emacs,这可能意味着您无法选择与RET
不同的 C-m 绑定。当我尝试在终端中运行emacs(在Terminal.app中的MacOS X上的GNU Emacs 23.2.1)时,我尝试输入 Ch c&lt; return&gt; (即按下我的return / enter键),我明白了:
RET runs the command newline
如果我输入 C-h c C-m (即按住控制并按下M),我得到:
RET runs the command newline
换句话说,完全相同的事情。 Emacs(也没有从终端运行的任何其他程序)无法区分这两者。 (知道这有时候很方便 - 如果你登录的系统映射的东西与你来的系统不同,你可以输入 Cm 或 Cj 获得你想要的东西,取决于映射被搞砸的方式。)
说到映射搞砸了,我只会提到有些stty
设置可能与这些事情相关:inlcr
,inlcr
和{{ 1}}(这三个与输入处理方式有关 - 还有一些与输出相关的输入)。我怀疑做出很多改变会对这个特殊问题有用,但我认为值得一提。
最后,我认为您的选择是:
生活时没有 C-m 这意味着任何不同于 return / 进入
运行emacs的图形版本,而不是终端版本。这应该可以访问终端模拟器没有传递的不同密钥代码(因为它模拟了一个终端,它没有现代计算机那样的东西)。
答案 4 :(得分:2)
(global-set-key(kbd“C-m”)'cmd);
其中 cmd 是你的命令应该重新映射控制m ...
至于为什么要输入ctrl + m。我相信它与一些没有输入,标签,退格等的旧键盘有关...(我可能会非常误)
例如ctrl + h是退格键,当你点击退格键时,一些unix操作系统会输出^ H!
答案 5 :(得分:2)
问题的主要原因是Enter和Ctrl-M都映射到相同的ASCII码(13)。您只能在可以区分它们的系统上清楚地映射它们。
答案 6 :(得分:2)
实际上,这是一个非常棘手的问题,你将无法正确使用: (global-set-key(kbd“”)'换行符)
因为在某些特定情况下,返回(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中搜索类似的内容。
答案 7 :(得分: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)
在上面的示例中,当(control m)
或'compile
处于活动状态时,我已更改M-x compile
以运行c-mode
命令(c++-mode
)。
请注意,您也可以全局更改(control m)
的行为,而不使用与模式相关的绑定。在这种情况下,只需将以下内容添加到~/.xemacs/custom.el
文件中:
(global-set-key [(control m)] 'compile)