指定した幅に合うように行を分ける機能です。例えば、メールなどのように、半角70文字ごとに改行を入れるようにするものです。入力中に自動的に改行を入れるAuto Fillモードと、すでに入力したテキストをその幅に合わせて整形するfillコマンドがあります。
→fill関係のコマンド
0123456789abcdefghijklmopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZfor example... 半角20文字で整形
0123456789abcdefghij klmopqrstuvwxyzABCDE FGHIJKLMNOPQRSTUVWXY Z
これはサブモードで、text-modeやhtml+-mode、lisp-modeなどから呼び出されます。
M-x auto-fill-modeで、Auto Fillモードにしたり、これを解除したりします(トグル)。Auto Fillモード中は、モード行のモード表示部分に続けて「:Fill」と表示されます。
この状態で半角文字を入力した場合、SPCを押すと指定した桁数で行が分割されます。ただ、その次のSPCまでの桁数によっては、指定した桁数より短くても、半角スペースの部分で改行されることがあります。
0123456789012_ 01234567890123456789 0123456_ 01234567890123_012_ 0123456_01_ 0123456789_
分かりやすくするためにスペースをアンダーバーに変えてます。
2行目では「012345678901234567890123456 」までを1行で入力していますが、その後に「01234567890123」を入力してSPCを押した時点で、「01234567890123456789」と「0123456 」に分割されています。
全角文字の場合は、SPCを押さなくても、確定した時点で自動的に行が分割されます。
ただし、どちらの場合も、すでに入力された部分を再詰め込みはしません。つまり、すでにある段落に文字を挿入しても、再度整形はしてくれません。これをするには、次のfillコマンドで明示的に整形する必要があります。
fill-paragraph
M-q
現在カーソルがある段落(1段落の範囲については、段落区切り文字参照)を整形します。カーソルが改行だけの行にある場合は、その次の段落を整形します。
実行されると、段落内のすべての改行が取り除かれ、必要な位置にあらめて改行が入れられます(なぜか余計な半角スペースまで入ってるんですが……)。
01234567890123456789_01234567890123456789 0123456789 01234567890123for example... フィルカラム15、整形後
012345678901234 56789_ 012345678901234 56789_ 0123456789_ 01234567890123
M-x fill-region
マーク位置からカーソル位置までを整形します。整形の対象以外はfill-paragraphと同じです。
M-x fill-region-as-paragraph
マーク位置からカーソル位置までを1段落として整形します。途中にある改行だけの行は削除されます。
M-x center-line
カーソル行を、文字列が現在の詰め込み幅の中央に位置するようにインデントします。詰め込み幅より短い行でしか効果がありません。
あいうfor ezample... フィルカラム15
____あいう
段落を区切る文字は、「~xyzzy/lisp/paragrph.l」の中で指定されています。
(defvar-local paragraph-start "^[ \t\f\n ]") (defvar-local paragraph-separate "^[ \t\f ]*$")
paragraph-start
は段落を開始・区切る行を表します。デフォルトでは「行頭に、『半角スペース』『タブ』『改ページ記号』『改行』『全角スペース』のどれか」と設定されています。その行から段落が始まり、次にparagraph-start
かparagraph-separate
が来るまでが1段落になります。
paragraph-separate
は、「段落の区切りで、どの段落の一部にもならない行」を表します。デフォルトでは「行頭に、『半角スペース』『タブ』『改ページ記号』のどれかがあり、そこで行が終わっているもの」と設定されています。その行はどの段落の一部にもならず、ただ段落区切りとしての役割を果たすようになります。
これ、設定で変えられそうな感じなんですが、.xyzzyに書いても働いてくれませんでした。defvar
を使ってもダメだったし……まあ変える必要はあまりなさそうですが。
set-fill-column
C-x f
詰め込みの幅を指定するには、折り返したい位置(カラム数)まで移動してこのコマンドを実行するか、M-数字 C-x fあるいはESC 数字 C-x fを実行します。この指定は実行したバッファでだけ有効になります。
実行すると、ステータスバーに「フィルカラムは○○です」と表示されます。
デフォルトの桁数は72ですが、これを設定ファイルで変更することもできます。
(setq-default fill-column [桁数])
set-fill-prefix
C-x .
整形の際に行頭に挿入する文字を指定するコマンドです。実行すると、行頭からカーソル前までの文字列をfill prefix
として設定します。その後に整形を行うと、各行の頭にprefixを挿入しつつ整形されることになります。
実行すると、ステータスバーに「fill prefixは○○です」と表示されます。
#_あいうえおかきくけこさしすせそ「_」の次にカーソルをおいて、C-x . for example... フィルカラム10でM-q
#_あいうえ #_おかきく #_けこさし #_すせそ
fill prefix
を解除するには、カーソルを行頭に置いてC-x .を実行します。
(add-hook '*text-mode-hook* 'my-text-mode-hook) (defun my-text-mode-hook () (auto-fill-mode 1) (toggle-ime t))
喜多さんのサイトにある「flex-fill.l」を導入すると、行頭を見て自動的に接頭辞を指定してくれるようになります。
例えば、行頭に半角スペースが3つある(=字下げしようとしている)場合、自動的にfill prefix
を「___」と指定し、それ以降も字下げしてくれます。行頭に「1)」とある場合は、閉じ括弧までの文字数分の半角スペースがfill prefix
に指定され、以降も字下げされます。
喜多さんのサイトから「flex-fill.l」をダウンロードし、「~xyzzy/site-lisp/」に置いた上で、これをM-x byte-compile-fileでバイトコンパイルします。あとは、これを設定ファイルで読み込むように設定すればOKです。
(load-library "flex-fill")
(defvar *flexible-fill-prefix-regexp* "[正規表現]")
(defvar *flexible-fill-prefix-regexp* "^#? +")
*flexible-fill-prefix-regexp*
に代入された文字列にマッチする文字列があると、その文字列がfill prefix
に指定されます。
初期設定では、「行頭に、『#』が0or1つ、『_』が1回以上繰り返す」という文字列があった場合、その文字列がfill prefix
として指定され、以降の整形で行頭に挿入されます(『_』は分かりやすいようにアンダーバーにしてますが、半角スペースです)。例えば、「#_」「#__」「_」「__」などです。
fill-prefix
の指定(defvar *flexible-fill-bullet-prefix-regexp* "[正規表現]")
(defvar *flexible-fill-bullet-prefix-char* #\[キー])
(defvar *flexible-fill-bullet-prefix-regexp* "^\\(・\\|[0-9]+)\\)")
(defvar *flexible-fill-bullet-prefix-char* #\SPC)
*flexible-fill-bullet-prefix-regexp*
にマッチする文字列があると、その文字数分の*flexible-fill-bullet-prefix-char*
の文字列がfill prefix
に指定され、次の行からはこれが挿入されるようになります。
初期設定では、「行頭に、『・』か、『半角数字の文字列に半角閉じ括弧が続いている文字列』」がある場合、半角スペースがその分だけfill prefix
に指定されます。例えばこれを「^\\(・\\|(?[0-9]+)\\)」とすると、「01)」という形だけでなく、「(01)」という形の場合もflex-fillが働くようになります。
(01)こんな風な番号付きリストも 字下げしてくれます。
(defvar *flexible-fill-mode-list* '([モード1] [モード2] …))
(defvar *flexible-fill-mode-list* '(text-mode lisp-mode))
flex-fillは*flexible-fill-mode-list*
で指定したモードでしか働きません。初期状態ではtext-modeしか指定されていませんが、必要ならここでモードを追加します。