Rapid Express

Rapid Express

中小企業を支援するLinuxベースのWebアプリケーション開発

Rapid Express RSS Feed
 
 
 
 

gnuなインデントをどうにかする

結局、自分の手のカスタマイズ化進み、Emacsオリジナルキーバインドで編集を続けている自分がいる。でも、キーバインドが落ち着いたらこんどはインデント……

共同開発者から指示されているコーディングスタイルは、インデントにはタブを使い、タブ幅は4で、具体的なスタイルは次のようなもので、まあ、今までの自分のコーディングスタイルとあまり変わらない(自分はタブ幅2が好きだった)。

if (condition)
{
do_stuff();
}

switch ($x)
{
case 1:
break;

case 2:
// FALL THROUGH

default:
}

ところが、タブ幅を4にしようと

(setq-default tab-width 4)

としてみても、インデントは2にしかならないのである。

どうやら、Emacsでは「タブをスペースいくつにするか」と「行頭インデントの単位をいくつにするか」は別であるらしい……ことに行き着く。

(setq-default tab-width 4)
(setq c-basic-offset 4)

これで一安心と思いきや、if文は次のように勝手に展開され、自分で調整できないのである。

if (condition)
{
do_stuff();
}

素直にタブコードを入力するのにはどうすればよいかとEmacsのマニュアルを調べると、C-q TAB と打てと言う。なんか髭面のきたない口元がにやりとゆがむ様子が目に浮かぶようである。

とある会社に勤めていたある日、電話に出た営業さんがなにやら困り果て、某古参T君に電話を渡した。外人からの電話だったらしい。
対応に出るT君。なかなか相手の言うことが理解できず、しばらくしてT君の口から出た言葉は「ふーあーゆー!?」 居合わせた一堂、口からコーヒーを吹く。普通それは「ふぁっちゅあねーむ?」だがしょ。
さらに次がびっくり。「おー! すとーるまん?」って、あの髭面の変な外人かい。
どうやら用があって来日したが東京で迷子になり、つてのあるわが社に助けを求めてるらしかった。生ストールマンを目にした唯一の経験ですた(笑)

Emacsのインデントについてググってると、2chでのコーディングスタイルについての不毛な論争に行き着き、その中でこのスタイルは「gnuスタイル」と言うことを知る。髭男の思いつきそうなことである。

探索対象が絞れたおかげで、Emacsのデフォルトが次になっていることを発見。

(setq c-default-style
'((java-mode . "java") (other . "gnu")))

このスタイルが “gnu” であることが問題。これを他のスタイルに変更すればよいのだが、具体的にどんなスタイルがあるのか? ここでまた、しばらく探索は続く……

 

M-x c-set-style
C-c .

を実行して、style? の質問に ? と入力すると、スタイルの一覧が表示される。適当なのを選んで、好みのスタイルを選べ、ということらしい。

In this buffer, type RET to select the completion near point.

Possible completions are:
bsd                                cc-mode
ellemtel                           gnu
java                               k&r
linux                              python
stroustrup                         user
whitesmith

if文のかっこが、ifと同じ桁にあるのを探したら linuxでした。

ということで、本日の.emacsは次の通りで結論。

(setq-default tab-width 4)
(setq c-default-style
'((java-mode . "java") (other . "linux")))
(setq c-basic-offset 4)

 

ついでに発見した事実がひとつ。
ブックマークに入れていたEmacsのマニュアル翻訳が古かった。c-set-styleについての記述がない版を見ていたのだった。ググった先の翻訳と目次を見比べて脱力。





Leave a Reply



Tags

Links




Meta


TMAX.MYOPENSRC.COM