如何以不同方式映射Ctrl + A和Ctrl + Shift + A?

时间:2009-10-01 22:03:35

标签: vim

在终端中,无法区分 Ctrl + A Ctrl + Shift + A 因为它们都发出相同的密钥代码,所以我可以看出为什么Vim不能这样做。但作为X应用程序的gVim可以区分 Ctrl + A Ctrl + Shift + A 。有没有办法以不同的方式映射这两件事?

对于初学者,我想做类似以下的事情:使“从剪贴板粘贴”像Gnome终端一样工作,同时将 Ctrl + V 保持为视觉效果模式。

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

7 个答案:

答案 0 :(得分:36)

Gvim没有这样做,因为vim无法做到(在正常情况下)。对不起,但就是这样。


...然而

某些终端(例如,xterm和iterm2)可以配置为为任何密钥组合发送任意转义序列。

例如,将以下内容添加到.Xresources以便xterm发送<Esc>[65;5u Ctrl Shift A 。然后,您可以将其在Vim中映射到<C-S-a>。 (65是shift-a的十进制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/

答案 1 :(得分:6)

正如已经指出的那样,没有办法将<C-S-A><C-A>区别开来。

但是,使用autokey(适用于Linux和Windows)或autohotkey(适用于Windows)等工具,您可以重新映射<C-S-A>以发送不同的键击具体应用。

e.g。在我的系统上,我在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
  3. 然后,您的~/.vimrc可以为<S-F1>a创建映射,以执行您想要的任何操作。

    注意:

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

答案 2 :(得分:5)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

由于内部处理键盘输入的方式,遗憾的是,即使在GVIM中,这在今天也是不可能的。某些组合键,例如 Ctrl +非字母无法映射, Ctrl + letter vs. Ctrl + Shift +字母无法区分。 (除非您的终端为其发送不同的 termcap 代码,但大多数代码都没有。)在插入或命令行模式下,尝试键入组合键。如果没有任何反应/插入,则无法使用该组合键。这也适用于<Tab> / <C-I><CR> / <C-M> / <Esc> / <C-[>等。(只有<BS>例外/ <C-H>。)这是一个众所周知的痛点,也是关于vim_dev和#vim IRC频道的各种讨论的主题。

有些人(最重要的是Paul LeoNerd Evans)希望解决这个问题(即使是支持Vim的终端中的控制台Vim),并提出了各种提案,cp。 http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

但截至今天,尚未有任何补丁或志愿者挺身而出,尽管许多人表示希望在未来的Vim版本中实现这一目标。

答案 5 :(得分:0)

默认情况下,大多数终端模拟器将控制加移位简单地视为控制。相反,您通常将这些组合键映射到一个转义序列,然后在终端应用程序内部监听。

步骤 1: 配置您的终端模拟器以将 Ctrl+Shift+A 绑定到序列 Esc,A.

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

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

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

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

nnoremap <esc>a your command here

答案 6 :(得分:-1)

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