xyzzy
Top Page > Tips > fill


テキスト整形(折り返し、詰め込み)機能

 指定した幅に合うように行を分ける機能です。例えば、メールなどのように、半角70文字ごとに改行を入れるようにするものです。入力中に自動的に改行を入れるAuto Fillモードと、すでに入力したテキストをその幅に合わせて整形するfillコマンドがあります。
fill関係のコマンド

for example... 整形前
0123456789abcdefghijklmopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
for example... 半角20文字で整形
0123456789abcdefghij
klmopqrstuvwxyzABCDE
FGHIJKLMNOPQRSTUVWXY
Z

auto-fill-mode

 これはサブモードで、text-modeやhtml+-mode、lisp-modeなどから呼び出されます。
 M-x auto-fill-modeで、Auto Fillモードにしたり、これを解除したりします(トグル)。Auto Fillモード中は、モード行のモード表示部分に続けて「:Fill」と表示されます。

 この状態で半角文字を入力した場合、SPCを押すと指定した桁数で行が分割されます。ただ、その次のSPCまでの桁数によっては、指定した桁数より短くても、半角スペースの部分で改行されることがあります。

for example... フィルカラム20
0123456789012_
01234567890123456789
0123456_
01234567890123_012_
0123456_01_
0123456789_

分かりやすくするためにスペースをアンダーバーに変えてます。

 2行目では「012345678901234567890123456 」までを1行で入力していますが、その後に「01234567890123」を入力してSPCを押した時点で、「01234567890123456789」と「0123456 」に分割されています。

 全角文字の場合は、SPCを押さなくても、確定した時点で自動的に行が分割されます。

 ただし、どちらの場合も、すでに入力された部分を再詰め込みはしません。つまり、すでにある段落に文字を挿入しても、再度整形はしてくれません。これをするには、次のfillコマンドで明示的に整形する必要があります。

fillコマンド

現在の段落を詰め込み

fill-paragraph M-q
 現在カーソルがある段落(1段落の範囲については、段落区切り文字参照)を整形します。カーソルが改行だけの行にある場合は、その次の段落を整形します。
 実行されると、段落内のすべての改行が取り除かれ、必要な位置にあらめて改行が入れられます(なぜか余計な半角スペースまで入ってるんですが……)。

for example... 整形前
01234567890123456789_01234567890123456789
0123456789
01234567890123
for example... フィルカラム15、整形後
012345678901234
56789_
012345678901234
56789_
0123456789_
01234567890123

リージョンを詰め込み

M-x fill-region
 マーク位置からカーソル位置までを整形します。整形の対象以外はfill-paragraphと同じです。

リージョンを1段落として詰め込み

M-x fill-region-as-paragraph
 マーク位置からカーソル位置までを1段落として整形します。途中にある改行だけの行は削除されます。

センタリング

M-x center-line
 カーソル行を、文字列が現在の詰め込み幅の中央に位置するようにインデントします。詰め込み幅より短い行でしか効果がありません。

for example... 整形前
あいう
for ezample... フィルカラム15
____あいう

段落区切り文字

 段落を区切る文字は、「~xyzzy/lisp/paragrph.l」の中で指定されています。

(defvar-local paragraph-start "^[ \t\f\n ]")
(defvar-local paragraph-separate "^[ \t\f ]*$")

 paragraph-startは段落を開始・区切る行を表します。デフォルトでは「行頭に、『半角スペース』『タブ』『改ページ記号』『改行』『全角スペース』のどれか」と設定されています。その行から段落が始まり、次にparagraph-startparagraph-separateが来るまでが1段落になります。
 paragraph-separateは、「段落の区切りで、どの段落の一部にもならない行」を表します。デフォルトでは「行頭に、『半角スペース』『タブ』『改ページ記号』のどれかがあり、そこで行が終わっているもの」と設定されています。その行はどの段落の一部にもならず、ただ段落区切りとしての役割を果たすようになります。
 これ、設定で変えられそうな感じなんですが、.xyzzyに書いても働いてくれませんでした。defvarを使ってもダメだったし……まあ変える必要はあまりなさそうですが。

詰め込みの設定

桁数の指定

set-fill-column C-x f
 詰め込みの幅を指定するには、折り返したい位置(カラム数)まで移動してこのコマンドを実行するか、M-数字 C-x fあるいはESC 数字 C-x fを実行します。この指定は実行したバッファでだけ有効になります。
 実行すると、ステータスバーに「フィルカラムは○○です」と表示されます。

 デフォルトの桁数は72ですが、これを設定ファイルで変更することもできます。

