101

在终端中,无法区分Ctrl+ACtrl+ Shift+ A,因为它们都发出相同的键码,所以我明白为什么 Vim 不能做到这一点。但是 gVim 作为 X 应用程序,可以区分Ctrl+ACtrl++ 。有没有办法以不同的方式映射这两件事?ShiftA

对于初学者,我想做以下事情:让“从剪贴板粘贴”像 Gnome 终端一样工作,同时保持Ctrl+V到可视模式。

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

7 回答 7

50

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


然而...

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

例如,将以下内容添加到for .Xresourcesxterm 以发送. 然后,您可以在 Vim 中将其映射到. (65 是 shift-a 的十进制 Unicode 值,5 是 ctrl 修饰符的位。在这种情况下,u 代表“unicode”。)<Esc>[65;5uCtrlShiftA<C-S-a>

! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")

iTerm 和 [u]rxvt 也可以配置为执行此操作(未提供示例)。

更多信息: http: //www.leonard.org.uk/hacks/fixterms/

于 2010-02-01T20:22:07.527 回答
9

正如已经指出的那样,没有办法<C-S-A><C-A>.

但是,使用autokey(for linux & windows) 或autohotkey(for 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.

为其分配以下属性:

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

然后你~/.vimrc可以创建映射<S-F1>a来做任何你想做的事情。


笔记:

  1. 我已将其用作<S-F1>检测<C-S>. 这是因为我的终端不接受<F13>- <F37>etc 键。如果您的应用程序支持它,(gvim我认为)建议使用这些键。
  2. 我主要vimgnome-terminal. 所以我用作window class = gnome-terminal-server.Gnome-terminal过滤器。gvim如果需要,可以修改它以使用。autokey支持用于捕获任何其他窗口属性(如类/标题)的按钮。
于 2016-10-18T04:27:16.393 回答
6

由于键盘输入在内部处理的方式,不幸的是,这在今天通常是不可能的,即使在 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 版本中拥有这个。

于 2017-12-05T15:08:11.697 回答
5

如果困扰您的是失去现有的 CV 功能,您可以改用 CQ。请参阅 :help CTRL-V-alternative。

于 2011-04-07T10:31:51.913 回答
3

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

于 2015-04-09T20:06:38.103 回答
1

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

于 2009-10-01T23:01:34.930 回答
0

大多数终端仿真器默认将控制加移位简单地视为控制。相反,您通常将这些组合键映射到转义序列并在终端应用程序中收听。

第1步:配置您的终端仿真器以将Ctrl++绑定到序列, .ShiftAEscA

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

  • 对于 urxvt,添加URxvt.keysym.Control-Shift-A: \033A~/.Xresources配置文件并使用xrdb ~/.Xresources.
  • 对于 iTerm2,打开 Preferences -> Keys,添加一个条目,然后将 ++ 绑定到Ctrl“ Send Escape Sequence”操作,然后在下面的字段中输入。ShiftAA

第 2 步:Esc将,绑定A到 Vim 中的命令。

将键映射添加到您的~/.vimrc配置并重新加载它:source ~/.vimrc

nnoremap <esc>a your command here
于 2021-01-19T21:32:20.780 回答