Emacs在控制台中无法使用Ctrl修饰键

4

我在Emacs的GUI模式下,为dired设置了两个热键:

(add-hook 'dired-mode-hook
  (lambda ()
        (define-key dired-mode-map (kbd "C-<up>")
              (lambda () (interactive) (find-alternate-file "..")))))

(add-hook 'dired-mode-hook
  (lambda ()
        (define-key dired-mode-map (kbd "C-<right>") 'diredp-find-file-reuse-dir-buffer)))

但是当我在控制台中按下CTRL+CTRL+时,光标只会像按下箭头一样移动。

当我尝试使用CTRL+HK然后CTRL+时,它给出了正确的键文档,就好像根本没有按下CTRL一样。

如何解决控制台中的这种奇怪行为?

我正在使用Linux Slackware 14,Emacs 24.2.1。


什么是“console”?我猜是终端仿真器,但是哪一个?在bash提示符(或其他基于“readline”的提示符)中,键是否按预期工作,例如C-a是行的开头。 - pmr
是的,终端仿真器在没有X窗口的文本模式下工作。是的,Ctrl键可以使用:C-a,C-k可以正常工作。但是C-right,C-up不能。 - user4035
1
我认为这个是答案。 - legoscia
3个回答

4
这里是一个算法,它可以让Emacs在终端中使用修改键。
1.创建一个名为funcskeys的文件,并填充以下内容:
control keycode 105 = F100
string F100 = "\033[1;5D"
control keycode 106 = F101
string F101 = "\033[1;5C"
control keycode 103 = F102
string F102 = "\033[1;5E"
altgr keycode 105 = F103
string F103 = "\033[1;5F"

最后必须有一个空行!

2.在root下加载文件:

#loadkeys funcskeys

3.将以下内容放入.emacs文件的开头:

(unless (display-graphic-p)
  (progn
    (define-key input-decode-map "\e[1;5C" [(control right)])
    (define-key input-decode-map "\e[1;5D" [(control left)])
    (define-key input-decode-map "\e[1;5E" [(control up)])
    (define-key input-decode-map "\e[1;5F" [(meta left)])))

算法结束

在此之后,热键将可用:

(global-set-key (kbd "C-<right>") 'forward-word)
(global-set-key (kbd "C-<left>") 'backward-word)

2
你的终端可能不会为 CTRL-rightright 产生不同的转义序列。
你可以通过键入 CTRL-v CTRL-rightCTRL-v right 来验证。这里,CTRL-v 告诉终端打印接下来键的转义序列。如果这两个序列产生相同的结果,则表示你的终端无论按不按下CTRL键都会发送相同的信息给Emacs。
例如,在Gnome终端中输入这些快捷键,我得到以下结果:
  • CTRL-v right 的结果是 ^[[C
  • CTRL-v CTRL-right 的结果是 ^[[1;5C
当我在Linux控制台中执行相同的操作时,我得到以下结果:
  • CTRL-v right 的结果是 ^[[C
  • CTRL-v CTRL-right 的结果也是 ^[[C
如你所见,对于后一种情况,两个键序列的结果完全相同,因此 Emacs 无法区分它们。
唯一的解决方法是说服你的终端在你按下 CTRL 键时发送一个不同的序列 - 参见这个问题获取更多信息。
一个更容易的解决方法是在Emacs中使用不同的键绑定。

这是一项艰巨的任务,但不要太快放弃。 - user4035

1

注意使用loadkeys命令。在Debian/Ubuntu中,它至少包含在kbd软件包中。使用它,您可以修改键盘布局,可能还可以添加一些更“奇特”的按键组合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接