在一个终端中,人们无法区分Ctrl+A和Ctrl+Shift+A,因为它们都发出相同的按键代码,所以我可以理解为什么Vim不能做到这一点。但是gVim,作为一个X应用程序,可以区分Ctrl+A和Ctrl+Shift+A。有什么方法可以将这两个东西Map得不同吗?对于初学者,我想做如下事情:让“从剪贴板粘贴”像Gnome终端一样工作,同时保持Ctrl+V为可视模式。
:nmap <C-S-V> "+gP
字符串
6ss1mwsb1#
Gvim不这样做,因为vim不能这样做(在正常情况下)。对不起,但这就是它的方式。然而...某些终端(例如xterm和iterm 2)可以配置为发送任意键组合的任意转义序列。例如,将以下内容添加到xterm的.Xresources中,以发送CtrlShiftA的<Esc>[65;5u。然后可以在Vim中将其Map到<C-S-a>。(65是shift-a的十进制Unicode值,5是cnode修饰符的位。在本例中,u代表“unicode”。)
.Xresources
<Esc>[65;5u
<C-S-a>
! .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/
mklgxw1f2#
正如已经指出的,没有办法将<C-S-A>Map为与<C-A>不同的Map。然而,使用像autokey(用于Linux和windows)或autohotkey(用于windows)这样的工具,你可以重新Map<C-S-A>,为特定的应用程序发送不同的击键。例如,在我的系统上,我在autokey中设置了以下设置:
<C-S-A>
<C-A>
autokey
autohotkey
$ 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+a1.窗口类:gnome-terminal-server.Gnome-terminal然后,您的~/.vimrc可以为<S-F1>a创建Map,以执行您想要的任何操作。备注:1.我使用<S-F1>作为检测<C-S>的领导者键。这是因为我的终端不接受<F13>-<F37>等键。如果您的应用程序支持它,(我认为gvim)建议使用这些键。1.我在gnome-terminal中主要使用vim。所以我使用window class = gnome-terminal-server.Gnome-terminal作为过滤器。如果你愿意,可以修改它使用gvim。autokey支持一个按钮来捕获任何其他窗口的属性,如class/title。
ctrl+shift+a
gnome-terminal-server.Gnome-terminal
~/.vimrc
<S-F1>a
<S-F1>
<C-S>
<F13>
<F37>
gvim
gnome-terminal
vim
window class = gnome-terminal-server.Gnome-terminal
5t7ly7z53#
由于键盘输入是在内部处理的,这在今天是不可能实现的,即使在GVIM中也是如此。有些组合键,比如Ctrl +非字母组合键不能被Map,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版本中有这一点。
<Tab>
<C-I>
<CR>
<C-M>
<Esc>
<C-[>
<BS>
<C-H>
wljmcqd84#
如果你担心的是失去现有的C-V功能,你可以使用C-Q来代替。参见:help CTRL-V-alternative。
qeeaahzv5#
NeoVim现在为它的终端和gui客户端提供了这个功能。
xhv8bpkk6#
正如你所注意到的,你得到的是相同的键码。所以唯一的区别方法是在你的事件处理函数中检查Shift键的状态。当然,如果你在按键和处理之间有超过0.5秒的延迟,你会错过一些点击。
yzuktlbb7#
大多数终端模拟器默认将control + shift简单地视为control。相反,您通常将这些组合键Map到转义序列,并在终端应用程序中侦听该序列。
**第一步:**配置终端模拟器,将Ctrl+Shift+A绑定到序列Esc,A。
您的终端模拟器是显示终端实际窗口的程序。当通过SSH访问服务器时,终端模拟器是您本地计算机上的程序。绑定密钥在不同的终端模拟器中的工作方式不同。例如:
URxvt.keysym.Control-Shift-A: \033A
~/.Xresources
xrdb ~/.Xresources
A
将密钥Map添加到~/.vimrc配置中,并使用:source ~/.vimrc重新加载它:
:source ~/.vimrc
nnoremap <esc>a your command here
pdsfdshx8#
shift + char =字符大写字母
lowercase <C-a> -> <C-a> uppercase <C-S-a> -> <C-A>
8条答案
按热度按时间6ss1mwsb1#
Gvim不这样做,因为vim不能这样做(在正常情况下)。对不起,但这就是它的方式。
然而...
某些终端(例如xterm和iterm 2)可以配置为发送任意键组合的任意转义序列。
例如,将以下内容添加到xterm的
.Xresources
中,以发送CtrlShiftA的<Esc>[65;5u
。然后可以在Vim中将其Map到<C-S-a>
。(65是shift-a的十进制Unicode值,5是cnode修饰符的位。在本例中,u代表“unicode”。)字符串
iTerm和[u]rxvt也可以配置为执行此操作(未提供示例)。
更多信息:http://www.leonerd.org.uk/hacks/fixterms/
mklgxw1f2#
正如已经指出的,没有办法将
<C-S-A>
Map为与<C-A>
不同的Map。然而,使用像
autokey
(用于Linux和windows)或autohotkey
(用于windows)这样的工具,你可以重新Map<C-S-A>
,为特定的应用程序发送不同的击键。例如,在我的系统上,我在
autokey
中设置了以下设置:字符串
为它指定以下属性:
1.键盘快捷方式为
ctrl+shift+a
1.窗口类:
gnome-terminal-server.Gnome-terminal
然后,您的
~/.vimrc
可以为<S-F1>a
创建Map,以执行您想要的任何操作。备注:
1.我使用
<S-F1>
作为检测<C-S>
的领导者键。这是因为我的终端不接受<F13>
-<F37>
等键。如果您的应用程序支持它,(我认为gvim
)建议使用这些键。1.我在
gnome-terminal
中主要使用vim
。所以我使用window class = gnome-terminal-server.Gnome-terminal
作为过滤器。如果你愿意,可以修改它使用gvim
。autokey
支持一个按钮来捕获任何其他窗口的属性,如class/title。5t7ly7z53#
由于键盘输入是在内部处理的,这在今天是不可能实现的,即使在GVIM中也是如此。有些组合键,比如Ctrl +非字母组合键不能被Map,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版本中有这一点。
wljmcqd84#
如果你担心的是失去现有的C-V功能,你可以使用C-Q来代替。参见:help CTRL-V-alternative。
qeeaahzv5#
NeoVim现在为它的终端和gui客户端提供了这个功能。
xhv8bpkk6#
正如你所注意到的,你得到的是相同的键码。所以唯一的区别方法是在你的事件处理函数中检查Shift键的状态。当然,如果你在按键和处理之间有超过0.5秒的延迟,你会错过一些点击。
yzuktlbb7#
大多数终端模拟器默认将control + shift简单地视为control。相反,您通常将这些组合键Map到转义序列,并在终端应用程序中侦听该序列。
**第一步:**配置终端模拟器,将Ctrl+Shift+A绑定到序列Esc,A。
您的终端模拟器是显示终端实际窗口的程序。当通过SSH访问服务器时,终端模拟器是您本地计算机上的程序。绑定密钥在不同的终端模拟器中的工作方式不同。例如:
URxvt.keysym.Control-Shift-A: \033A
添加到~/.Xresources
配置文件中,然后使用xrdb ~/.Xresources
重新加载它。A
。**第二步:**将Esc,A绑定到Vim中的命令。
将密钥Map添加到
~/.vimrc
配置中,并使用:source ~/.vimrc
重新加载它:字符串
pdsfdshx8#
shift + char =字符大写字母
字符串