在gnome-terminal中的Emacs中,按住Ctrl键的问题

我希望能够在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) 

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

find这个链接后 – 我想也许我想要的是不可能的?

显然,在terminal(即在窗口系统之外)添加一个控制修饰符到“TAB”的ASCII字符是无意义的。 而如果通过窗口系统进行操作,Emacs可以看到你按下Ctrl + Tab作为<tab>并带有一个控制修饰符,它可以在.emacs文件中表示为C-<tab><C-tab>[(control tab)]

有没有解决这个问题的解决方法?

参考软件:Ubuntu 9.04上的Emacs版本:22.2.1使用默认configuration文件的gnome-terminal。

不幸的是,在terminal窗口中运行的emacs客户端没有一个适合所有的解决scheme。 问题出现了,因为<TAB>字符被定义为CTRL-I ,所以CTRL-<TAB>将意味着CTRL-CTRL-I ,所以不可能。

当emacs以窗口模式运行时,它直接从按键接收input。 当它在terminal内部运行时(或者为什么它不能工作 – 在ssh连接上),input来自terminalI / O。 terminal程序读取硬件按键事件,并生成inputstream(不是很准确,但突出显示了问题)。 Emacs读取inputstream并转换为按键事件。 由于emacs无法访问硬件按键事件,因此受到terminal环境的限制。

对于某些terminal程序,当按下CTRL-<Tab> ,可以生成一个自定义的input序列(例如当你按下F1 ),然后可以被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 ^是我在terminal中按CTRL-<Home>时产生的input序列。

这不是一个非常便携的解决scheme(我主要使用腻子从Windows访问我的Linux的盒子,它不允许它),所以你的里程可能会有所不同。

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