Emacs Ctrl修饰符在控制台中不起作用

时间:2012-10-29 23:56:50

标签: emacs console hotkeys

我有两个针对dired的热键,它在Emacs中以GUI模式工作:

(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 + H K 然后 CTRL + ,它给了我正确的密钥文档,好像根本没有按下 CTRL

如何在控制台中修复这种奇怪的行为?

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

3 个答案:

答案 0 :(得分:3)

这是算法,如何使修饰键在终端的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)])))

algorythm结束

此热键可用后:

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

答案 1 :(得分:1)

您的终端可能不会为 CTRL-right 而不是 right 生成不同的转义序列。

您可以通过键入 CTRL-v CTRL-right CTRL-v right 轻松验证这一点。这里, CTRL-v 告诉终端打印后面的密钥的转义序列。如果这两个序列生成相同的序列,那么无论您是否按CTRL键,终端都会向Emacs发送完全相同的信息。

例如,如果我在Gnome终端中输入这些快捷方式,我会得到:

  • ^[[C代表 CTRL-v right
  • ^[[1;5C代表 CTRL-v CTRL-right

当我在其中一个Linux控制台上执行相同操作时,我得到:

  • ^[[C代表 CTRL-v right
  • ^[[C代表 CTRL-v CTRL-right

正如您所看到的,在后一种情况下,两个键序列的结果完全相同,因此Emacs无法区分这两个键。

解决此问题的唯一方法是在按住 CTRL 键时说服终端发送不同的序列 - 有关详细信息,请参阅this question

更简单的解决方法是在Emacs中简单地使用不同的键绑定。

答案 2 :(得分:1)

留意loadkeys。至少在Debian / Ubuntu中它位于包kbd中。有了它,您可以修改键盘布局,也可能修改一些“异国情调”的键组合。