如何根据 vim 中的条件自动完成?
How to autocomplete per conditions in vim?
在 vim 中编码时,我在 vimrc 中为 "{('
添加自动完成,如下所示:
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
inoremap { {<Cr>}<Esc>O
inoremap ( ()<ESC>i
但我发现在函数调用或表达式的末尾手动添加额外的分号 ;
非常烦人。
示例 1:print("hello world");
=> 自动完成应该是 );
当输入 (
示例 2:if (true)
或 while (true)
=> 自动完成在输入 (
时应该仅为 )
当输入单个 (
时,如何正确自动完成示例 1 和示例 2?我这里的重点是是否有一些简单的方法可以为键映射添加if/else
。
正确处理所有选项可能是一项非常具有挑战性的任务。但是,如果您所要求的只是一个简单且非常不完整的示例代码,那么也许这个小片段可能会有所帮助:
inoremap <expr>( Paren()
function! Paren() abort
return printf("()%s\<Left>",
\ search('\v(if|while)\s*%#', 'bn', line('.')) ? "" : ";\<Left>")
endfunction
想法是将当前行(就在光标之前)与正则表达式进行匹配。根据结果,我们构建一个要插入的表达式。
参见:h search()
、:h :map-expression
等
在 vim 中编码时,我在 vimrc 中为 "{('
添加自动完成,如下所示:
inoremap " ""<ESC>i
inoremap ' ''<ESC>i
inoremap { {<Cr>}<Esc>O
inoremap ( ()<ESC>i
但我发现在函数调用或表达式的末尾手动添加额外的分号 ;
非常烦人。
示例 1:print("hello world");
=> 自动完成应该是 );
当输入 (
示例 2:if (true)
或 while (true)
=> 自动完成在输入 (
)
当输入单个 (
时,如何正确自动完成示例 1 和示例 2?我这里的重点是是否有一些简单的方法可以为键映射添加if/else
。
正确处理所有选项可能是一项非常具有挑战性的任务。但是,如果您所要求的只是一个简单且非常不完整的示例代码,那么也许这个小片段可能会有所帮助:
inoremap <expr>( Paren()
function! Paren() abort
return printf("()%s\<Left>",
\ search('\v(if|while)\s*%#', 'bn', line('.')) ? "" : ";\<Left>")
endfunction
想法是将当前行(就在光标之前)与正则表达式进行匹配。根据结果,我们构建一个要插入的表达式。
参见:h search()
、:h :map-expression
等