パーソナルツール

高性能なテキスト整形ツールAlignの使い方 #4 「:Align」コマンドを使用して整形処理を行う

作者: 小見 拓 最終変更 2012年01月08日 11時52分

組み込みのマッピングによる整形機能を使用する以外に Alignに用意された整形処理コマンド「:Align」を直接実行して、 整形処理を行う方法も用意されています。 この方法は組み込みのマッピングを使用する場合に比べて、 様々なフォーマットのテキストの整形に対応できる上、 整形処理の結果を細かく調節できる利点があります。 (Windows, Mac)

概要

Align : Provides commands and maps to help produce aligned text, eqns, declarations, etc
http://www.vim.org/scripts/script.php?script_id=294

組み込みのマッピングによる整形機能を使用する以外に Align に用意された整形処理コマンド「:Align」を直接実行して、 整形処理を行う方法も用意されています。
この方法は組み込みのマッピングを使用する場合に比べて、 様々なフォーマットのテキストの整形に対応できる上、 整形処理の結果を細かく調節できる利点があります。

高性能なテキスト整形ツールAlignの使い方 #1 インストールから設定まで 」の続きとなる記事です。

「:Align」コマンドで整形する

はじめに、整形処理を実行する「:Align」コマンドの使い方を説明します。
「:Align」コマンドは引数に与えられたセパレータで、文章をいくつかのフィールドに分割し、 その各フィールドの位置を揃えるコマンドです。

" 「:Align」コマンドの書式
:Align [{セパレータ1}] [{セパレータ2}] [{セパレータ3}] ....

「[」と「]」で囲まれた範囲に関しては省略可能です。

コマンドの使い方は簡単で、 例えば、以下のようなCSVフォーマットのファイルがある時に、 各フィールドの位置を整理してファイルを見やすくするには、

** サンプルCSVファイル**
one,two,three,four,five
six,seven,eight,nine,ten
eleven,twelve,thirteen,fourteen,fifteen

次のように「,(カンマ)」をセパレータに指定して「:Align」コマンドを実行します。

:Align ,
** サンプルCSVファイル整形後**
one    , two    , three    , four     , five
six    , seven  , eight    , nine     , ten
eleven , twelve , thirteen , fourteen , fifteen

「:Align」コマンドの整形範囲指定

「:Align」コマンドで整形する範囲は、 通常のコマンド実行と同じようにコマンドラインモードで指定するか、

" コマンド実行時に範囲指定する
:%:Align ,
:20,50:Align ,

ビジュアルモードで範囲を選択して指定します。
(範囲を選択した状態で「:Align」コマンドを実行する。)

ビジュアルモードで整形処理の範囲を選択する。
one,two,three,four,five
six,seven,eight,nine,ten
eleven,twelve,thirteen,fourteen,fifteen

整形範囲を指定しない場合は、通常のコマンド実行と同じく、 「:Align」コマンドはカレント行のみを対象に整形処理を実行します。

「:Align」コマンドの引数

「:Align」コマンドには、文章分割用のセパレータを複数指定できます。
デフォルトの状態では、次のようにコマンドを実行したら、 「A」か「B」か「C」か「D」か「E」をセパレータとして扱います。

" デフォルトでは、A or B or C or D or E
:Align A B C D E

例えば、次の文章に、

one,two-three+four=five
six,seven-eight+nine+ten
eleven,twelve=thirteen+fourteen=fifteen

「,」「=」「+」「-」を指定して「:Align」コマンドを実行すれば、

:%:Align , = + -

↓ 「,」「=」「+」「-」で文章を区切って、このように整形できるということです。

one    , two    - three    + four     = five
six    , seven  - eight    + nine     + ten
eleven , twelve = thirteen + fourteen = fifteen

「:AlignCtrl」コマンドで整形処理の条件を設定する

