如何更改用于在 vim 中自动完成的键绑定?
Posted
技术标签:
【中文标题】如何更改用于在 vim 中自动完成的键绑定?【英文标题】:How can I change the keybinding used to autocomplete in vim? 【发布时间】:2011-01-17 03:52:13 【问题描述】:我不是Ctrl-n
的忠实粉丝,我希望能够使用Ctrl-Space
。有什么想法可以做到吗?
【问题讨论】:
什么环境? (Windows?Unix?控制台vim还是gvim?什么终端?) 【参考方案1】:if has("gui_running")
" C-Space seems to work under gVim on both Linux and win32
inoremap <C-Space> <C-n>
else " no gui
if has("unix")
inoremap <Nul> <C-n>
else
" I have no idea of the name of Ctrl-Space elsewhere
endif
endif
【讨论】:
注意:你可能必须使用has("gui_running")
,因为has("gui")
只是在你的vim编译时使用gui
选项返回,而不是你现在正在使用它。
不直接连接unix。 <C-Space>
被终端模拟器翻译成<Nul>
,所以如果你找到一个终端模拟器在 Windows 上做同样的工作,它也可以工作。而<Nul>
在任何地方不是是<C-Space>
的名称,出于同样的原因,<Esc>[B
不是<Down>
的名称,它只是一个产生的符号按<C-Space>
时通过终端。【参考方案2】:
我也喜欢 Ctrl+Space 映射。
" Remap code completion to Ctrl+Space 2
inoremap <Nul> <C-x><C-o>
在你的情况下你想要:
inoremap <Nul> <C-n>
【讨论】:
如果你在 gvim 中,你会想要<C-@>
用于某些终端中的 C-Space(我认为是 PuTTY),我猜 如果你想将它映射到,比如 Ctrl-E,它会是这样的:
inoremap <C-E> <C-N>
Ctrl-Space 的问题是大多数终端只会将其视为空格。我假设你在 X 中使用一些终端程序;如果你使用不同的东西,你必须自己提供相关的替换。
Bash 的 readline 通常将 Ctrl-V 映射为“将下一个键视为文字”。因此,在 bash 命令行中按 Ctrl-V 然后 Home 将在命令行上插入 ^[[H
或类似的东西,而不是转到行首。尝试按 Ctrl-V,然后按 Ctrl-Space。可能你只会看到一个空格。
在这种情况下,您将不得不使用 xmodmap 或编写自己的 /usr/share/X11/xkb/* 文件来告诉 X 在您按下 Ctrl-空格。像 Firefox 这样的程序不在乎;他们检测正在按下哪个基本键并自己弄清楚正在按下哪些修饰符。但是大多数基于终端的程序只会将 Ctrl-Space 视为空格,除非您告诉 X 将空格和 Ctrl-空格 不同。
我怀疑您是否可以单独使用 xmodmap 进行此更改;您可能需要进行较低级别的 /usr/share/X11/xkb/* 黑客攻击。这很复杂,而且我什至不知道你是否首先使用 X,所以我就把它留在那里。
某些终端,如 urxvt,允许您指定自己的键绑定。与 Firefox 一样,它们可以分辨出它何时是 Space 以及何时是 Control-Space,即使您无需对 X 进行任何特殊配置。因此,当您按下 Ctrl 时,您可以告诉 urxvt 输出“\033I_TYPED_CONTROL_SPACE_DAMMIT”- 空格。然后你可以告诉 vim 将 that 映射到 <C-N>
。
编辑:我忘记了 Ctrl-Space 用于输出 \0
(我在键盘上的其他地方重新映射了它)。在那种情况下,我上面描述的所有复杂性都是不必要的。我所说的适用于想要使用更奇特映射的人,例如 Ctrl-colon 或 Alt-Space。
【讨论】:
尽管如此,有人努力描述这里发生的事情是件好事。其他答案缺乏关于他们的解决方案为何起作用的任何描述:-)以上是关于如何更改用于在 vim 中自动完成的键绑定?的主要内容,如果未能解决你的问题,请参考以下文章