Tabular: 在 Vim 中对齐文本
刚才在Linuxtoy上发现一个很好用的Vim插件: tabular ,下载试用了一下,确实很方便。 对于程序员来说,都希望代码看着整齐一点,tabular 就是实现代码对齐的。比如好几行的变量赋值语句, 变量名长短"参差不齐",有时候会习惯手动调整,让赋值的"="对齐。其他时候,比如括号的对齐。 随手挑了一段代码试了一下:
将光标移动到第7行,输入 :Tab /{ 将会根据 "{" 对齐接下来的几行代码(貌似 tabular 可以自动识别"作用域",只处理7 – 15 行之间的代码),像这样:
第8行代码最长,所以会根据其"{" 调节其他代码行~ 还可以根据其他符号对齐,
:Tab /[symbol_to_align]
当然这种格式调整也要根据情况使用,有的时候也不一定能达到好的效果。
Vim 排版一般都是用 V 選起來後, 按 = 就會自動排列, 只是要排上述講得 "=", 就需要這個 Plugin 來計算排列, 相關內容可見下述:
- Aligning text with Tabular.vim - 此篇有影片介紹
- Vim Tabular Plugin 可見: godlygeek/tabular - GitHub
Vim Plugin - Tabular 安裝
- git clone https://github.com/godlygeek/tabular.git
- cd tabular/
- mv after autoload doc plugin ~/.vim/
- vim ~/.vimrc # 於此檔案最末端加入下述
let mapleader=','
if exists(":Tabularize")
nmap a= :Tabularize /=
vmap a= :Tabularize /=
nmap a: :Tabularize /:\zs
vmap a: :Tabularize /:\zs
endifinoremap:callalign()a
function! s:align()
let p = '^\s*|\s.*\s|\s*$'
if exists(':Tabularize') && getline('.') =~# '^\s*|' && (getline(line('.')-1) =~# p || getline(line('.')+1) =~# p)
let column = strlen(substitute(getline('.')[0:col('.')],'[^|]','','g'))
let position = strlen(matchstr(getline('.')[0:col('.')],'.*|\s*\zs.*'))
Tabularize/|/l1
normal! 0
call search(repeat('[^|]*|',column).'\s\{-\}'.repeat('.',position),'ce',line('.'))
endif
endfunction
Tabular Plugin 測試
輸入下述內容:
|start|eat|left|
|12|5|7|
|20|5|15|
V 選取後, , 之後在下面繼續打, 都會自動排序. (若文字過長, 上面都會自動對齊)
:Tab/ 後面接要分隔的符號, ex: 上述是用 "|" 分隔, 所以輸入 :Tab/|, 程式若要排 "=", 則輸入 :Tab/=, 更多範例可見下述:
- :Tab/:
- :Tab/=
- :Tab/:\zs # 只有排序 ":" 後面的文字