如何以不同的方式映射Ctrl + A和Ctrl + Shift + A?
在一个terminal中,不能区分Ctrl + A和Ctrl + Shift + A,因为它们都发出相同的密钥,所以我可以看出vim为什么不能这样做。 但gvim是一个X应用程序,可以区分Ctrl + A和Ctrl + Shift + A。 那么有没有什么办法来区分这两个东西呢?
对于初学者,我想做类似以下的事情,使“从剪贴板粘贴”像gnometerminal工作,同时保持Ctrl + V的视觉模式。
:nmap <CSV> "+gP
Gvim不这样做,因为vim不能这样做(在正常情况下)。 对不起,但是这是怎么回事。
然而…
某些terminal(例如xterm和iterm2)可以configuration为发送任意密钥组合的任意转义序列。
例如,为xterm添加以下内容到.Xresources
以发送<Esc>[65;5u
用于Ctrl Shift A。 然后你可以在Vim中将它映射到<CSa>
。 (65是shift-a的十进制Unicode值,5是ctrl修饰符的位,这里的u代表“unicode”)。
! .Xresources XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")
iTerm和[u] rxvt也可以configuration为执行此操作(未提供示例)。
更多信息: http : //www.leonerd.org.uk/hacks/fixterms/
如果困扰您的是失去现有的CVfunction,您可以使用CQ代替。 请参阅:帮助CTRL-V-alternative。
正如你所指出的,你得到相同的键码。 所以区分它们的唯一方法是检查事件处理函数中的Shift键的状态。 当然,如果你在按键和处理之间有超过0.5秒的延迟,你会错过一些命中。
NeoVim现在为它的terminal和gui客户提供这个function。 请参阅:h nvim-features-new
正如已经指出的,没有办法将<CSA>
与<CA>
分开来。
但是,使用诸如autokey
(用于linux和windows)或autohotkey
(用于windows)的工具,可以重新映射<CSA>
以针对特定应用程序发送不同的关键笔划。
例如在我的系统上,我在autokey
有这个设置:
$ cat ~/.config/autokey/data/gnome-terminal/ctrlshifta-gnome-terminal.py #ctrl+shift+a sends '<S-F1>a' keyboard.send_keys("<shift>+<f1>a") # Note that `f` in `f1` needs to be in lower case.
分配这些属性:
- 键盘快捷键为
ctrl+shift+a
- 窗口类:
gnome-terminal-server.Gnome-terminal
然后你的~/.vimrc
可以创build<S-F1>a
映射来做你想做的任何事情。
笔记:
- 我用
<S-F1>
作为检测<CS>
的引导键。 这是因为我的terminal不接受<F13>
–<F37>
等键。 如果你的应用程序支持它,(gvim
我觉得)使用这些键是build议的。 - 我主要在
gnome-terminal
vim
。 所以我用window class = gnome-terminal-server.Gnome-terminal
作为filter。 修改它以使用gvim
如果你想。autokey
支持一个button来捕获任何其他窗口的属性,如类/标题。