gnome 终端中 Emacs 中的 Ctrl Tab 键绑定问题

gnome 终端中 Emacs 中的 Ctrl Tab 键绑定问题

我希望能够在 Emacs 的两个缓冲区之间来回切换,就像在其他编辑器中切换选项卡一样。以下Ctrl+TAB键绑定在埃马克斯

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

但是,当我使用“emacs-nw“(或者如果我在 SSH 会话中使用 Emacs)。

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

显然,在终端中(即窗口系统之外),向 ASCII 字符“TAB”添加控制修饰符是没有意义的。然而,如果通过窗口系统,Emacs 可以看到您按下Ctrl+TAB就像<tab>使用控制修饰符一样,在文件中可以表示.emacsC-<tab><C-tab>[(control tab)]

是否有解决方法可以解决此问题?

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

答案1

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

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

对于某些终端程序,当您按下 时,可能会生成自定义输入序列(例如当您按下 时F1CTRL-<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>")))

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

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

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

相关内容