多行中間縮排

多行中間縮排

我常遇到這樣的情況:

title : Jekyll Bootstrap
tagline: Site Tagline
author :
  name : Name Lastname
  email : [email protected]
  github : username
  twitter : username
  feedburner : feedname

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

title   : Jekyll Bootstrap
tagline : Site Tagline
author  :
  name      : Name Lastname
  email     : [email protected]
  github    : username
  twitter   : username
  feedburner: feedname

更新:

我相信表格.vim是我正在尋找的插件,但我很難形成正規表示式,在決定某些內容應該成為區塊的一部分時,該正規表示式會考慮行開頭的空格數,即Tabularize/:產生:

title       : Jekyll Bootstrap
tagline     : Site Tagline
author      :
  name      : Name Lastname
  email     : [email protected]
  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

答案1

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

然而,這可能不會保留左側的縮排。

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

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

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

答案2

所以,壞消息和好消息。壞消息是,如果不做一些工作,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

據我所知,最終的結果正是您想要的 - 如果由於某種原因它不起作用,或者如果我誤解了要求,請告訴我。

相關內容