複数行の途中でインデント

複数行の途中でインデント

私はしばしば次のような状況に直面しています。

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

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

関連情報