跟之前在vs2008里面写的那个格式化插件一样的功能。
效果:
格式化之前
格式化之后
vim脚本代码:
" copy this code in your "vimrc" file
" use visual mode to select the code snippets and press 'f', that's all!
vmap f <ESC>: call FormatDefine()<CR>
function! FormatDefine()
let [lnum1, col1] = getpos("'<")[1:2]
let [lnum2, col2] = getpos("'>")[1:2]
let lines = getline(lnum1, lnum2)
if (1 == col2)
let lnum2 -= 1
endif
let array = []
let max_len_part1 = 0
let max_len_part2 = 0
let long_space = " "
let a_line = getline(lnum1)
let prefix_space = 0
while (' ' == a_line[prefix_space])
let prefix_space += 1
endwhile
let prefix = long_space[1:prefix_space]
for i in range(lnum1, lnum2)
let a_line = getline(i)
let a_line_array = []
let pos_equal_sign = stridx(a_line, '=')
let len = strlen(a_line)
if (-1 == pos_equal_sign)
let tail = len - 1
let part3 = ""
else
let tail = pos_equal_sign - 1
let part3 = a_line[pos_equal_sign : (len-1)]
endif
while (' ' == a_line[tail] && tail > 0)
let tail -= 1
endwhile
let pos_space = strridx(a_line, ' ', tail)
let pos_right_brack = strridx(a_line, '>', tail)
let pos_point = strridx(a_line, '*', tail)
let start = (pos_space > pos_right_brack) ? pos_space : pos_right_brack
let start = (start > pos_point) ? start : pos_point
if (-1 == start)
let part2 = a_line[0 : tail]
let part1 = ""
else
let part2 = a_line[start+1 : tail]
while (' ' == a_line[start] && start > 0)
let start -= 1
endwhile
if (0 == start)
let part1 = ""
else
let begin = 0
while (' ' == a_line[begin])
let begin += 1
endwhile
let part1 = a_line[begin : start]
endif
endif
if (0 == strlen(part1))
let part1 = part2
let part2 = ""
endif
if ( ' ' != part3[1])
let part3 = part3[0:0] . " " . part3[1:-1]
endif
call add(a_line_array, part1)
call add(a_line_array, part2)
call add(a_line_array, part3)
let len_tmp = strlen(part1)
if (max_len_part1 < len_tmp)
let max_len_part1 = len_tmp
endif
let len_tmp = strlen(part2)
if (max_len_part2 < len_tmp)
let max_len_part2 = len_tmp
endif
call add(array, a_line_array)
endfor
let max_len_part1 = (max_len_part1 + 4)/4 * 4
let max_len_part2 = (max_len_part2 + 4)/4 * 4
for i in range(0, lnum2 - lnum1)
let part1 = array[i][0]
let len1 = strlen(part1)
let part2 = array[i][1]
let len2 = strlen(part2)
let part3 = array[i][2]
call setline(lnum1+i, prefix . part1 . long_space[1:(max_len_part1-len1)] .
\ part2 . long_space[1:(max_len_part2-len2)] .
\ part3)
endfor
endfunction
用法:
将上面的代码复制到你的 vimrc 文件里面,然后在浏览代码的时候用visual模式选中要格式化的代码,按 f 键, 就可以啦!
补充:
写这个脚本就两个要点,一个是怎么获取vim visual模式选中的行,二是怎么修改某一行的代码。
第一个问题,参考这里:
第二个问题,可以在vim的帮助文档里面找到。( usr_41.txt 关于脚本编写)
使用内部函数 setline(line_number, context)。
函数使用也可以在usr_41.txt文档中找到。
获取子字符串是和python类似的切片操作substring = string[start : end],可以在eval.txt中搜索substing找到用法。