目次 / 第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 にも詳しい説明が書いてあります。

  1. M-x info [Enter]
  2. 以下の行で Enter
    • * Emacs: (emacs). The extensible self-documenting text editor.
  3. g を押したあと、Specifying File Variables [Enter]

関連する関数

タブに関連する関数をご紹介します。それぞれ M-x で呼び出せます。

  • tabify
    • リージョン内の連続する空白をタブに変換します。変数 tab-width がこの動きを制御します。
  • untabify
    • リージョン内のタブを複数のスペースに変換します。変数 tab-width がこの動きを制御します。

第8回終わり。

目次 / 第1回 第2回 第3回 第4回 第5回 第6回 第7回 第8回 第9回