vim 如何MapCtrl+A和Ctrl+Shift+A不同?

bvpmtnay  于 6个月前  发布在  其他
关注(0)|答案(8)|浏览(72)

在一个终端中,人们无法区分Ctrl+A和Ctrl+Shift+A,因为它们都发出相同的按键代码,所以我可以理解为什么Vim不能做到这一点。但是gVim,作为一个X应用程序,可以区分Ctrl+A和Ctrl+Shift+A。有什么方法可以将这两个东西Map得不同吗?
对于初学者,我想做如下事情:让“从剪贴板粘贴”像Gnome终端一样工作,同时保持Ctrl+V为可视模式。

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

字符串

6ss1mwsb

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
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")

字符串
iTerm和[u]rxvt也可以配置为执行此操作(未提供示例)。
更多信息:http://www.leonerd.org.uk/hacks/fixterms/

mklgxw1f

mklgxw1f2#

正如已经指出的,没有办法将<C-S-A>Map为与<C-A>不同的Map。
然而,使用像autokey(用于Linux和windows)或autohotkey(用于windows)这样的工具,你可以重新Map<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.

字符串
为它指定以下属性:
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作为过滤器。如果你愿意,可以修改它使用gvimautokey支持一个按钮来捕获任何其他窗口的属性,如class/title。

5t7ly7z5

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版本中有这一点。

wljmcqd8

wljmcqd84#

如果你担心的是失去现有的C-V功能,你可以使用C-Q来代替。参见:help CTRL-V-alternative。

qeeaahzv

qeeaahzv5#

NeoVim现在为它的终端和gui客户端提供了这个功能。

xhv8bpkk

xhv8bpkk6#

正如你所注意到的,你得到的是相同的键码。所以唯一的区别方法是在你的事件处理函数中检查Shift键的状态。当然,如果你在按键和处理之间有超过0.5秒的延迟,你会错过一些点击。

yzuktlbb

yzuktlbb7#

大多数终端模拟器默认将control + shift简单地视为control。相反,您通常将这些组合键Map到转义序列,并在终端应用程序中侦听该序列。

**第一步:**配置终端模拟器,将Ctrl+Shift+A绑定到序列Esc,A。

您的终端模拟器是显示终端实际窗口的程序。当通过SSH访问服务器时,终端模拟器是您本地计算机上的程序。绑定密钥在不同的终端模拟器中的工作方式不同。例如:

  • 对于urxvt,将URxvt.keysym.Control-Shift-A: \033A添加到~/.Xresources配置文件中,然后使用xrdb ~/.Xresources重新加载它。
  • 对于iTerm 2,打开Preferences -> Keys,添加一个条目,并将Ctrl+Shift+A绑定到操作“Send Escape Sequence”,并在下面的字段中键入A
    **第二步:**将Esc,A绑定到Vim中的命令。

将密钥Map添加到~/.vimrc配置中,并使用:source ~/.vimrc重新加载它:

nnoremap <esc>a your command here

字符串

pdsfdshx

pdsfdshx8#

shift + char =字符大写字母

lowercase
<C-a> -> <C-a>

uppercase
<C-S-a> -> <C-A>

字符串

相关问题