Vim

縮進多行的中間

  • December 7, 2012

我經常遇到這樣的情況:

title : Jekyll Bootstrap
tagline: Site Tagline
author :
 name : Name Lastname
 email : blah@email.test
 github : username
 twitter : username
 feedburner : feedname

如果參數沒有很好地排列,是否有一種標準方法vim可以將其格式化,每個相應的參數與最近的縮進對齊,其中縮進定義為 2 個空格,而不必逐行遍歷,如下所示:

title   : Jekyll Bootstrap
tagline : Site Tagline
author  :
 name      : Name Lastname
 email     : blah@email.test
 github    : username
 twitter   : username
 feedburner: feedname

更新:

我相信tabular.vim是我正在尋找的外掛,但是我很難形成一個正則表達式,當決定某些東西應該是一個塊的一部分時,它會考慮到行首的空格數,即Tabularize/:產生:

title       : Jekyll Bootstrap
tagline     : Site Tagline
author      :
 name      : Name Lastname
 email     : blah@email.test
 github    : username
 twitter   : username
 feedburner: feedname

這是文件中的一個範例,其中通過正則表達式實現了以下目標:

abc,def,ghi
a,b
a,b,c

:表格化/^

$$ ^, $$*\zs,/r0c0l0

abc,def,ghi
 a,b
 a,b,c

但是當考慮在同一塊的前面部分具有相同數量的空格的每一行同時仍然評估子塊時,我不確定如何制定這一點,例如以下比我的原始範例更複雜的子塊:

comments :
 provider : disqus
 disqus :
   short_name : jekyllbootstrap
 livefyre :
   site_id : 123
 intensedebate :
   account : 123abc
 facebook :
   appid : 123
   num_posts : 5
   width : 580
   colorscheme : light

將轉換tabularize\some_regular_expression_I_cant_figure_out為:

comments :
 provider      : disqus
 disqus        :
   short_name    : jekyllbootstrap
 livefyre      :
   site_id       : 123
 intensedebate :
   account       : 123abc
 facebook      :
   appid         : 123
   num_posts     : 5
   width         : 580
   colorscheme   : light

vim的Tabularize外掛可以完全滿足您的需求。歸結為打字Tabularize /:

但是,這可能不會保留左側的縮進。

編輯您更新的問題:我無法直接使用 Tabular 執行此操作,但我可以使用第二個命令來執行此操作,該命令是對范圍的搜尋和替換:

:%s/\([ ]*\)[[:alpha:][:punct:]]*[ ]*/\0\1/

這會在 . 前面搜尋一定數量的空格:,並將它們粘貼到該分號之前。

所以,壞消息和好消息。壞消息是,如果不做一些工作,Tabular 就無法真正完成您的要求 - 手頭的問題需要比 Tabular 通常可以訪問的更多上下文。好消息是 Tabular 旨在允許用作極其靈活的通用文本操作工具,在這種情況下,讓 Tabular 做你想做的事情並不難。

創建一個以~/.vim/after/plugin/TabularizeRecord.vim這些(希望有足夠多的評論)內容命名的文件:

" Create a new tabular pipeline named 'record' that includes all adjacent
" lines containing a : in its default range, and manipulates those lines by
" passing them through the TabularizeIndentedRecord function
AddTabularPipeline! record /:/ TabularizeIndentedRecord(a:lines)

function! TabularizeIndentedRecord(lines)
 " A list containing each of the lines with leading spaces removed
 let text = map(copy(a:lines), 'substitute(v:val, "^ *", "", "")')
 " A list containing just the leading spaces for each line
 let spaces = map(copy(a:lines), 'substitute(v:val, "^ *\\zs.*", "", "")')
 " Tabularize only the text, not the leading spaces.  This pattern is more
 " complicated than just /:/ to handle lines with multiple colons.
 call tabular#TabularizeStrings(text, '[^:]*\zs:', 'l1')
 " Tack the spaces back on to the beginning of each line, and store the
 " resulting lines back in the a:lines list
 call map(a:lines, 'remove(spaces, 0) . remove(text, 0)')
endfunction

一旦該文件存在,重新啟動 vim,然後您應該能夠通過執行以下操作獲得所需的縮進:

:Tab record

據我所知,最終結果正是您正在尋找的 - 如果由於某種原因它無法解決,或者如果我誤解了要求,請告訴我。

引用自:https://unix.stackexchange.com/questions/35787