Vim中根据正则对选中文本对齐(比如ini文件的=号对齐)

vimrc增加如下内容即可:

vnoremap <M-=> :call Duiqi('\v(^\s*\S+)\s+(.*)')<CR>  
  
"reg匹配的第2段文字对齐  
function! Duiqi(reg)  
    let l0 = line("'<")  
    let l1 = line("'>")  
    "获取第1个单词及前面空格的最大长度  
    let max = 0  
    let arr = {}  
    let l = l0  
    while l <= l1  
        let arr[l] = matchlist(getline(l), a:reg) "把字符串分成2段  
        let len = strlen(arr[l][1])  
        let max = (len > max ? len : max)  
        let l += 1  
    endwhile  
    let max += 1 "最长的后面要放一个空格  
    "设置strSpace  
    let strSpace = CreateSpaces(max)  
    "开始对齐  
    let l = l0  
    while l <= l1  
        call setline(l, arr[l][1].strpart(strSpace, 0, max-strlen(arr[l][1])). arr[l][2])  
        let l += 1  
    endwhile  
endfunction  
  
"生成n个空格的字符串  
function! CreateSpaces(n)  
    let s = ''  
    for i in range(a:n)  
        let s .= ' '   
    endfor  
    return s  
endfunction  

  

函数参数用的正则表达式,例子中的正则是根据每行的第2个单词对齐,
主要就是两个()内匹配的内容。
使用方法:要先选中要对齐的行,再按Alt+=对齐,效果如下:

如果前面有空格,则效果如下:

如果想去除最前面的空格,修改参数为

'\v^\s*(\S+)\s+(.*)'

效果如下:

想修改对齐规则,则要自己设置正则了。

posted @ 2017-04-03 20:06  火冷  阅读(3050)  评论(0编辑  收藏  举报