如何以不同的方式映射Ctrl + A和Ctrl + Shift + A?

在一个terminal中,不能区分Ctrl + ACtrl + Shift + A,因为它们都发出相同的密钥,所以我可以看出vim为什么不能这样做。 但gvim是一个X应用程序,可以区分Ctrl + ACtrl + 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. 

分配这些属性:

  1. 键盘快捷键为ctrl+shift+a
  2. 窗口类: gnome-terminal-server.Gnome-terminal

然后你的~/.vimrc可以创build<S-F1>a映射来做你想做的任何事情。


笔记:

  1. 我用<S-F1>作为检测<CS>的引导键。 这是因为我的terminal不接受<F13><F37>等键。 如果你的应用程序支持它,( gvim我觉得)使用这些键是build议的。
  2. 我主要在gnome-terminal vim 。 所以我用window class = gnome-terminal-server.Gnome-terminal作为filter。 修改它以使用gvim如果你想。 autokey支持一个button来捕获任何其他窗口的属性,如类/标题。