Next: , Previous: Postscript Variables, Up: Top


27.19 テキストのソート

Emacsには、バッファ中のテキストをソートするコマンドがいくつかあります。 すべてはリージョン(ポイントとマークのあいだのテキスト)に働きます。 これらのコマンドは、リージョン中のテキストを 多数のソートレコードにわけ、 各レコードについてソートキーを識別し、 一連のレコードをソートキーによって定まる順序に並べ替えます。 レコードはキーのアルファベット(辞書)順にも、 また数値に基づく数値順にも並べられます。 アルファベット順の場合は、ASCII文字の順序に基づいて すべての大文字「A」〜「Z」は小文字「a」よりまえにきます。

各種のソートコマンドの違いは、テキストをソートレコードに分ける方法と、 各レコードのどの部分をソートキーに使うかです。 ほとんどのコマンドは各行をソートレコードとして扱いますが、 段落やページをソートレコードとして扱うコマンドもあります。 ほとんどのソートコマンドは各ソートレコード全体を それ自身のソートキーとして扱いますが、 ソートレコードの一部分だけをソートキーとして扱うコマンドもあります。

M-x sort-lines
リージョンを行の並びとみなし、行全体のテキストを比較して(昇順に)ソートする。 数引数を指定すると降順にソートする。
M-x sort-paragraphs
リージョンを段落の並びとみなし、(先頭の空行を除く) 段落全体のテキストを比較して(昇順に)ソートする。 数引数を指定すると降順にソートする。
M-x sort-pages
リージョンをページの並びとみなし、(先頭の空行を除く) ページ全体のテキストを比較して(昇順に)ソートする。 数引数を指定すると降順にソートする。
M-x sort-fields
リージョンを行の並びとみなし、 行の1つの欄を比較して(昇順に)ソートする。 欄は白文字で区切られる。 つまり、行の始めにある白文字でない文字の並びが第1欄、 そのつぎの空白でない文字の並びが第2欄、というようになる。

どの欄をキーとしてソートするかは、 1を指定すれば第1欄、というように数引数で指定する。 負の値を指定したときは左からでなく右から欄を数える。 つまり、-1は最後の欄でソートする。 複数の行において欄の値が同一の場合、 バッファ上のもとの順序が保存される。

M-x sort-numeric-fields
M-x sort-fieldsと同様だが、 指定した欄を行ごとに数値に変換し、その数値同士を比較する。 ‘10’はアルファベット順では‘2’よりまえにくるが、 数値として見れば‘2’よりあとにくる。
M-x sort-columns
M-x sort-fieldsと同様だが、行の比較に使うテキストは 固定文字位置からとる。 以下の説明を参照のこと。
M-x reverse-region
リージョン内の行の順番を逆にする。 欄や文字位置でソートするコマンドは降順にはソートできないので、 昇順にソートしたあと降順に並べ替えるのに役立つ。

たとえば、バッファにつぎのような内容が入っていたとします。

     On systems where clash detection (locking of files being edited) is
     implemented, Emacs also checks the first time you modify a buffer
     whether the file has changed on disk since it was last visited or
     saved.  If it has, you are asked to confirm that you want to change
     the buffer.

バッファ全体にM-x sort-linesを適用すると、 つぎのようになります。

     On systems where clash detection (locking of files being edited) is
     implemented, Emacs also checks the first time you modify a buffer
     saved.  If it has, you are asked to confirm that you want to change
     the buffer.
     whether the file has changed on disk since it was last visited or

ここで、‘O’は大文字なのですべての小文字よりまえにきます。 上記のかわりにC-u 2 M-x sort-fileldsを使ったとすると、 結果はつぎのようになります。

     implemented, Emacs also checks the first time you modify a buffer
     saved.  If it has, you are asked to confirm that you want to change
     the buffer.
     On systems where clash detection (locking of files being edited) is
     whether the file has changed on disk since it was last visited or

この例ではソートキーは、‘Emacs’、‘If’、‘buffer’、 ‘systems’、‘the’だったわけです。

M-x sort-columnsには少々説明が必要です。 文字位置の範囲を指定するには、ポイントを文字位置の一方に、 マークを他方の文字位置に置きます。 このため、ポイントやマークをソートしたい最初の行の先頭に 置くことができませんから、このコマンドでは変わった 「リージョン」の定義を用います。 ポイントがある行全体はリージョンに含まれ、 同様に、マークがある行全体もリージョンに含まれ、 この2つの行のあいだにある行はすべてリージョンに含まれるとみなすのです。

たとえば、ある表を10文字目から15文字目までの情報をもとにソートする場合、 表の最初の行の10文字目にマークを置き、 表の最後の行の15文字目にポイントを置き、 そしてsort-columnを実行します。 あるいは、マークを最初の行の15文字目、 ポイントを最後の行の10文字目に置いても同じことです。

これは、ポイントとマークで指定された矩形領域をソートするものと考えられます。 ただし、矩形領域の右側や左側にある各行のテキストも一緒に移動します。

sort-fold-casenil以外の場合、 ソートコマンドのほとんどは比較に際して大文字小文字を区別しません。