我有两个针对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。
答案 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
中。有了它,您可以修改键盘布局,也可能修改一些“异国情调”的键组合。