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

Ale*_*lex 14 emacs key-bindings

为什么Ctrl + M绑定到Ubuntu Jaunty中的Enter?如何关闭它?

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

Eri*_*ven 32

我认为你的问题是倒退的.它不是C-m必然的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 ..."的东西.请参阅,Enteremacs将其解释为<return>,然后该密钥将被转换为C-m.

你想要做的是首先从<return>中删除转换,RET直接将它绑定到它当前间接绑定的内容,例如(global-set-key (kbd "<return>") 'newline).然后你可以随意绑定C-m到你想要的任何内容而不会影响Enter.

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

  • "然后你就可以自由地将Cm绑定到你想要的任何地方,而不会影响Enter." - 好吧......错!一方面,配方在迷你缓冲区上下文中打破<return>行为. (7认同)

Tre*_*son 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)
Run Code Online (Sandbox Code Playgroud)

把它放在你的*scratch*缓冲区中并按下C-j每一行后(评估sexp).然后使用Enter/Return键和C-m.


Ste*_*anH 5

input-decode-map诀窍.来自emacs手册的报价:

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

这就像我上面提出的,转化的原理相同Ctrl+ m的东西,说Ctrl+ 1 和地图Ctrl+ 1你的命令.我用Ctrl+ mbackward-kill-word.

干得好:

(global-set-key (read-kbd-macro "C-1") 'backward-kill-word)
(define-key input-decode-map "\C-m" [?\C-1])
Run Code Online (Sandbox Code Playgroud)


Sum*_*son 2

(全局设置键(kbd“Cm”)'cmd);

其中cmd是你的命令应该重新映射控制m...

至于为什么ctrl+m一定要进入。我相信这与一些旧键盘没有输入,制表符,退格键等有关......(我可能是严重错误的)

例如ctrl+h是退格键,一些unix操作系统在你按退格键时会输出^H!