gnome-terminal 中 Emacs 中 Ctrl tab 键绑定的问题

Tom*_*Tom 5 linux ubuntu emacs key-bindings

我希望能够在 Emacs 中的两个缓冲区之间来回翻转,就像我可以在其他一些编辑器中的选项卡之间翻转一样。以下Ctrl+TAB键绑定在XEmacs 中运行良好:

(defun buffer-shimmy ()
  "Back to the previous buffer"
  (interactive)
  (let ((buff (car (buffer-list))))
    (message "Previous buffer: %s" buff)
    (switch-to-buffer (other-buffer buff))
   )
)
(global-set-key (kbd "<C-tab>") 'buffer-shimmy)
;; or (define-key global-map [(control tab)] 'buffer-shimmy) 
Run Code Online (Sandbox Code Playgroud)

但是,当我使用“emacs -nw ”(或者如果我在 SSH 会话中使用 Emacs)打开 Emacs 时,它不起作用。

找到此链接后- 我想也许我想要的是不可能的?

显然,在终端(即窗口系统之外)为“TAB”的 ASCII 字符添加控制修饰符是无意义的。然而,如果通过窗口系统,Emacs 可以看到您按Ctrl+TAB作为<tab>控制修饰符,它可以在.emacs文件中表示为C-<tab>or<C-tab>[(control tab)]

是否有解决此问题的解决方法?

参考软件:Emacs 版本:22.2.1 在 Ubuntu 9.04 上使用 gnome-terminal 和默认配置文件。

小智 7

不幸的是,对于在终端窗口中运行的 emacs 客户端,没有一种适合所有情况的解决方案。问题出现是因为<TAB>字符被定义为CTRL-I,所以CTRL-<TAB>意味着CTRL-CTRL-I,所以是不可能的。

当 emacs 在窗口模式下运行时,它直接从按键接收输入。当它在终端内运行时(或者如果它能让事情更清楚为什么它不起作用 - 在 ssh 连接上),输入来自终端 I/O。终端程序读取硬件按键事件,并生成输入流(不是很准确,但突出了问题)。Emacs 读取输入流并转换为按键事件。由于emacs无法访问硬件按键事件,因此受到终端环境的限制。

对于某些终端程序,可能会在您按下F1时生成自定义输入序列(例如按下 时)CTRL-<Tab>,然后 Emacs 会将其解释为CTRL-<Tab>。执行此操作的示例代码段CTRL-<Home>是:

(when (not window-system)
  ; Fixup missing console keys
  (define-key key-translation-map (kbd "M-[ 4 ^") (kbd "C-<end>"))
  (define-key key-translation-map (kbd "M-[ 1 ^") (kbd "C-<home>")))
Run Code Online (Sandbox Code Playgroud)

在这个例子中,M-[ 1 ^是我按下CTRL-<Home>终端时生成的输入序列。

这不是一个非常便携的解决方案(我主要使用 putty 从 Windows 访问我的 linux box,它不允许),所以你的里程可能会有所不同。

最后,我决定在我的 .emacs 上使用另一个键绑定,让肌肉记忆CTRL-<TAB>消失。