当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 18 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : [分享]在 Vim 中实现括号自动补全
帖子发表于 : 2007-10-29 15:01 

注册: 2007-09-06 16:24
帖子: 193
地址: 中国上海
送出感谢: 0 次
接收感谢: 0 次
引用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


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-10-29 15:35 

注册: 2006-09-20 19:56
帖子: 768
送出感谢: 0 次
接收感谢: 1
对Vim用的不是很深入,里面肯定也应该有类似Emacs的syntax table,font lock一类的东西,有的话楼主可以考虑通过上下文语义给出括号补全,比如输入字符串常量时不进行补全。


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-10-29 18:11 
头像

注册: 2007-03-13 17:26
帖子: 2254
送出感谢: 0 次
接收感谢: 1
....楼主给的是解决方案,不是在问问题。。。


我讨厌回帖不看帖的人


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-10-29 18:58 

注册: 2006-09-20 19:56
帖子: 768
送出感谢: 0 次
接收感谢: 1
windwiny 写道:
....楼主给的是解决方案,不是在问问题。。。


我讨厌回帖不看帖的人


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

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


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-10-29 19:09 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
楼上冷静..
其实我觉得有时自动补全可能不方便


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-10-29 19:19 

注册: 2006-09-20 19:56
帖子: 768
送出感谢: 0 次
接收感谢: 1
BigSnake.NET 写道:
楼上冷静..
其实我觉得有时自动补全可能不方便


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

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


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-10-29 19:21 
头像

注册: 2006-07-02 11:16
帖子: 12522
地址: 廣州
送出感谢: 0 次
接收感谢: 8
zhangsong023 写道:
BigSnake.NET 写道:
楼上冷静..
其实我觉得有时自动补全可能不方便


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

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


不是这个问题,而是有时并不想它自动补全,括号自己定
即使是语法上正确


_________________
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-10-29 19:26 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
嗯。这个不大需要。当然,支持大家的讨论和研究。 :lol:


_________________
● 鸣学


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-10-29 19:30 

注册: 2006-09-20 19:56
帖子: 768
送出感谢: 0 次
接收感谢: 1
呵呵,奇怪的需求, :)
如果按语义补全的话,那么在诸如注释和字符串常量等不该由程序自作主张的地方补全功能应该是可以自动屏蔽掉啊,在程序正文中,保证语法正确的前提下,怎么会不方便呢?


页首
 用户资料  
 
10 楼 
 文章标题 : [分享]少一些功能好
帖子发表于 : 2007-11-01 9:07 

注册: 2007-04-17 11:19
帖子: 8
送出感谢: 0 次
接收感谢: 0 次
:o
还是什么都没有好,这样才锻炼自己


页首
 用户资料  
 
11 楼 
 文章标题 : Re: [分享]在 Vim 中实现括号自动补全
帖子发表于 : 2009-05-20 22:51 
头像

注册: 2007-06-30 17:37
帖子: 23
地址: Nanjing University of Science & Technology
送出感谢: 0 次
接收感谢: 0 次
以下是我对上面脚本的一点点修改,主要是修改了{}的部分。
代码:
: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的起作用了。也就可以避免统一设置所带来的不必要的麻烦。


页首
 用户资料  
 
12 楼 
 文章标题 : Re: [分享]在 Vim 中实现括号自动补全
帖子发表于 : 2009-05-21 7:34 
头像

注册: 2006-09-12 17:10
帖子: 493
送出感谢: 0 次
接收感谢: 0 次
对的,我觉得尖括号不全就不需要了,写c的时候小于的时候就来个大于不爽


页首
 用户资料  
 
13 楼 
 文章标题 : Re: [分享]在 Vim 中实现括号自动补全
帖子发表于 : 2009-05-21 11:20 

注册: 2009-01-05 11:42
帖子: 57
送出感谢: 0 次
接收感谢: 0 次
自动补全的缺点是:需要先退出插入模式才能到括号后边,然后再进入插入模式才能继续编辑。很不流畅,甚至会激怒用户哦!


页首
 用户资料  
 
14 楼 
 文章标题 : Re: [分享]在 Vim 中实现括号自动补全
帖子发表于 : 2009-05-21 16:16 
头像

注册: 2009-04-11 23:46
帖子: 4029
系统: Arch Linux
送出感谢: 11
接收感谢: 110
kamasamikon 写道:
自动补全的缺点是:需要先退出插入模式才能到括号后边,然后再进入插入模式才能继续编辑。很不流畅,甚至会激怒用户哦!

同意!我曾试过用键映射实现简单的括号自动补全,结果非常不爽!
个人觉得有高亮匹配括号和自动语法缩进就很好了,来个括号自动补全反而会增加击键次数。


_________________
我的博客 http://blog.lilydjwg.me/
Dropbox,你值得拥有。
提问的智慧
Arch Linux 中文论坛

我的vimrc: http://git.io/vimrc


页首
 用户资料  
 
15 楼 
 文章标题 : Re: [分享]在 Vim 中实现括号自动补全
帖子发表于 : 2009-05-21 16:24 
头像

注册: 2007-02-18 19:33
帖子: 2180
地址: lyric.im
系统: OSX
送出感谢: 0 次
接收感谢: 1
一个貌似方便其实不方便的功能。
我就很痛恨eclipse的括号自动补全


_________________
既然你诚心诚意地问了
我就大慈大悲地告诉你
为了防止世界被破坏
为了维护世界的和平
贯彻爱与真实的罪恶
可爱而又迷人的反派角色
武藏,小次郎
我们是穿越银河的火箭队,白洞白色的明天在等着我们。就是这样!!喵~~


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 18 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译