在终端中,无法区分Ctrl+ A和Ctrl+ Shift+,A因为它们都发出相同的键控代码,因此我可以理解为什么Vim无法做到这一点。但是gVim作为X应用程序可以区分Ctrl+ A和Ctrl+ Shift+ A。有没有办法以不同的方式映射这两件事?
首先,我想做以下事情:使“从剪贴板粘贴”像Gnome终端一样工作,同时保持Ctrl+ V处于可视模式。
:nmap <C-S-V> "+gP
在终端中,无法区分Ctrl+ A和Ctrl+ Shift+,A因为它们都发出相同的键控代码,因此我可以理解为什么Vim无法做到这一点。但是gVim作为X应用程序可以区分Ctrl+ A和Ctrl+ Shift+ A。有没有办法以不同的方式映射这两件事?
首先,我想做以下事情:使“从剪贴板粘贴”像Gnome终端一样工作,同时保持Ctrl+ V处于可视模式。
:nmap <C-S-V> "+gP
Answers:
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")
还可以将iTerm和[rxvt]配置为执行此操作(不提供示例)。
xterm-256color
(最近)遭受了太多限制。
xterm-256color
。
如前所述,没有任何方法可以映射<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.
为其分配以下属性:
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
支持用于捕获其他任何窗口属性(例如类/标题)的按钮。apt install autokey-gtk
?
bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m h
,,wmh
当我按下时按下<C-S-h>
,然后vim知道如何处理,wmh
<C-S-H>
当我按此按钮时,其他应用程序应继续接收。
NeoVim现在为其终端和GUI客户提供此功能。参见:h nvim-features-new
<m-s-...>
变体)在大多数情况下确实是开箱即用的。
ALT (|META|) chords always work (even in the |TUI|). Map |<M-| with any key: <M-1>, <M-BS>, <M-Del>, <M-Ins>, <M-/>, <M-\>, <M-Space>, <M-Enter>, etc. Case-sensitive: <M-a> and <M-A> are two different keycodes.
“区分大小写:”部分前有一个换行符,这使它变得模棱两可。感谢您的更正@ JustinM.Keyes。此外时,Vim 8.1出现之间进行区分<M-a>
和<M-A>
为好。
<c-s-l>
是与众不同的<c-l>
,Konsole
没有任何额外的麻烦
由于键盘输入是在内部处理的,因此,即使在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版本中使用它。