タブコード使用の自動判別

AKIYAMA Kouhei

2002年09月01日

概要

ソースコードのインデントを記述する際にタブコード(09h)を使用するかスペース(20h)を使用するかを自動的に判別するコードを紹介する。

コード

以下のコードはバッファ内で行頭タブコードが使用されているかどうかを調べる関数(my-buffer-used-tab-code-p)を定義している。

;; タブコードを使っているか判別する
(defun my-buffer-used-tab-code-p ()
  (save-excursion
    (re-search-forward "^\t" nil t)))

この関数を使用して、例えば以下のコードのようにモードが始まる際に訪問先のファイルでタブコードが使用されてるかを判断してindent-tabs-modeを適切に設定してやればよい。

;; hook 用の関数の定義
(defun my-c-mode-common-hook ()

  ;; タブを使うか否かを判別して決める。
  (setq indent-tabs-mode (my-buffer-used-tab-code-p))

)

;; モードに入るときに呼び出す hook の設定
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)

課題

バッファ内に正規表現"^\t"にマッチする部分があるかどうかで判断しているため、偶然一つだけ行頭にタブコードが入っている行があった場合にスペースを使って欲しいのにタブが使われてしまうことがあるかもしれない。"^\t"と"^ +"の数を比較してやるのがもう少し賢いやり方かもしれないが、もともとおかしくなっていることを考えるとあまり意味があるとは思えない。


Last modified: Sun Sep 01 16:14:44 2002