分页: 1 / 2

[分享]在 Vim 中实现括号自动补全

发表于 : 2007-10-29 15:01
yuffey
引用http://www.linuxgem.org/tip/bracket-auto-closing-in-vim.html

流行的 IDE 的编辑器,诸如 Eclipse,都提供了括号自动补全的功能,相当的方便。可惜 Vim 默认情况下并没有提供这样的功能,那就只有自己来写了。

将下面的代码加入到 ~/.vimrc 中,重启 Vim,即可
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {}<ESC>i
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap < <><ESC>i
:inoremap > <c-r>=ClosePair('>')<CR>

function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf

发表于 : 2007-10-29 15:35
zhangsong023
对Vim用的不是很深入,里面肯定也应该有类似Emacs的syntax table,font lock一类的东西,有的话楼主可以考虑通过上下文语义给出括号补全,比如输入字符串常量时不进行补全。

发表于 : 2007-10-29 18:11
windwiny
....楼主给的是解决方案,不是在问问题。。。


我讨厌回帖不看帖的人

发表于 : 2007-10-29 18:58
zhangsong023
windwiny 写了:....楼主给的是解决方案,不是在问问题。。。


我讨厌回帖不看帖的人
全是废话,我当然知道楼主给的是解决方案,我不过是在和楼主讨论有没有可能以及如何扩展这个解决方案。

我比你还讨厌回帖不看帖的人。

发表于 : 2007-10-29 19:09
BigSnake.NET
楼上冷静..
其实我觉得有时自动补全可能不方便

发表于 : 2007-10-29 19:19
zhangsong023
BigSnake.NET 写了:楼上冷静..
其实我觉得有时自动补全可能不方便
所以如果能采取按程序语言的语义进行括号补全的方案,就可以避免所谓的不方便,比如Emacs可以用syntax table和font lock接口实现,vim可以做到很好的语法高亮,如果给出了语义分析的接口,也应该完全可以写一个按语义补全括号的扩展,可惜对vim不是很熟,只是有这样一想法而已。

我喜欢你的发言风格。本来大家做技术讨论而已,应该心平气和,可总是有一些人喜欢为他人制造忍无可忍的理由。

发表于 : 2007-10-29 19:21
BigSnake.NET
zhangsong023 写了:
BigSnake.NET 写了:楼上冷静..
其实我觉得有时自动补全可能不方便
所以如果能采取按程序语言的语义进行括号补全的方案,就可以避免所谓的不方便,比如Emacs可以用syntax table和font lock接口实现,vim可以做到很好的语法高亮,如果给出了语义分析的接口,也应该完全也可以写一个按语义补全括号的扩展,可惜对vim不是很熟,只是有这样一想法而已。

我喜欢你的发言风格。本来大家做技术讨论而已,应该心平气和,可总是有一些人喜欢为他人制造忍无可忍的理由。
不是这个问题,而是有时并不想它自动补全,括号自己定
即使是语法上正确

发表于 : 2007-10-29 19:26
eexpress
嗯。这个不大需要。当然,支持大家的讨论和研究。 :lol:

发表于 : 2007-10-29 19:30
zhangsong023
呵呵,奇怪的需求, :)
如果按语义补全的话,那么在诸如注释和字符串常量等不该由程序自作主张的地方补全功能应该是可以自动屏蔽掉啊,在程序正文中,保证语法正确的前提下,怎么会不方便呢?

[分享]少一些功能好

发表于 : 2007-11-01 9:07
dexin
:o
还是什么都没有好,这样才锻炼自己

Re: [分享]在 Vim 中实现括号自动补全

发表于 : 2009-05-20 22:51
brianlan
以下是我对上面脚本的一点点修改,主要是修改了{}的部分。

代码: 全选

:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<Up><ESC>A
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i

function! ClosePair(char)
    if getline('.')[col('.')-1]==a:char
        return "\<Right>"
    else
        return a:char
    endif
endfunction
另外linuxSir原帖的回复中也提到,可以讲这些脚本单独列出来保存在xxx.vim中,然后将该文件放在/usr/share/vim/vim71/autoload中,然后在vimrc文件中加上

代码: 全选

au FileType c,cpp so xxx.vim
这样一来,这些自动添加括号的脚本就只对后缀为c和cpp的起作用了。也就可以避免统一设置所带来的不必要的麻烦。

Re: [分享]在 Vim 中实现括号自动补全

发表于 : 2009-05-21 7:34
HuaChong
对的,我觉得尖括号不全就不需要了,写c的时候小于的时候就来个大于不爽

Re: [分享]在 Vim 中实现括号自动补全

发表于 : 2009-05-21 11:20
kamasamikon
自动补全的缺点是:需要先退出插入模式才能到括号后边,然后再进入插入模式才能继续编辑。很不流畅,甚至会激怒用户哦!

Re: [分享]在 Vim 中实现括号自动补全

发表于 : 2009-05-21 16:16
lilydjwg
kamasamikon 写了:自动补全的缺点是:需要先退出插入模式才能到括号后边,然后再进入插入模式才能继续编辑。很不流畅,甚至会激怒用户哦!
同意!我曾试过用键映射实现简单的括号自动补全,结果非常不爽!
个人觉得有高亮匹配括号和自动语法缩进就很好了,来个括号自动补全反而会增加击键次数。

Re: [分享]在 Vim 中实现括号自动补全

发表于 : 2009-05-21 16:24
shellex
一个貌似方便其实不方便的功能。
我就很痛恨eclipse的括号自动补全