タグ別アーカイブ: perl

cperl-init-faces (ignored): (void-function find-face)

cperl-mode をアップデート(Version: 20140309.122)したらシンタックスハイライトがなんだかおかしくなった。
whitespace-modeも効いていないようなので M-x whitespace-mode すると表題のエラー。

エラー内容でググると古い情報が引っ掛かった
http://www.ysnb.net/meadow/meadow-users-jp/2001/msg00716.html
ためしにcperl-mode.el をひらいてバイトコンパイルしてみるとあっさりと解決。なんぞこれ。

 

今更ながらcperl-modeのインデント設定についてまとめてみる

cperl-modeのインデントまわりの設定が結構適当だったので、
ものすごく今更ですがまじめに調べてみました。

まずは基本設定。
インデントはタブ(スペース4つ分)で行います。

(setq-default tab-width 4
indent-tabs-mode t)
(setq cperl-indent-level 4)

indent-region で余計な整形をさせない

まずはこちらのコード

if($a){
$a = 1;
}
else{
$b = 1;
}

これに対してindent-regionをかけると

if ($a) {
$a = 1;
} else {
$b = 1;
}

だれもelse前の改行消してくれとか頼んでない。
中括弧の前後に余計な空白入れてくれとも頼んでない。

else前の改行については、

(setq cperl-merge-trailing-else nil)

で改行削除しなくなります。

また、

(setq cperl-indent-region-fix-constructs nil)

としておくとそもそも余計な整形をせずにインデントだけしてくれます。デフォルトの空白設定が気にくわない人はこれで。

引数の無名ハッシュや無名関数のインデント

【理想】

hoge($a, $b, {
a => 1,
b => 2,
});

hoge($a, $b, sub{
a = 1;
b = 2;
});

【現実】

hoge($a, $b, {
a => 1,
b => 2,
});

hoge($a, $b, sub{
a = 1;
b = 2;
});

前者については

(setq cperl-indent-parens-as-block t)

後者については

(setq cperl-indent-subs-specially nil)

で対応可能。
ただし、後者はcperl-modeのバージョンによっては使えないらしい。melpaから入れた最新のcperl-modeならOK。
(参考:http://d.hatena.ne.jp/syohex/20120818/1345302707)

なお、前者で最後の閉括弧の前に改行をはさむと

hogeaaa($a, $b, {
a => 1,
b => 2,
}
);

だいぶ気持ち悪い感じに。

(setq cperl-close-paren-offset -4)

とすると、

hogeaaa($a, $b, {
a => 1,
b => 2,
}
);

……ちょっとはマシだけどやっぱり微妙……。

途中改行時のインデントとか

【before】

$str = "hogehoge"
. "hogehoge"
. "hogehoge";
(setq cperl-continued-statement-offset 4)

【after】

$str = "hogehoge"
. "hogehoge"
. "hogehoge";

でもこれはどちらかというとイコールの位置で揃えてほしいかな。

タブをbackspaceで消したい

タブを消そうとしてbackspace押すとスペース3つに化けるのがうざい。

(setq cperl-electric-backspace-untabify nil)

でタブを一気に消せる。

その他

インデント関係ないけど

(setq cperl-highlight-variables-indiscriminately t)

で変数に色をつけられるのをはじめて知った。
my宣言の時だけ色がついて普段はつかないの気持ち悪いなあと思ってたのですっきり。