複数行の中央をインデントする

複数行の中央をインデントする

私はよく次のような状況に遭遇します:

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

引数が適切に整列されていない場合、vim次のように、1 行ずつ確認せずに、対応する各引数を最も近いインデントに合わせてフォーマットする標準的な方法はありますか。インデントは 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 では直接これを行うことはできませんでしたが、範囲の検索と置換を行う 2 番目のコマンドを使用するとこれを行うことができました。

 :%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

私の知る限り、その最終結果はまさにあなたが求めているものです。ただし、何らかの理由でうまくいかなかった場合、または私が要件を誤解していた場合はお知らせください。

関連情報