2009-10-01 154 views
57

在一个终端,一个不能区分Ctrl键 + Ctrl键 + + ,因为它们都发射相同的键码,所以可以看到为什么Vim可以不这样做。但是gVim的,作为一个X应用程序,可以分化Ctrl键 + Ctrl键 + + 。有什么办法以不同的方式映射这两种东西吗?如何以不同方式映射Ctrl + A和Ctrl + Shift + A?

对于初学者来说,我想这样做如下:请“从剪贴板粘贴”像GNOME终端工作,同时保持按Ctrl +V视觉模式。

:nmap <C-S-V> "+gP 
+2

我没有你的问题的答案,但我想提一提,我爱哈德森。 – 2009-10-01 22:21:02

+0

感谢您使用哈德森! – 2009-10-04 00:48:18

+1

这是可能的:http://vim.wikia.com/wiki/Mapping_fast_keycodes_in_terminal_Vim – vivoconunxino 2013-12-27 15:43:24

回答

29

Gvim不这样做,因为vim不能这样做(在正常情况下)。对不起,但那只是它。


然而...

某些终端(例如,xterm和iterm2)可以被配置为发送一个任意转义序列为键的任意组合。

例如,添加以下.Xresources xterm的发送<Esc>[65;5uCtrl键移位。然后你可以将它映射到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.leonerd.org.uk/hacks/fixterms/

+0

要重新映射多个密钥,请查看[本文档](http://www.in-ulm。de /〜mascheck/X11/xterm/XTerm):用'\ n'分隔键入。使用反斜杠来分割线条。例如。也映射CSBCSF使用这样的:'的XTerm * vt100.translations:#override Ctrl键〜元移位一个:字符串(0x1b)字符串( “[65; 5U”)\ n Ctrl键〜元移位 b :string(0x1b)string(“[66; 5u”)\ n Ctrl〜Meta Shift f:string(0x1b)string(“[70; 5u”)' – cfi 2015-09-22 12:47:13

+0

为了完整起见,在vi中映射这个?例如。 'map [66; 5u:echo'ctrl-shift-b received''映射ctrl-shift-b在状态行中打印消息。在AskUbuntu上有类似的问题,我已经总结了这个(http://askubuntu.com/a/677070/28323)。 – cfi 2015-09-22 13:08:33

+0

我们需要的是一个新的终端规格! 'xterm-256color'(最近的)受到如此多的限制。 – Jezz 2016-12-14 10:36:54

1

正如您所指出的,您将获得相同的密钥代码。因此,区分它们的唯一方法是检查事件处理函数中的Shift键的状态。当然,如果您在按键和处理之间的延迟超过0.5秒,您将错过一些点击。

+1

我猜我的问题是,鉴于gvim能够做出这样的区分(即使普通的vim不能),是否有任何gvim特定的扩展,我可以依靠区分Ctrl + Shift + V与Ctrl + V. – 2009-10-04 00:49:57

+6

如何检查Shit键的状态?我搜查了一下,但没有发现任何有用的东西。 – bolov 2014-08-23 07:05:11

4

如果有什么困扰你的是失去现有的C-V的功能,你可以使用C-Q代替。请参阅::帮助CTRL-V-alternative。

0

NeoVim现在为其终端和gui客户端提供此功能。请参阅:h nvim-features-new

+2

不完全,除非您在终端中启用CSI代码。 Neovim _does_支持的CTRL-SHIFT变体大部分是不可打印的字符(在http://neovim.org/doc/user/vim_diff.html#nvim-features-new上列出的例子)。然而,* meta *和弦(包括''变体)* do *主要完全开箱即用。 – 2015-04-14 22:59:50

+0

谢谢澄清和保持良好的工作:) – OliverUv 2015-04-16 12:51:11

1

正如已经指出的,没有办法映射<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. 

它分配这些属性:

  1. ,快捷键为ctrl+shift+a
  2. 窗口类:gnome-terminal-server.Gnome-terminal

然后你~/.vimrc可以为<S-F1>a创建映射以执行任何您想要的操作。


注:

  1. 我已经使用<S-F1>作为一种领导者的关键检测<C-S>。这是因为我的终端不接受<F13> - <F37>等密钥。如果您的应用程序支持它,我推荐使用这些密钥(gvim)。
  2. 我主要是vimgnome-terminal。所以我用window class = gnome-terminal-server.Gnome-terminal作为过滤器。如果需要,修改它以使用gvimautokey支持一个按钮来捕获任何其他窗口的属性,如类/标题。
+0

谢谢堆。 Theres有很多关于使用Autokey进行关键映射的东西,但没有关于如何执行的实际说明。最后你的答案就是这样。我不能相信没有人赞成你。 – pickle323 2017-12-13 06:45:31

+0

上帝该死的自动钥匙!我尽我所能,但我无法将它安装在我的Ubuntu 16.04上。 – 2017-12-30 08:51:51

+0

'安装autokey-gtk'? – anishsane 2017-12-30 12:07:58

0

由于键盘输入在内部处理的方式,因此即使在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发布中有这样的愿望。

相关问题