当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [分享]vim括号自动补全
帖子发表于 : 2008-03-21 21:42 

注册: 2006-07-09 19:22
帖子: 18
送出感谢: 0 次
接收感谢: 0 次
我参照一个括号自动补全的脚本重新修改了一下,由于不太会写,所以很多实现都很dirty,希望有人能再修改一下,让补全更完美。
针对我认为原有脚本补全的不足,我主要做了一下几个方面的补充:
1)定义了<S-ENTER>快捷键,用于跳出括号,省去了再按ESC,然后移动。但有一个不足,就是,对于多重大括号,是跳到最后一个的下一行。没想到什么更好的办法,希望能有人给改改;
2)定义了<S-SPACE>快捷键,用于跳过括号,相当与normal状态下的l;
3)定义了“;;”快捷键,主要是方便的在多重括号中直接移动到行尾,并添加“;”;
4)对大括号的(“{}”)的补全做了判断,分几种情况处理,以保证格式。

代码:
:inoremap <S-ENTER> <c-r>=SkipPair()<CR>
:inoremap <S-SPACE> <ESC>la
:inoremap <C-ENTER> <ESC>A;<CR>
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { <c-r>=ClsoeBrace()<CR>
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap ;; <ESC>A;<CR>

function ClosePair(char)
   if getline('.')[col('.') - 1] == a:char
      return "\<Right>"
   else
      return a:char
   endif
endf
function Semicolon()
   "echo getline('.')[col('.')]
   if getline('.')[col('.')] == ')'
      return "<ESC>A;"
   elseif getline('.')[col('.')] == '}'
      return "\<ESC>A;"
   elseif getline('.')[col('.')] == ']'
      return "\<ESC>A;"
   else
      return ";"
   endif
endf
function SkipPair()
   if getline('.')[col('.') - 1] == ')'
      return "\<ESC>o"
   else
      normal j
      let curline = line('.')
      let nxtline = curline
      while curline == nxtline
         if getline('.')[col('.') - 1] == '}'
            normal j
            let nxtline = nxtline + 1
            let curline = line('.')
            continue
         else
            return "\<ESC>i"
         endif
         
      endwhile
      return "\<ESC>o"
   endif
endf
function ClsoeBrace()
   if getline('.')[col('.') - 2] == '='
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 3] == '='
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 1] == '{'
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 2] == '{'
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 2] == ','
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 3] == ','
      return "{}\<ESC>i"
   else
      return "{\<ENTER>}\<ESC>O"
   endif
endf


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-03-21 21:49 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
又搞Close啊。其实,太复杂了,就有点理想主义了。简单的(够了。


_________________
● 鸣学


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-03-21 21:52 
头像

注册: 2006-09-10 22:36
帖子: 10663
地址: 北京
送出感谢: 1
接收感谢: 16
自动补全有时很别扭


_________________
看破、放下、自在、随缘、念佛
真诚、清净、平等、正觉、慈悲


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-03-21 22:26 

注册: 2006-07-09 19:22
帖子: 18
送出感谢: 0 次
接收感谢: 0 次
有时候自动补全不够顺手,就想搞的顺手点,结果搞来搞去就复杂了。
木办法啊,简单就是美。


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-03-21 23:23 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
94啊。才知道啊。我也搞过了的。简单点算了。


_________________
● 鸣学


页首
 用户资料  
 
6 楼 
 文章标题 : Re: [分享]vim括号自动补全
帖子发表于 : 2012-01-02 0:33 

注册: 2012-01-02 0:23
帖子: 1
送出感谢: 0 次
接收感谢: 0 次
為什麼都是风凉话 .... 我来顶 ~~~~ !!!!!

fireflycn 写道:
我参照一个括号自动补全的脚本重新修改了一下,由于不太会写,所以很多实现都很dirty,希望有人能再修改一下,让补全更完美。
针对我认为原有脚本补全的不足,我主要做了一下几个方面的补充:
1)定义了<S-ENTER>快捷键,用于跳出括号,省去了再按ESC,然后移动。但有一个不足,就是,对于多重大括号,是跳到最后一个的下一行。没想到什么更好的办法,希望能有人给改改;
2)定义了<S-SPACE>快捷键,用于跳过括号,相当与normal状态下的l;
3)定义了“;;”快捷键,主要是方便的在多重括号中直接移动到行尾,并添加“;”;
4)对大括号的(“{}”)的补全做了判断,分几种情况处理,以保证格式。

代码:
:inoremap <S-ENTER> <c-r>=SkipPair()<CR>
:inoremap <S-SPACE> <ESC>la
:inoremap <C-ENTER> <ESC>A;<CR>
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { <c-r>=ClsoeBrace()<CR>
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap ;; <ESC>A;<CR>

function ClosePair(char)
   if getline('.')[col('.') - 1] == a:char
      return "\<Right>"
   else
      return a:char
   endif
endf
function Semicolon()
   "echo getline('.')[col('.')]
   if getline('.')[col('.')] == ')'
      return "<ESC>A;"
   elseif getline('.')[col('.')] == '}'
      return "\<ESC>A;"
   elseif getline('.')[col('.')] == ']'
      return "\<ESC>A;"
   else
      return ";"
   endif
endf
function SkipPair()
   if getline('.')[col('.') - 1] == ')'
      return "\<ESC>o"
   else
      normal j
      let curline = line('.')
      let nxtline = curline
      while curline == nxtline
         if getline('.')[col('.') - 1] == '}'
            normal j
            let nxtline = nxtline + 1
            let curline = line('.')
            continue
         else
            return "\<ESC>i"
         endif
         
      endwhile
      return "\<ESC>o"
   endif
endf
function ClsoeBrace()
   if getline('.')[col('.') - 2] == '='
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 3] == '='
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 1] == '{'
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 2] == '{'
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 2] == ','
      return "{}\<ESC>i"
   elseif getline('.')[col('.') - 3] == ','
      return "{}\<ESC>i"
   else
      return "{\<ENTER>}\<ESC>O"
   endif
endf


页首
 用户资料  
 
7 楼 
 文章标题 : Re: [分享]vim括号自动补全
帖子发表于 : 2012-01-02 9:15 
头像

注册: 2007-03-24 23:45
帖子: 2357
送出感谢: 0 次
接收感谢: 9
语法这东西,追求完美的话,代价很大的,效率很低的
简单够用就行了


页首
 用户资料  
 
8 楼 
 文章标题 : Re: [分享]vim括号自动补全
帖子发表于 : 2012-01-03 5:47 
头像

注册: 2008-12-28 16:01
帖子: 728
送出感谢: 2
接收感谢: 15
代码:
imap <M-(> ()<left>
exec "set <M-(>=\<Esc>("

啥都不做,()<Esc>i 四个键按出来也就零点几秒的事。要向后移可以 <Esc>la

曾经到处找过这种插件。刚装上的时候感觉还是很不错的,一下子看到两个括号都出来了
心里踏实啊。用着用着就不爽了,因为经常需要手动处理它造成的问题--删除它插入的额
外括号等。插入时就把后面的括号补上,这个有点实用价值的地方也就lisp了。一般括号
很快就会被手动打上。


_________________
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车


页首
 用户资料  
 
9 楼 
 文章标题 : Re: [分享]vim括号自动补全
帖子发表于 : 2012-01-03 14:32 

注册: 2011-08-29 23:17
帖子: 189
送出感谢: 0 次
接收感谢: 1
这个脚本很好用呢?据说用这个可以防止忘记反XX,省得少编译一次
引用:
autoclose.vim


_________________
代码:
坚决拥护党中央.....


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

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


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

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

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