一致をVim
に置き換えるときに、置換文字列をフォーマットすることは可能ですか?
各行のエントリがスペースで区切られている2列のテーブルを持つファイルがあるとします。エントリ(および行)は固定幅ではありません。適切な量のスペースを追加して、2列目の項目がすべて揃えられるようにテーブルをフォーマットしたいと思います。
たとえば、次の表は次のとおりです。
_A aa
BBBB bbb
CC c
_
私が欲しいもの:
_A aa
BBBB bbb
CC c
_
(ここではタブは解決策ではないことに注意してください。)
Vim
コマンドは次のようになります。
_:0,$ s/\(.*\) \(.*\)/\1(******N)\2/
_
_(******N)
_は、2番目の要素をN番目の文字位置に配置するためのフォーマットコードに置き換える必要があります。
PDATE 1:つまり、Vimにはprintf()
関数があります。その目的のためにコマンドプロンプトから直接使用できますか、それともすべての行で明示的なループを実行してVimスクリプトに含める必要がありますか?
Vim.orgのalignプラグインの1つを試してみることをお勧めします。キャンベル博士の最も人気のあるものを使用しています: http://www.vim.org/scripts/script.php?script_id=294
それはさておき、はい、代わりのコマンドからVim関数を呼び出すことができますが、欠点は全体の置換パターンが式でなければならないことです。 「_:help sub-replace-expression
_」および「:help submatch()
」を参照してください。たとえば、一致したパターンを文字数に置き換えたい場合は、次のようにします。
_:%s/pattern/\=len(submatch(0))/g
_
したがって、printf()を使用するというあなたのアイデアはうまくいくでしょう:
_:%s/\(.*\) \(.*\)/\=printf('%-7s %-7s',submatch(1),submatch(2))/
_
システムを指定しませんでしたが、UNIXライクなシステムでは、column
コマンドをフィルターとして使用できます。
:%!column -t
参照:
:help filter
$ man column