目次 / 第1回 第2回 第3回 第4回 第5回 第6回 第7回 第8回 第9回
3つの変数
Emacs のタブ幅には、3つの変数が関係しています。
tab-width
タブコードを半角スペースいくつ分で表示するかを制御する変数です。各バッファ毎に設定できます。デフォルトは 8 です。
default-tab-width
tab-width のデフォルト値です。全てのバッファに影響する変数です。デフォルトは 8 です。
tab-stop-list
TAB キーを押した時に、カーソルが移動するカラムの位置です。デフォルトは (8 16 24 32 40 48 56 64 72 80 88 96 104 112 120) です。
例えばタブ幅を 4 に変更したい場合は以下のようなコードを ~/.emacs に記述します。
(setq-default tab-width 4)
(setq default-tab-width 4)
(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60
64 68 72 76 80 84 88 92 96 100 104 108 112 116 120))
関数化してみよう
tab-stop-list の設定が少し煩雑ですよね。以前は手計算で tab-stop-list の中身を作っていたのですが、見事に計算間違いした経験があります。そんな自分が嫌になったので、関数化しました。
「下記設定」と「前述の設定をタブ 8 に変えたもの」は同じ意味です。
(defun set-aurora-tab-width (num &optional local redraw)
"タブ幅をセットします。タブ5とかタブ20も設定できたりします。
localが non-nilの場合は、カレントバッファでのみ有効になります。
redrawが non-nilの場合は、Windowを再描画します。"
(interactive "nTab Width: ")
(when local
(make-local-variable 'tab-width)
(make-local-variable 'tab-stop-list))
(setq tab-width num)
(setq tab-stop-list ())
(while (<= num 256)
(setq tab-stop-list `(,@tab-stop-list ,num))
(setq num (+ num tab-width)))
(when redraw (redraw-display)) tab-width)
(set-aurora-tab-width (setq default-tab-width (setq-default tab-width 8)))
動的なタブ幅の切り替え
開いたテキストが自分のタブ幅と異なるため、インデントがずれた経験はありませんか?
キー操作で動的に切り替えられるように、私は以下の設定をしています。結構おすすめです。(ctl-q-map については、第5回 を参照してください。)
(define-key ctl-q-map (kbd "2") (lambda () (interactive) (set-aurora-tab-width 2 t t)))
(define-key ctl-q-map (kbd "4") (lambda () (interactive) (set-aurora-tab-width 4 t t)))
(define-key ctl-q-map (kbd "8") (lambda () (interactive) (set-aurora-tab-width 8 t t)))
例えば Ctrl-q 4
すると、カレントバッファのタブ幅が 4 になります。他のバッファには影響を与えません。
ファイル単位でのタブ幅の切り替え
ファイルの先頭に以下を書いておくと、Emacs はそのファイルをタブ 4 で開きます。
-*- tab-width: 4 -*-
ファイルの最後に書くことも出来ます。
Local Variables:
tab-width: 4
End:
tab-width に特化された実装になっているわけではありません。このような記述をすると、ファイル毎に変数値を設定できるのです。
英語ですが、Info にも詳しい説明が書いてあります。
- M-x info [Enter]
- 以下の行で Enter
* Emacs: (emacs). The extensible self-documenting text editor.
- g を押したあと、Specifying File Variables [Enter]
関連する関数
タブに関連する関数をご紹介します。それぞれ M-x で呼び出せます。
- tabify
- リージョン内の連続する空白をタブに変換します。変数 tab-width がこの動きを制御します。
- untabify
- リージョン内のタブを複数のスペースに変換します。変数 tab-width がこの動きを制御します。
第8回終わり。