我希望能够在 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>
使用控制修饰符一样,在文件中可以表示.emacs
为C-<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 无法访问硬件按键事件,因此它受到终端环境限制的约束。
对于某些终端程序,当您按下 时,可能会生成自定义输入序列(例如当您按下 时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>")))
在这个例子中,是我在终端上M-[ 1 ^
按下时生成的输入序列。CTRL-<Home>
这不是一个非常便携的解决方案(我主要使用 putty 从 windows 访问我的 linux 机器,但它不允许这样做),所以你的里程可能会有所不同。
最后,我决定在我的 .emacs 上使用另一个键绑定,并让肌肉记忆CTRL-<TAB>
消失。