「:Align」コマンドの整形処理の結果をカスタマイズするには、「:AlignCtrl」コマンドを使用します。 この「:AlignCtrl」コマンドは整形処理の条件を設定するコマンドです。
「:AlignCtrl」コマンドは、「:Align」コマンドと組み合わせて、

「:AlignCtrl」コマンドで整形処理の条件を設定
  ↓
「:Align」コマンドで整形処理を行う

というように使用します。

「:AlignCtrl」コマンドのフォーマット

「:AlignCtrl」コマンドのフォーマットは次のとおりです。
コマンド中、「[」と「]」で囲まれた範囲に関しては省略可能。

" 「:AlignCtrl」コマンドの書式
:AlignCtrl {整形処理の条件} [{セパレータ1}] [{セパレータ2}] [{セパレータ3}] ....

「:Align」コマンド実行時に使用されるセパレータ

この「:AlignCtrl」コマンドのフォーマットに対して、 「:Align」コマンドのフォーマットは下記のようになっていました。

" 「:Align」コマンドの書式
:Align [{セパレータ1}] [{セパレータ2}] [{セパレータ3}] ....

上の章では説明しませんでしたが、「:Align」コマンドを引数なしで実行すると、
「:AlignCtrl」コマンドか「:Align」コマンドで、 最後に設定したセパレータが文章の区切りとして使用されます。

" 「:AlignCtrl」コマンドでセパレータを指定
" コマンド中の「=」は整形処理の条件。説明はあとで。
:AlignCtrl = ,
" ↓
" 直前の「:AlignCtrl」コマンドで指定したセパレータが使用される
:Align
" ↓
" 新たにセパレータを指定するまでは同じセパレータが使われる
:Align

つまり、「:AlignCtrl」コマンドか「:Align」コマンド、どちらかで一度設定すれば、 しばらくは同じセパレータを使いまわせる、ということになります。

「:AlignCtrl」での整形処理の条件の指定の仕方

「:AlignCtrl」コマンドのコマンド例は次のようになります。
(どのように指定すれば、どのように整形の結果が変わるかについては後述。)

" 整形処理の条件を設定
:AlignCtrl l=p0P2 ,

全ての条件を一度の「:AlignCtrl」コマンド実行で指定する必要はなく、
下記例のように何度かに分けて条件を設定できます。

" パターン1 一度に全ての条件指定
:AlignCtrl l=p0P2 ,

" パターン2 二度に分けて条件を指定
:AlignCtrl l= ,
:AlignCtrl p0P2

" パターン3 四度に分けて整形の条件指定
:AlignCtrl l
:AlignCtrl = ,
:AlignCtrl p0
:AlignCtrl P2

各フィールドの左寄せ、右寄せ、センタリング。

セパレータで文章を区切った後の、各フィールドの整形位置を左端で合わせるか、 右端で合わせるか、あるいは中央に配置するかを指定するには、
「:AlignCtrl」コマンドで整形処理の条件として「l」「r」「c」を指定します。

" 左寄せ
:AlignCtrl l
" 右寄せ
:AlignCtrl r
" センタリング
:AlignCtrl c

次のような「=」区切りの整形前コードがあるとして、

a=bb=ccc=1=dd=ee=ffff
ccc=a=bb=2=ee=ff=g
dd=eee=f=39=bbb=ssss=tttt

左寄せ「l」を指定した場合、

:AlignCtrl l
:Align =
a   = bb  = ccc = 1  = dd  = ee   = ffff
ccc = a   = bb  = 2  = ee  = ff   = g
dd  = eee = f   = 39 = bbb = ssss = tttt

右寄せ「r」を指定した場合、

:AlignCtrl r
:Align =
  a =  bb = ccc =  1 =  dd =   ee = ffff
ccc =   a =  bb =  2 =  ee =   ff =    g
 dd = eee =   f = 39 = bbb = ssss = tttt

中央揃え「c」を指定した場合、

:AlignCtrl l
:Align =
 a  = bb  = ccc = 1  = dd  =  ee  = ffff
