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