site-init.l or .xyzzy (追加)
(setq-default fill-column [桁数])

接頭辞の指定

set-fill-prefix C-x .
 整形の際に行頭に挿入する文字を指定するコマンドです。実行すると、行頭からカーソル前までの文字列をfill prefixとして設定します。その後に整形を行うと、各行の頭にprefixを挿入しつつ整形されることになります。
 実行すると、ステータスバーに「fill prefixは○○です」と表示されます。

for example... fill prefix指定
#_あいうえおかきくけこさしすせそ
 「_」の次にカーソルをおいて、C-x . for example... フィルカラム10でM-q
#_あいうえ
#_おかきく
#_けこさし
#_すせそ

 fill prefixを解除するには、カーソルを行頭に置いてC-x .を実行します。

ファイル読み込み時に自動でautofill
 →MailingList 03631,03632

siteinit.l(追加)
(add-hook '*text-mode-hook* 'my-text-mode-hook)
(defun my-text-mode-hook ()
  (auto-fill-mode 1)
  (toggle-ime t))

flexible fill

 喜多さんのサイトにある「flex-fill.l」を導入すると、行頭を見て自動的に接頭辞を指定してくれるようになります。
 例えば、行頭に半角スペースが3つある(=字下げしようとしている)場合、自動的にfill prefixを「___」と指定し、それ以降も字下げしてくれます。行頭に「1)」とある場合は、閉じ括弧までの文字数分の半角スペースがfill prefixに指定され、以降も字下げされます。

install

 喜多さんのサイトから「flex-fill.l」をダウンロードし、「~xyzzy/site-lisp/」に置いた上で、これをM-x byte-compile-fileでバイトコンパイルします。あとは、これを設定ファイルで読み込むように設定すればOKです。

siteinit.l or .xyzzy (追加)
(load-library "flex-fill")

各種設定

行頭に挿入する文字列の指定

flex-fill.l (12行目)
(defvar *flexible-fill-prefix-regexp* "[正規表現]")
for example... (初期設定)
(defvar *flexible-fill-prefix-regexp* "^#? +")
commentary

 *flexible-fill-prefix-regexp*に代入された文字列にマッチする文字列があると、その文字列がfill prefixに指定されます。
 初期設定では、「行頭に、『#』が0or1つ、『_』が1回以上繰り返す」という文字列があった場合、その文字列がfill prefixとして指定され、以降の整形で行頭に挿入されます(『_』は分かりやすいようにアンダーバーにしてますが、半角スペースです)。例えば、「#_」「#__」「_」「__」などです。

flex-fillが働く文字列と、その際のfill-prefixの指定

flex-fill.l (15行目、18行目)
(defvar *flexible-fill-bullet-prefix-regexp* "[正規表現]")
(defvar *flexible-fill-bullet-prefix-char* #\[キー])
for example... (初期設定)
(defvar *flexible-fill-bullet-prefix-regexp* "^\\(・\\|[0-9]+)\\)")
(defvar *flexible-fill-bullet-prefix-char* #\SPC)
commentary

 *flexible-fill-bullet-prefix-regexp*にマッチする文字列があると、その文字数分の*flexible-fill-bullet-prefix-char*の文字列がfill prefixに指定され、次の行からはこれが挿入されるようになります。
 初期設定では、「行頭に、『・』か、『半角数字の文字列に半角閉じ括弧が続いている文字列』」がある場合、半角スペースがその分だけfill prefixに指定されます。例えばこれを「^\\(・\\|(?[0-9]+)\\)」とすると、「01)」という形だけでなく、「(01)」という形の場合もflex-fillが働くようになります。

for example...
(01)こんな風な番号付きリストも
    字下げしてくれます。

flex-fillが働くモードの指定

flex-fill.l (21行目)
(defvar *flexible-fill-mode-list* '([モード1] [モード2] …))
for example...
(defvar *flexible-fill-mode-list* '(text-mode lisp-mode))

 flex-fillは*flexible-fill-mode-list*で指定したモードでしか働きません。初期状態ではtext-modeしか指定されていませんが、必要ならここでモードを追加します。

▲トップページに戻る▲

概略

解説

自動詰め込みモード

段落の詰め込み

リージョンの詰め込み

リージョンを1段落として詰め込み

センタリング

桁数の設定

接頭辞の設定

段落区切り文字

Flex fill

インストール

設定