【问题标题】:How to autocomplete per conditions in vim?如何在vim中根据条件自动完成?
【发布时间】:2021-04-07 22:27:42
【问题描述】:

在 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 进行键映射。

【问题讨论】:

  • 你打算用foo = bar() + baz();做什么?
  • 如果您真的想要这种类型的补全,那么请采用诸如github.com/jiangmiao/auto-pairs 之类的插件,它会为您找出极端情况。不,它不会自动添加;,但它可以让您轻松键入) 以跳转到结束括号之后,这样您就可以自己添加;。还有一些“跳转”几个右括号的快捷方式。 (就我个人而言,我发现这种自动完成比它的价值更麻烦,但这只是我的意见......)
  • @Matt,你说得对,我最初的想法无法涵盖你提到的情况,也许问题应该改成这样:有没有办法为自动完成?
  • @filbranden 作为一个新的vim用户,我在使用插件时遇到了类似的麻烦。这就是为什么我想自己定制一些日常命令,以便我可以控制它。我曾经安装了一堆插件,最终粉碎了我的 vim 环境。在我能够很好地理解 vim 以解决那些插件冲突之前,我不会接触插件。
  • @filbranden,感谢您的建议,经过几天的vim​​学习和实践,我学到了很多,现在我可以很好地使用vim-surround了。

标签: vim autocomplete


【解决方案1】:

正确处理所有选项可能是一项非常具有挑战性的任务。但是,如果您所要求的只是一个简单且非常不完整的示例代码,那么这个小 sn-p 可能会有所帮助:

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才明白这个解决方案,效果很好
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2012-11-19
  • 2011-07-22
  • 2011-10-22
  • 2010-12-22
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多