[Emacs] ブレース間で改行したときに空気を読んでくれるようにした

コーディング時にブレース間で改行したときの挙動が気に入らなかったので改善した。

状況

| をカーソルだとして、下記のようなコード片があるとする:

func hoge() {|}  // | はカーソル

問題は、ここで改行したときの挙動。 快適にコーディングするためには、以下のようになってほしい:

func hoge() {
        |  // | はカーソル
}

しかし実際には、下の状態になるのが不満だった:

func hoge() {
|}  // | はカーソル

ふだん evil-mode でコーディングしているので、この状況から望む状態にするために毎回 ctrl-[ shitft-o する必要があった。 いいかげん嫌になったので、これを改善した。

実装

(defun my-break-between-braces ()
  (interactive)
  (if
      (and (eq ?} (char-after (point)))
           (eq ?{(char-before (point))))
      (progn
        (open-line 1)
        (newline)
        (indent-according-to-mode))
    (newline-and-indent)))

メモ

実装は素朴で、カーソルが {} の間にあれば、行オープンと改行に続けて (indent-according-to-mode) を呼び出すというもの1。 カーソルがブレースの間になければ、ふつうに改行することにした。

これが C-m で呼ばれるようにして完了。

(global-set-key (kbd "C-m") 'my-break-between-braces)

  1. 当初は (c-context-open-file)(c-context-line-break) を使う実装だったが、JavaScript を書く時に閉じブレースが不必要にインデントされてしまったためこの実装にした。本来であれば根本原因を究明すべきだが たかがインデントなので 対処療法的な解決に留めた ↩︎


comments powered by Disqus