Rindrics Mumbles

[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
        (c-context-open-line)
        (c-context-line-break))
    (newline-and-indent)))

メモ

実装は素朴で、カーソルが {} の間にあれば、改行系の組み込み関数 (c-centext-open-line)(c-centext-line-break) を呼び出すというもの。 カーソルがブレースの間になければ、ふつうに改行することにした。

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

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