ccc =  a  = bb  = 2  = ee  =  ff  =  g
dd  = eee =  f  = 39 = bbb = ssss = tttt

と整形します。


左から1番目のフィールドを左寄せ、2番目のフィールドを右寄せ、3番目のフィールドを左寄せ、といった具体に、
それぞれのフィールドに対し配置を指定したい場合は、 フィールドの配置を制御する「l」「r」「c」を順に並べて指定します。

「l」「r」「c」の並び
:AlignCtrl lrl
:Align =
a=bb=ccc=1=dd=ee=ffff
ccc=a=bb=2=ee=ff=g
dd=eee=f=39=bbb=ssss=tttt

 ↓ 1番目のフィールドを左寄せ、2番目のフィールドを右寄せ、3番目のフィールドを左寄せで整形

a   =  bb = ccc = 1  =  dd = ee   = ffff
ccc =   a = bb  = 2  =  ee = ff   = g
dd  = eee = f   = 39 = bbb = ssss = tttt

Note

「:AlignCtrl」コマンドで指定した配置の数より、フィールドの数の方が多いときは、
指定した配置指定がループします。

「l」「r」「c」の並びのループ

配置指定の繰り返し、配置の整形条件のスキップ。

少し変わった整形の条件指定として、「+」「:」「-」があります。
これらの条件は、「l」「r」「c」の条件と一緒に用います。 少し難しいので、例を見て理解してください。

命令 説明
+ それ以降のフィールドの配置は、最後の「l」「r」「c」と同じ配置制御を適用する。
: それ以降のフィールドは、セパレータで分割しない。
- 指定したフィールドは分割しないで、スキップし、右のフィールドと連結する。

整形前のコードが次の「=」区切りのコードであったとして、

a=bb=ccc=1=dd=ee=ffff
ccc=a=bb=2=ee=ff=g
dd=eee=f=39=bbb=ssss=tttt

例えば、「:AlignCtrl lrl+」と指定したとすると、 4番目のフィールド以降は、最後の「l」「r」「c」命令、 この場合、左寄せ「l」で整形します。

:AlignCtrl lrl+
:Align =
a   =  bb = ccc = 1  = dd  = ee   = ffff
ccc =   a = bb  = 2  = ee  = ff   = g
dd  = eee = f   = 39 = bbb = ssss = tttt

「:」を指定すると、それ以降のフィールドは、セパレータによる分割の対象となりません。
例えば、「:AlignCtrl lrl:」と指定すると、4番目のフィールド以降のテキストは分割しないで、 一塊の文章として扱います。

:AlignCtrl lrl:
:Align =
a   =  bb = ccc = 1=dd=ee=ffff
ccc =   a = bb  = 2=ee=ff=g
dd  = eee = f   = 39=bbb=ssss=tttt

「-」を指定すると、指定されたフィールドの配置指定はスキップされます。
スキップされたフィールドは右のフィールドにくっつきます。

:AlignCtrl l-cr-r
:Align =
a   = bb=ccc =  1 =    dd=ee = ffff
ccc =  a=bb  =  2 =    ee=ff = g
dd  = eee=f  = 39 = bbb=ssss = tttt

セパレータの左寄せ、右寄せ、センタリング。

各行のセパレータの文字数が違う時に、 そのセパレータの左寄せ、右寄せ、センタリングを制御するには、
「:AlignCtrl」コマンドで「<」「>」「|」を指定します。

" セパレータを左寄せに。
:AlignCtrl <
" セパレータを右寄せに。
:AlignCtrl > 長いセパレータを右寄せ
" セパレータを中央に配置する。
:AlignCtrl |

Note

各行のセパレータの文字数が違うという状況は、 セパレータの指定に正規表現を使用した時に発生する場合があります。

" 1文字以上の連続した「-」をセパレータとして指定する。
:Align -\+

可変数の「-」を区切りとする、次の整形前コードがあるとして、

