是否可以使以下命令生效
imap <Tab> <C-N>
除非,否则光标左侧的字符为空格,在这种情况下,<Tab>
应为<Tab>
(或作为一个有趣的变体,除非光标左侧的文本与^\s*$
匹配,其中$
代表光标左侧字符串的结尾)< / em>?
编辑:解决方案
感谢@ Meninx
提供的链接我在vim帮助
中找到了以下代码段function! CleverTab()
if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
return "\<Tab>"
else
return "\<C-N>"
endif
endfunction
inoremap <Tab> <C-R>=CleverTab()<CR>
精确地实现了我想要的东西。
答案 0 :(得分:3)
您不需要<C-R>=
中的inoremap
。对<expr>
使用inoremap
参数更明智,它会将最后一个参数作为表达式进行计算,然后替换结果。在您的示例中,它将如下所示:
function! CleverTab()
if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
return "\<Tab>"
else
return "\<c-x>\<c-p>"
endif
endfunction
inoremap <expr> <tab> CleverTab()
大多数inoremap
地图都使用<expr>
执行,否则事情会变得过于复杂。
请注意,我还将<C-N>
更改为<c-x><c-p>
。在大多数情况下,上下文敏感的完成将找到一个更好的匹配向后看而不是向前,因为你用它来重复一些文本。
此外,我们在网站上有一个Vim特定部分:https://vi.stackexchange.com/