现在的位置: 首页 > 综合 > 正文

vim脚本——格式化变量定义代码

2018年02月21日 ⁄ 综合 ⁄ 共 2370字 ⁄ 字号 评论关闭

跟之前在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找到用法。

抱歉!评论已关闭.