a - bbb - c
aa -- bb -- ccc
aaa --- b --- cc

左寄せ「<」を指定すると、

:AlignCtrl <
:Align -\+
a   -   bbb -   c
aa  --  bb  --  ccc
aaa --- b   --- cc

右寄せ「>」を指定すると、

:AlignCtrl >
:Align -\+
a     - bbb   - c
aa   -- bb   -- ccc
aaa --- b   --- cc

中央揃え「|」を指定すると、

:AlignCtrl |
:Align -\+
a    -  bbb  -  c
aa  --  bb  --  ccc
aaa --- b   --- cc

と整形します。


セパレータの位置ごとに、配置を指定したい場合は、 フィールドの配置指定の時と同じく、 「:AlignCtrl」コマンドで一度に条件を指定します。
指定した条件の数より、セパレータの数が多い場合は、条件がループします。

" 最初のセパレータを左寄せ
" 2番目のセパレータを左寄せ
" 3番目のセパレータを右寄せ
" 以後、ループ
:AlignCtrl <<>
:Align -\+
a - bbb - ca - bbb - ca - bbb - ca - bbb - c
aa -- bb -- cccaa -- bb -- cccaa -- bb -- cccaa -- bb -- ccc
aaa --- b --- ccaaa --- b --- ccaaa --- b --- ccaaa --- b --- cc

↓ このように整形される。

a  -    bbb-    ca     -  bbb-    ca   -    bbb  -  ca   -    bbb-    c
aa --   bb --   cccaa --  bb --   cccaa--   bb  --  cccaa--   bb --   ccc
aaa---  b  ---  ccaaa---  b  ---  ccaaa---  b  ---  ccaaa---  b  ---  cc

セパレータとフィールド間の空白文字サイズを調整する。

セパレータと各フィールド間のスペースのサイズを調節するには、 「:AlignCtrl」コマンドで「p」か「P」を指定します。
「p」がセパレータ左の空白文字サイズで、 「P」がセパレータ右空白文字サイズを制御する指定です。
この「p」「P」の条件は、空白文字のサイズとなる数字と組み合わせて使用します。

:AlignCtrl p{セパレータ左の空白文字サイズ}
:AlignCtrl P{セパレータ右の空白文字サイズ}
" セパレータ左に5文字のスペースを入れる。
:AlignCtrl p5

" セパレータ右に3文字のスペースを入れる。
:AlignCtrl P3

次のような「=」区切りのコードがあるとして、

a=b=c=d=e=f=g=h=1

セパレータ左に0文字のスペース、セパレータ右に2文字のスペースを入れるには、
「:AlignCtrl」コマンドで「p0P2」と指定します。

:AlignCtrl p0P2
:Align =

↓ このように整形されました。

a=  b=  c=  d=  e=  f=  g=  h=  1

セパレータの位置ごとに挿入する空白文字のサイズを変えたい場合は、 次の例のようにまとめて指定します。
セパレータの数が指定した数より多い場合は、指定した条件がループします。

" 第1セパレータの左のスペースのサイズ 1
" 第2セパレータの左のスペースのサイズ 0
" 第3セパレータの左のスペースのサイズ 2
" セパレータの右のスペースのサイズ 0
:AlignCtrl p102P0
a=b=c=d=e=f=g=h=1

↓ 条件指定後、「:Align =」で整形

a =b=c  =d =e=f  =g =h=1

セパレータを順序固定で指定するか、ORで指定するか。

「:Align」の整形処理では文章を分割するセパレータを複数指定できますが、 そのセパレータが複数、コマンドで指定された時に、 順序固定でセパレータを使用するか、OR条件で使用するか、 という制御を行うのが「C」と「=」です。 「=」がOR条件、「C」が順序指定となります。
デフォルトでは、OR条件となっています。

