在终端中,无法区分 Ctrl + A 和 Ctrl + Shift + A 因为它们都发出相同的密钥代码,所以我可以看出为什么Vim不能这样做。但作为X应用程序的gVim可以区分 Ctrl + A 和 Ctrl + Shift + A 。有没有办法以不同的方式映射这两件事?
对于初学者,我想做类似以下的事情:使“从剪贴板粘贴”像Gnome终端一样工作,同时将 Ctrl + V 保持为视觉效果模式。
:nmap <C-S-V> "+gP
答案 0 :(得分:36)
Gvim没有这样做,因为vim无法做到(在正常情况下)。对不起,但就是这样。
...然而
某些终端(例如,xterm和iterm2)可以配置为为任何密钥组合发送任意转义序列。
例如,将以下内容添加到.Xresources
以便xterm发送<Esc>[65;5u
Ctrl Shift A 。然后,您可以将其在Vim中映射到<C-S-a>
。 (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也可以配置为执行此操作(未提供示例)。
答案 1 :(得分:6)
正如已经指出的那样,没有办法将<C-S-A>
与<C-A>
区别开来。
但是,使用autokey
(适用于Linux和Windows)或autohotkey
(适用于Windows)等工具,您可以重新映射<C-S-A>
以发送不同的键击具体应用。
e.g。在我的系统上,我在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
可以为<S-F1>a
创建映射,以执行您想要的任何操作。
注意:
<S-F1>
作为检测<C-S>
的领导键。这是因为我的终端不接受<F13>
- <F37>
等密钥。如果您的应用程序支持它,(我认为gvim
)建议使用这些密钥。vim
gnome-terminal
。所以我使用window class = gnome-terminal-server.Gnome-terminal
作为过滤器。如果需要,可将其修改为使用gvim
。 autokey
支持用于捕获任何其他窗口属性的按钮,如类/标题。答案 2 :(得分:5)
如果困扰您的是丢失现有的C-V功能,您可以使用C-Q代替。请参阅:帮助CTRL-V-alternative。
答案 3 :(得分:1)
正如您所指出的,您获得了相同的密钥代码。因此区分它们的唯一方法是检查事件处理函数中 Shift 键的状态。当然,如果你在按键和处理之间有超过0.5秒的延迟,你就会错过一些点击。
答案 4 :(得分:1)
由于内部处理键盘输入的方式,遗憾的是,即使在GVIM中,这在今天也是不可能的。某些组合键,例如 Ctrl +非字母无法映射, Ctrl + letter vs. Ctrl + Shift +字母无法区分。 (除非您的终端为其发送不同的 termcap 代码,但大多数代码都没有。)在插入或命令行模式下,尝试键入组合键。如果没有任何反应/插入,则无法使用该组合键。这也适用于<Tab>
/ <C-I>
,<CR>
/ <C-M>
/ <Esc>
/ <C-[>
等。(只有<BS>
例外/ <C-H>
。)这是一个众所周知的痛点,也是关于vim_dev和#vim IRC频道的各种讨论的主题。
有些人(最重要的是Paul LeoNerd Evans)希望解决这个问题(即使是支持Vim的终端中的控制台Vim),并提出了各种提案,cp。 http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8
但截至今天,尚未有任何补丁或志愿者挺身而出,尽管许多人表示希望在未来的Vim版本中实现这一目标。
答案 5 :(得分:0)
默认情况下,大多数终端模拟器将控制加移位简单地视为控制。相反,您通常将这些组合键映射到一个转义序列,然后在终端应用程序内部监听。
步骤 1: 配置您的终端模拟器以将 Ctrl+Shift+A 绑定到序列 Esc,A.
您的终端模拟器是显示终端实际窗口的程序。通过 SSH 访问服务器时,终端模拟器是本地计算机上的程序。绑定键在不同的终端仿真器中的工作方式不同。例如:
URxvt.keysym.Control-Shift-A: \033A
添加到 ~/.Xresources
配置文件并使用 xrdb ~/.Xresources
重新加载。A
。第 2 步: 将 Esc,A 绑定到 Vim 中的命令。
将键映射添加到您的 ~/.vimrc
配置并使用 :source ~/.vimrc
重新加载:
nnoremap <esc>a your command here
答案 6 :(得分:-1)
NeoVim现在为其终端和gui客户端提供此功能。见:h nvim-features-new