👨‍👨‍👦

Emacsで括弧操作を極める:基本機能からsmartparensまで

2024/12/22に公開

はじめに

この記事は Emacs アドベントカレンダー 2024 の22日目の記事です。

Emacs では括弧に関する高速な操作を行うための便利なコマンドがあります。この記事ではそれらを紹介したいと思います。さらに高度なコマンドを追加する追加のパッケージ smartparens についても紹介します。

基本機能

このセクションでは Emacs に同梱されている機能について紹介します。筆者は Emacs 29.4 で確認しましたが、より古いバージョンでも使うことができるはずです。

show-paren-mode で括弧をハイライトする

show-paren-mode は有名なマイナーモードです。これを有効にすると、開き括弧と閉じ括弧をハイライトすることができます。例は下記の通りです。

(show-paren-mode t)
(setq show-paren-style :mixed)

スタイルは parenthesis, expression, mixed の3種類があります。

parenthesis expression

デフォルトでは parenthesis で、括弧のみに色をつけます。expression なら、括弧で囲まれた範囲全てに色をつけます。mixed は普段は parenthesis と同じですが、括弧で囲まれた範囲が長く画面から隠れているときだけ expression となります。

forward-sexp, backword-sexp で括弧を飛び越える

デフォルトで C-M-f にバインドされたコマンド forward-sexp は Emacs で次のS式にジャンプするためのコマンドです。S式とは Symbol-Expression の略で、簡単にいうと、カーソル上の文字列を Lisp で解釈して次の式にカーソルを移動させます。具体例をいくつか示します。ここで ► はカーソルの位置を表すものとします。

操作前 操作後 解説
►(messsage "hello world") (messsage "hello world")► (...) を飛び越えます
(►messsage "hello world") (messsage► "hello world") message を飛び越えます
(messsage ►"hello world") (messsage "hello world"►) "..." を飛び越えます

このように forward-sexp は括弧を考慮したカーソル移動に役立ちます。smatparens では対応する括弧を探す専用のコマンドを持っていますが forward-sexp だけでも十分役に立つでしょう。なお、これと逆の操作を行う backword-sexp も用意されており、こちらは C-M-b にバインドされています。

up-list で上の括弧へジャンプ

up-list はS式にまつわる操作コマンドの一つです。このコマンドを実行すると、S式の一つ上の階層にカーソルを移動させます。閉じ括弧を探して移動すると考えれば良いかもしれません。例は下記の通りです。

操作前 操作後
(messs►age "hello world") (messsage "hello world")►
(messsage "hello► world") (messsage "hello world"►)

kill-sexp で括弧を丸ごと消す

デフォルトで C-M-k にバインドされたコマンド kill-sexp は次のS式を削除します。このコマンドを例えば、開き括弧から閉じ括弧までを削除したりといったことが可能です。例は下記の通りです。

操作前 操作後
►(messsage "hello world")
(messsage ►"hello world") (messsage ►)

smartparens

smartparens は括弧に対する操作を拡張するパッケージです。自動で対応する括弧を挿入したり、様々な機能を持っています。ただし、この記事では、一部のコマンドのみを紹介するため、詳細やインストール方法については smartparens のドキュメントを参照してください。

sp-change-inner で括弧の中身を消す

sp-change-inner はカーソル位置から次の括弧を探索して、その括弧の中身を削除するコマンドです。例は下記の通りです。

操作前 操作後
(messsage "hello ►world") (message "")
(messs►age "hello world") ()

sp-unwrap-sexp で括弧をはがす

sp-unwrap-sexp はカーソル位置から次の括弧を探索して、その括弧を削除するコマンドです。例は下記の通りです。

操作前 操作後
(messsage "hello ►world") (message hello world)
►(messsage "hello world") message "hello world"

sp-rewrap-sexp で別の括弧にすり替える

sp-rewrap-sexp はカーソル位置から次の括弧を探索して、その括弧を任意の括弧に置き換えるコマンドです。コマンド実行後は、変更後の括弧を要求されます。用途は多くないですが "' に相互変換したりと言った操作が可能です。

終わりに

以上で Emacs における括弧にまつわるコマンドをたくさん紹介してきました。これらを組み合わせることで、1文字ずつ操作するのとは比べ物にならないスピードでプログラミングができるはずです。それほど頻出する操作ではないのですが、好みによってはキーバインドを当てるのも良いと思います。

その他、括弧に関するパッケージとしては electric-pair-mode があるのですが、今回は私の知識不足のため省略させていただきます。興味のある方はぜひ調べてみてください。

Discussion