如何更改用于在 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。 &lt;C-Space&gt; 被终端模拟器翻译成&lt;Nul&gt;,所以如果你找到一个终端模拟器在 Windows 上做同样的工作,它也可以工作。而&lt;Nul&gt; 在任何地方不是&lt;C-Space&gt;名称,出于同样的原因,&lt;Esc&gt;[B 不是&lt;Down&gt; 的名称,它只是一个产生的符号按&lt;C-Space&gt;时通过终端。【参考方案2】:

我也喜欢 Ctrl+Space 映射。

" Remap code completion to Ctrl+Space 2
inoremap <Nul> <C-x><C-o> 

在你的情况下你想要:

inoremap &lt;Nul&gt; &lt;C-n&gt;

【讨论】:

如果你在 gvim 中,你会想要 而不是 &lt;C-@&gt; 用于某些终端中的 C-Space(我认为是 PuTTY),我猜 与 C-@ 相同【参考方案3】:

如果你想将它映射到,比如 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 映射到 &lt;C-N&gt;

编辑:我忘记了 Ctrl-Space 用于输出 \0 (我在键盘上的其他地方重新映射了它)。在那种情况下,我上面描述的所有复杂性都是不必要的。我所说的适用于想要使用更奇特映射的人,例如 Ctrl-colon 或 Alt-Space

【讨论】:

尽管如此,有人努力描述这里发生的事情是件好事。其他答案缺乏关于他们的解决方案为何起作用的任何描述:-)

以上是关于如何更改用于在 vim 中自动完成的键绑定?的主要内容,如果未能解决你的问题,请参考以下文章

在 Vim 中自动完成后如何自动删除预览窗口?

如何用sql实现自动填充日期

Vim:让自动完成更智能

如何在 Rider 中更改自动完成突出显示颜色

Angular-Kendo 在更改时自动完成所选值

打开vim后怎样编写c/c++/java文件即编译运行 编写完后如何保存 保存路径在哪 路径是不是可更改