在终端中,人们无法区分Ctrl+ A和Ctrl+ Shift+,A因为它们都发出相同的密钥代码,所以我可以看出为什么Vim不能这样做.但作为X应用程序的gVim可以区分Ctrl+ A和Ctrl+ Shift+ A.有没有办法以不同的方式映射这两件事?
对于初学者,我想做类似以下的事情:使"从剪贴板粘贴"像Gnome终端一样工作,同时保持Ctrl+ V到视觉模式.
:nmap <C-S-V> "+gP
Run Code Online (Sandbox Code Playgroud)
gra*_*ywh 40
Gvim没有这样做,因为vim不能这样做(在正常情况下).对不起,但就是这样.
然而...
某些终端(例如,xterm和iterm2)可以配置为为任何密钥组合发送任意转义序列.
例如,下面添加到.Xresources
为的xterm发送<Esc>[65;5u
的CtrlShiftA.然后,您可以将其映射到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")
Run Code Online (Sandbox Code Playgroud)
iTerm和[u] rxvt也可以配置为执行此操作(未提供示例).
更多信息:http://www.leonerd.org.uk/hacks/fixterms/
正如已经指出的那样,没有办法以<C-S-A>
不同的方式进行映射<C-A>
.
但是,使用autokey
(用于Linux和Windows)或autohotkey
(用于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.
Run Code Online (Sandbox Code Playgroud)
为它分配这些属性:
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
支持一个按钮,用于捕获任何其他窗口的属性,如类/标题.由于键盘输入在内部处理的方式,不幸的是,即使在 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 版本中拥有它。
归档时间: |
|
查看次数: |
29620 次 |
最近记录: |