如何以不同方式映射Ctrl + A和Ctrl + Shift + A?
在一个终端,一个不能区分Ctrl键 + 甲和Ctrl键 + 移 + 甲,因为它们都发射相同的键码,所以可以看到为什么Vim可以不这样做。但是gVim的,作为一个X应用程序,可以分化Ctrl键 + 甲和Ctrl键 + 移 + 甲。有什么办法以不同的方式映射这两种东西吗?如何以不同方式映射Ctrl + A和Ctrl + Shift + A?
对于初学者来说,我想这样做如下:请“从剪贴板粘贴”像GNOME终端工作,同时保持按Ctrl +V视觉模式。
:nmap <C-S-V> "+gP
Gvim不这样做,因为vim不能这样做(在正常情况下)。对不起,但那只是它。
然而...
某些终端(例如,xterm和iterm2)可以被配置为发送一个任意转义序列为键的任意组合。
例如,添加以下.Xresources
xterm的发送<Esc>[65;5u
为Ctrl键移位甲。然后你可以将它映射到Vim中<C-S-a>
。 (65是用于移位一十进制Unicode值和图5是用于在CTRL改性剂的位。在这种情况下,u代表“的unicode”。)
! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")
的iTerm和[u]的rxvt也可以被配置要做到这一点(没有提供的例子)。
要重新映射多个密钥,请查看[本文档](http://www.in-ulm。de /〜mascheck/X11/xterm/XTerm):用'\ n'分隔键入。使用反斜杠来分割线条。例如。也映射CSB和CSF使用这样的:'的XTerm * vt100.translations:#override Ctrl键〜元移位
为了完整起见,在vi中映射这个?例如。 'map
我们需要的是一个新的终端规格! 'xterm-256color'(最近的)受到如此多的限制。 – Jezz 2016-12-14 10:36:54
正如您所指出的,您将获得相同的密钥代码。因此,区分它们的唯一方法是检查事件处理函数中的Shift键的状态。当然,如果您在按键和处理之间的延迟超过0.5秒,您将错过一些点击。
我猜我的问题是,鉴于gvim能够做出这样的区分(即使普通的vim不能),是否有任何gvim特定的扩展,我可以依靠区分Ctrl + Shift + V与Ctrl + V. – 2009-10-04 00:49:57
如何检查Shit键的状态?我搜查了一下,但没有发现任何有用的东西。 – bolov 2014-08-23 07:05:11
如果有什么困扰你的是失去现有的C-V的功能,你可以使用C-Q代替。请参阅::帮助CTRL-V-alternative。
NeoVim现在为其终端和gui客户端提供此功能。请参阅:h nvim-features-new
不完全,除非您在终端中启用CSI代码。 Neovim _does_支持的CTRL-SHIFT变体大部分是不可打印的字符(在http://neovim.org/doc/user/vim_diff.html#nvim-features-new上列出的例子)。然而,* meta *和弦(包括'
谢谢澄清和保持良好的工作:) – OliverUv 2015-04-16 12:51:11
正如已经指出的,没有办法映射<C-S-A>
与<C-A>
不同。
但是,使用工具,如autokey
(对于Linux & Windows)或autohotkey
(适用于Windows),您可以重新映射<C-S-A>
发送针对特定应用不同的按键行程(S)。
例如在我的系统,我在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
支持一个按钮来捕获任何其他窗口的属性,如类/标题。
由于键盘输入在内部处理的方式,因此即使在GVIM中,今天这种情况通常也是不可能的。一些组合键,像按Ctrl +非字母不能被映射,并按Ctrl +信与按Ctrl +移+信无法区分。 (除非你的终端发送了一个明确的termcap代码,但大部分都没有。)在插入或命令行模式下,尝试输入组合键。如果没有任何事情发生/插入,则不能使用该组合键。这也适用于<Tab>
/<C-I>
,<CR>
/<C-M>
/<Esc>
/<C-[>
等(仅例外是<BS>
/<C-H>
)。这是一个已知的痛点,并在vim_dev各种讨论和#vim IRC频道的主题。
有些人(最重要的是保LeoNerd埃文斯)要解决这个问题(即使控制台Vim的支持此终端),并已飘来各种建议,CP。 http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8
但是到了今天,还没有补丁或者志愿者尚未出面,尽管很多人都表达了在未来的Vim发布中有这样的愿望。
我没有你的问题的答案,但我想提一提,我爱哈德森。 – 2009-10-01 22:21:02
感谢您使用哈德森! – 2009-10-04 00:48:18
这是可能的:http://vim.wikia.com/wiki/Mapping_fast_keycodes_in_terminal_Vim – vivoconunxino 2013-12-27 15:43:24