`imap`条件为光标左侧的空白区域

时间:2016-08-09 20:51:51

标签: vim

是否可以使以下命令生效

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>

精确地实现了我想要的东西。

1 个答案:

答案 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/