" OR条件でセパレータ指定
:AlignCtrl =
" 順序固定でセパレータ指定
:AlignCtrl C
" A or B or C or D or Eのセパレータで分割する。
:AlignCtrl = A B C D E

" 最初にAのセパレータで文章を分割。
" 次にBのセパレータで文章を分割
" 次にCのセパレータで文章を分割
" 以後、繰り返し。フィールドの数が多い場合はループ
:AlignCtrl C A B C D E

元のテキストがこのようなテキストであった場合に、

a,b+c-d:e
x,y,z+2,p
w,s-t,0:u

「:AlignCtrl」で「=」を指定すると、どれかのセパレータにマッチすると、
その位置でフィールドの分割が行われる。

:AlignCtrl =
:Align , + :
a , b   + c-d : e
x , y   , z   + 2 , p
w , s-t , 0   : u

しかし、「:AlignCtrl」で「C」を指定すると、左から順番にセパレータとのマッチングが行われ、
マッチしたその位置でフィールドの分割が行われる。

:AlignCtrl C
:Align , + :
a , b       + c-d : e
x , y,z     + 2,p
w , s-t,0:u

特定の行を整形対象外にする。特定の行を整形対象の行にする。

整形範囲に入っている、ある特定の行を Align による整形処理の対象外としたい時、 あるいは、整形処理の対象の行としたい時は、 「:AlignCtrl」コマンドに「g」「v」と特定行を特定するパターン文字列を渡します。

" パターンにマッチする行を整形処理の対象としない
:AlignCtrl v {特定行にマッチするパターン}
" パターンにマッチする行だけを整形処理の対象とする
:AlignCtrl g {特定行にマッチするパターン}

Note

「:AlignCtrl」コマンドの2番目のパラメータ以降が セパレータの指定でないことに気をつけてください。
この機能は「:AlignCtrl」コマンドの使い方が、少し違うのです。


もとの整形前テキストが次のコードであった場合に、

one= 2;
/* skip = this */
three= 4;
/* seven = 7 */
five= 6;

パターンにマッチする行を整形処理の対象外とする。

:AlignCtrl v ^\s*/\*
:Align =
one   = 2;
/* skip = this */
three = 4;
/* seven = 7 */
five  = 6;

パターンにマッチする行だけ、整形処理の対象とする。

:AlignCtrl g ^\s*/\*
:Align =
one= 2;
/* skip  = this */
three= 4;
/* seven = 7 */
five= 6;

「:AlignCtrl v」「:AlignCtrl g」で一度セットされた 整形処理対象、整形処理対象外のパターン指定をリセットするには、 次のコマンドを実行します。

" セットされたパターンをリセット
:AlignCtrl v
:AlignCtrl g

行頭の余白の扱い。維持する、削除する、先頭に合わせる。

「w」「W」「I」は、 整形処理の対象とする行の頭に空白文字がいくつかあり、先頭位置が揃っていない場合に、 その空白文字をどう扱うか、を制御します。

" 空白文字を削除する。
:AlignCtrl w
" 空白文字を維持する。
:AlignCtrl W
" 一番上の行の先頭位置に合わせる。
:AlignCtrl I

先頭が空白文字で始まっている、次のサンプルコードに対し、

    a := baaa
  caaaa := deeee
        ee := f

「w」の条件を指定すると、行頭までの空白文字は全て削除され、
その後、整形が行われます。

:AlignCtrl w
:Align :=
a     := baaa
caaaa := deeee
ee    := f

「W」の条件を指定すると、行頭までの空白文字は残したままで整形処理が行われます。
場合によっては、整形しても先頭位置がばらばらのままになります。

:AlignCtrl W
:Align :=
    a      := baaa
  caaaa    := deeee
        ee := f

「I」の条件を指定すると、一番上の行の先頭位置に、 他の行の先頭位置が揃えられます。

:AlignCtrl I
:Align :=
    a     := baaa
    caaaa := deeee
    ee    := f
ドキュメントアクション
コメント
blog comments powered by Disqus