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

Vim、Emacs配置和使用
yuffey
帖子: 193
注册时间: 2007-09-06 16:24
来自: 中国上海

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

#1

帖子 yuffey » 2007-10-29 15:01

引用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
zhangsong023
帖子: 768
注册时间: 2006-09-20 19:56

#2

帖子 zhangsong023 » 2007-10-29 15:35

对Vim用的不是很深入,里面肯定也应该有类似Emacs的syntax table,font lock一类的东西,有的话楼主可以考虑通过上下文语义给出括号补全,比如输入字符串常量时不进行补全。
头像
windwiny
帖子: 2254
注册时间: 2007-03-13 17:26

#3

帖子 windwiny » 2007-10-29 18:11

....楼主给的是解决方案,不是在问问题。。。


我讨厌回帖不看帖的人
zhangsong023
帖子: 768
注册时间: 2006-09-20 19:56

#4

帖子 zhangsong023 » 2007-10-29 18:58

windwiny 写了:....楼主给的是解决方案,不是在问问题。。。


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

我比你还讨厌回帖不看帖的人。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#5

帖子 BigSnake.NET » 2007-10-29 19:09

楼上冷静..
其实我觉得有时自动补全可能不方便
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
zhangsong023
帖子: 768
注册时间: 2006-09-20 19:56

#6

帖子 zhangsong023 » 2007-10-29 19:19

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

我喜欢你的发言风格。本来大家做技术讨论而已,应该心平气和,可总是有一些人喜欢为他人制造忍无可忍的理由。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#7

帖子 BigSnake.NET » 2007-10-29 19:21

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

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

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#8

帖子 eexpress » 2007-10-29 19:26

嗯。这个不大需要。当然,支持大家的讨论和研究。 :lol:
● 鸣学
zhangsong023
帖子: 768
注册时间: 2006-09-20 19:56

#9

帖子 zhangsong023 » 2007-10-29 19:30

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

[分享]少一些功能好

#10

帖子 dexin » 2007-11-01 9:07

:o
还是什么都没有好,这样才锻炼自己
头像
brianlan
帖子: 23
注册时间: 2007-06-30 17:37
来自: Nanjing University of Science & Technology

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

#11

帖子 brianlan » 2009-05-20 22:51

以下是我对上面脚本的一点点修改,主要是修改了{}的部分。

代码: 全选

: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的起作用了。也就可以避免统一设置所带来的不必要的麻烦。
头像
HuaChong
帖子: 493
注册时间: 2006-09-12 17:10

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

#12

帖子 HuaChong » 2009-05-21 7:34

对的,我觉得尖括号不全就不需要了,写c的时候小于的时候就来个大于不爽
kamasamikon
帖子: 57
注册时间: 2009-01-05 11:42

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

#13

帖子 kamasamikon » 2009-05-21 11:20

自动补全的缺点是:需要先退出插入模式才能到括号后边,然后再进入插入模式才能继续编辑。很不流畅,甚至会激怒用户哦!
头像
lilydjwg
论坛版主
帖子: 4248
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

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

#14

帖子 lilydjwg » 2009-05-21 16:16

kamasamikon 写了:自动补全的缺点是:需要先退出插入模式才能到括号后边,然后再进入插入模式才能继续编辑。很不流畅,甚至会激怒用户哦!
同意!我曾试过用键映射实现简单的括号自动补全,结果非常不爽!
个人觉得有高亮匹配括号和自动语法缩进就很好了,来个括号自动补全反而会增加击键次数。
头像
shellex
帖子: 2180
注册时间: 2007-02-18 19:33
系统: OSX
来自: lyric.im
联系:

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

#15

帖子 shellex » 2009-05-21 16:24

一个貌似方便其实不方便的功能。
我就很痛恨eclipse的括号自动补全
既然你诚心诚意地问了
我就大慈大悲地告诉你
为了防止世界被破坏
为了维护世界的和平
贯彻爱与真实的罪恶
可爱而又迷人的反派角色
武藏,小次郎
我们是穿越银河的火箭队,白洞白色的明天在等着我们。就是这样!!喵~~
回复