如何在Linux中使用Ctrl + M关闭备用Enter

时间:2010-02-19 18:57:22

标签: emacs key-bindings

为什么Ctrl + M绑定在Ubuntu Jaunty中输入?如何关闭它?

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

8 个答案:

答案 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设置可能与这些事情相关:inlcrinlcr和{{ 1}}(这三个与输入处理方式有关 - 还有一些与输出相关的输入)。我怀疑做出很多改变会对这个特殊问题有用,但我认为值得一提。

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

  1. 生活时没有 C-m 这意味着任何不同于 return / 进入

  2. 运行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)