私はよく次のような状況に遭遇します:
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
私の知る限り、その最終結果はまさにあなたが求めているものです。ただし、何らかの理由でうまくいかなかった場合、または私が要件を誤解していた場合はお知らせください。