[分享]vim括号自动补全

Vim、Emacs配置和使用
回复
fireflycn
帖子: 18
注册时间: 2006-07-09 19:22

[分享]vim括号自动补全

#1

帖子 fireflycn » 2008-03-21 21:42

我参照一个括号自动补全的脚本重新修改了一下,由于不太会写,所以很多实现都很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
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#2

帖子 eexpress » 2008-03-21 21:49

又搞Close啊。其实,太复杂了,就有点理想主义了。简单的(够了。
● 鸣学
头像
qiang_liu8183
论坛版主
帖子: 10701
注册时间: 2006-09-10 22:36
系统: Arch Debian
来自: 北京

#3

帖子 qiang_liu8183 » 2008-03-21 21:52

自动补全有时很别扭
干不了大事就把小事干的大气点
fireflycn
帖子: 18
注册时间: 2006-07-09 19:22

#4

帖子 fireflycn » 2008-03-21 22:26

有时候自动补全不够顺手,就想搞的顺手点,结果搞来搞去就复杂了。
木办法啊,简单就是美。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

#5

帖子 eexpress » 2008-03-21 23:23

94啊。才知道啊。我也搞过了的。简单点算了。
● 鸣学
xiaodaselang
帖子: 1
注册时间: 2012-01-02 0:23

Re: [分享]vim括号自动补全

#6

帖子 xiaodaselang » 2012-01-02 0:33

為什麼都是风凉话 .... 我来顶 ~~~~ !!!!!
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
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: [分享]vim括号自动补全

#7

帖子 fanhe » 2012-01-02 9:15

语法这东西,追求完美的话,代价很大的,效率很低的
简单够用就行了
头像
Fermat618
帖子: 728
注册时间: 2008-12-28 16:01

Re: [分享]vim括号自动补全

#8

帖子 Fermat618 » 2012-01-03 5:47

代码: 全选

imap <M-(> ()<left>
exec "set <M-(>=\<Esc>("
啥都不做,()<Esc>i 四个键按出来也就零点几秒的事。要向后移可以 <Esc>la

曾经到处找过这种插件。刚装上的时候感觉还是很不错的,一下子看到两个括号都出来了
心里踏实啊。用着用着就不爽了,因为经常需要手动处理它造成的问题--删除它插入的额
外括号等。插入时就把后面的括号补上,这个有点实用价值的地方也就lisp了。一般括号
很快就会被手动打上。
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车
surmise
帖子: 189
注册时间: 2011-08-29 23:17

Re: [分享]vim括号自动补全

#9

帖子 surmise » 2012-01-03 14:32

这个脚本很好用呢?据说用这个可以防止忘记反XX,省得少编译一次
autoclose.vim

代码: 全选

坚决拥护党中央.....
回复