タグ別アーカイブ: 整形

選択範囲のインデントを1レベル下げる

要は選択範囲の先頭にTab1つぶん挿入したい。

標準機能そのままでやるなら

  • indent-rigidly を使う
    C-u 4 C-x [TAB] ;; “4”の部分は各自の設定に応じて変更
  • open-rectangle を使う
    空白(タブ)を挿入したい部分を選択した状態で C-x r o
  • string-rectangle を使う
    C-x r t → C-q TAB → ENTER

どれもストローク多いなー。。。
2つ目が一番スマートだけど選択範囲の設定がちょっと面倒。

というわけで1つ目を関数化。

;; "4"の部分は各自の設定に応じて変更
(defun my-indent-rigidly()
  (interactive)
  (indent-rigidly (region-beginning) (region-end) 4))
(global-set-key [(control tab)] 'my-indent-rigidly)

これで連打もできるよ!

 

今更ながら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宣言の時だけ色がついて普段はつかないの気持ち悪いなあと思ってたのですっきり。

 

余計な空白除去いろいろ

行末の不要な空白を取り除く で delete-trailing-whitespace について書きましたが、他にもいろいろある模様。

  • delete-trailing-whitespace:行末の空白を削除する
  • just-one-space:空白を1つだけ残して残りを削除する
  • delete-horizontal-space:周りの空白を削除する
  • fixup-whitespace:文脈に合わせて空白を削除する

うーん。便利そうだけど使い分け方がいまいちよくわからない。。。

 

alignの設定:複数回適用とか、空白処理とか

こんなにいろいろあるのか。知らなかった。
align設定用例集 – handlename’s blog

特に (repeat t) はよく使いそう。

(add-to-list 'align-rules-list
'(camma-assignment
(regexp . ",\\( *\\)")
(repeat . t)))

my @primes = (
1,2,3,5,7,
11,13,17,19,23,
29,31,37,41,43,
);



my @primes = (
1, 2, 3, 5, 7,
11, 13, 17, 19, 23,
29, 31, 37, 41, 43,
);

 ***

ちなみに私は、というかうちの会社のコーディングルールでは、
インデントはタブで、その他の文字揃え(アラインメント)はスペースで、という感じなので、
(indent-tabs-mode t) にしてると align 時にタブ文字が混ざってイヤンな感じなのですが、
↓これ使って一気に解決しました。
EmacsWiki: Smart Tabs
便利なんだけどあんまり有名じゃないのかなー。そもそもこういうルールでコーディングしてる人珍しいの…?