在终端中,无法区分Ctrl+A和Ctrl+ Shift+ A,因为它们都发出相同的键码,所以我明白为什么 Vim 不能做到这一点。但是 gVim 作为 X 应用程序,可以区分Ctrl+A和Ctrl++ 。有没有办法以不同的方式映射这两件事?ShiftA
对于初学者,我想做以下事情:让“从剪贴板粘贴”像 Gnome 终端一样工作,同时保持Ctrl+V到可视模式。
:nmap <C-S-V> "+gP
在终端中,无法区分Ctrl+A和Ctrl+ Shift+ A,因为它们都发出相同的键码,所以我明白为什么 Vim 不能做到这一点。但是 gVim 作为 X 应用程序,可以区分Ctrl+A和Ctrl++ 。有没有办法以不同的方式映射这两件事?ShiftA
对于初学者,我想做以下事情:让“从剪贴板粘贴”像 Gnome 终端一样工作,同时保持Ctrl+V到可视模式。
:nmap <C-S-V> "+gP
Gvim 不这样做是因为 vim 不能这样做(在正常情况下)。对不起,但事情就是这样。
然而...
一些终端(例如,xterm 和 iterm2)可以配置为发送任意键组合的任意转义序列。
例如,将以下内容添加到for .Xresources
xterm 以发送. 然后,您可以在 Vim 中将其映射到. (65 是 shift-a 的十进制 Unicode 值,5 是 ctrl 修饰符的位。在这种情况下,u 代表“unicode”。)<Esc>[65;5u
CtrlShiftA<C-S-a>
! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")
iTerm 和 [u]rxvt 也可以配置为执行此操作(未提供示例)。
更多信息: http: //www.leonard.org.uk/hacks/fixterms/
正如已经指出的那样,没有办法<C-S-A>
与<C-A>
.
但是,使用autokey
(for linux & windows) 或autohotkey
(for windows) 之类的工具,您可以重新映射<C-S-A>
以针对特定应用程序发送不同的击键。
例如在我的系统上,我有这个设置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>
etc 键。如果您的应用程序支持它,(gvim
我认为)建议使用这些键。vim
在gnome-terminal
. 所以我用作window class = gnome-terminal-server.Gnome-terminal
过滤器。gvim
如果需要,可以修改它以使用。autokey
支持用于捕获任何其他窗口属性(如类/标题)的按钮。由于键盘输入在内部处理的方式,不幸的是,这在今天通常是不可能的,即使在 GVIM 中也是如此。某些组合键,如Ctrl+ 非字母无法映射,Ctrl+ 字母与Ctrl+ Shift+ 字母无法区分。(除非您的终端为它发送一个不同的termcap代码,而大多数人不会。)在插入或命令行模式下,尝试键入组合键。如果没有任何反应/插入,则不能使用该组合键。这也适用于<Tab>
/ <C-I>
, <CR>
/ <C-M>
/ <Esc>
/<C-[>
等(唯一的例外是<BS>
/ <C-H>
。)这是一个已知的痛点,也是 vim_dev 和 #vim IRC 频道上各种讨论的主题。
一些人(最重要的是 Paul LeoNerd Evans)想要解决这个问题(即使是支持这个的终端中的控制台 Vim),并提出了各种建议,cp。http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8
但截至今天,还没有补丁或志愿者出现,尽管许多人表示希望在未来的 Vim 版本中拥有这个。
如果困扰您的是失去现有的 CV 功能,您可以改用 CQ。请参阅 :help CTRL-V-alternative。
NeoVim 现在为其终端和 gui 客户端提供此功能。请参阅:h nvim-features-new
正如您所指出的,您将获得相同的密钥代码。所以区分它们的唯一方法是检查Shift事件处理函数中键的状态。当然,如果你在按键和处理之间有超过 0.5 秒的延迟,你会错过一些点击。
大多数终端仿真器默认将控制加移位简单地视为控制。相反,您通常将这些组合键映射到转义序列并在终端应用程序中收听。
第1步:配置您的终端仿真器以将Ctrl++绑定到序列, .ShiftAEscA
您的终端模拟器是显示终端实际窗口的程序。通过 SSH 访问服务器时,终端仿真器是本地计算机上的程序。绑定键在不同的终端仿真器中的工作方式不同。例如:
URxvt.keysym.Control-Shift-A: \033A
到~/.Xresources
配置文件并使用xrdb ~/.Xresources
.A
第 2 步:Esc将,绑定A到 Vim 中的命令。
将键映射添加到您的~/.vimrc
配置并重新加载它:source ~/.vimrc
:
nnoremap <esc>a your command here