web-dev-qa-db-ja.com

Vimで文字列の代替またはテキスト行をフォーマットする方法は?

一致を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スクリプトに含める必要がありますか?

3
ysap

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))/
_
5
Heptite

システムを指定しませんでしたが、UNIXライクなシステムでは、columnコマンドをフィルターとして使用できます。

:%!column -t

参照:

:help filter
$ man column
2
romainl