如何在vim中更改用于自动完成的键绑定?

Geo*_*Geo 37 vim autocomplete key-bindings

我不是Ctrl-n很喜欢,我希望能够使用Ctrl-Space.我有什么想法可以做到这一点?

小智 34

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
Run Code Online (Sandbox Code Playgroud)

  • 注意:您可能必须使用`has("gui_running")`,因为`has("gui")`只是返回,如果您的vim是使用`gui`选项编译的,而不是您现在正在使用它. (3认同)

Pie*_*tte 19

我也喜欢Ctrl + Space贴图.

" Remap code completion to Ctrl+Space {{{2
inoremap <Nul> <C-x><C-o> 
Run Code Online (Sandbox Code Playgroud)

在你的情况下你想要:

inoremap <Nul> <C-n>
Run Code Online (Sandbox Code Playgroud)

  • 如果你在gvim中,你会想要<C-space>而不是<Nul>. (7认同)

dub*_*jim 9

如果你想将它映射到例如Ctrl-E,它会是这样的:

inoremap <C-E> <C-N>
Run Code Online (Sandbox Code Playgroud)

问题是Ctrl- Space大多数终端只会将其视为一个空间.我假设你在X里面使用了一些终端程序; 如果你使用不同的东西,你必须自己提供相关的替代品.

Bash的readline通常具有Ctrl- V映射为"将下一个键视为文字".所以按Ctrl- V然后在bash命令行的Home将在命令行上插入^[[H或类似的东西,而不是去行的开头.尝试按Ctrl- V然后Ctrl- Space.可能你会看到一个空间.

在这种情况下,你必须与xmodmap来愚弄或者自己写的/ usr /共享/ X11/XKB/*文件告诉X到输出不同的东西,当你按下Ctrl- Space.像Firefox这样的程序并不关心; 他们检测出正在按下哪个基本键,并自己弄清楚正在按下哪些修改器.但大多数基于终端的程序只会看到Ctrl- Space作为一个空间,除非你告诉X对待空间和Ctrl- Space不同.

我怀疑你可以单独使用xmodmap进行此更改; 你可能需要做更低级别的/ usr/share/X11/xkb/*黑客攻击.这很复杂,我甚至不知道你是否首先使用X,所以我会把它留在那里.

像urxvt这样的终端允许你指定自己的键绑定.如Firefox,他们可以告诉当它是一个空间,当它是一个控制航天即使没有你做什么特别的配置X.所以,你可以告诉urxvt输出"\ 033I_TYPED_CONTROL_SPACE_DAMMIT"当你按下Ctrl- Space.然后你可以告诉vim的映射<C-N>.

编辑:我忘记了Ctrl-Space用于输出\0(我重新映射到键盘上的其他位置).在这种情况下,我上面描述的所有复杂性都是不必要的.我所说的将适用于想要使用更具异国情调的映射的人,比如Ctrl-colon或Alt- Space.

  • 尽管如此,有人努力描述这里发生的事情是件好事。其他答案没有任何关于他们的解决方案为何有效的描述:-) (2认同)