Emacsのsymbol-overlayで変数、関数をハイライトする機能が便利すぎる

2023年4月09日
thumbnail
Emacsのパッケージの中でもこれほど便利なものはないんじゃないかと個人的に思っているのがsymbol-overlayです。
symbol-overlayはコードの中のハイライトしたい変数、関数を選び、同じファイル内の別の場所に書かれている箇所へ移動できます。例えば長いコードを見ていて、気になる関数がなんなのかわからないとします。そしたら気になる関数をハイライトし、定義されている場所に移動したり、他の場所に移動してどう使われているか把握したりできます。
完成済みのコードはこちらになります。
(use-package symbol-overlay
  :ensure t
  :custom-face
  ;; (symbol-overlay-face-1 ((t (:inherit modus-themes-intense-blue))))
  ;; (symbol-overlay-face-2 ((t (:inherit modus-themes-intense-magenta))))
  ;; (symbol-overlay-face-3 ((t (:inherit modus-themes-intense-yellow))))
  ;; (symbol-overlay-face-4 ((t (:inherit modus-themes-intense-red))))
  ;; (symbol-overlay-face-5 ((t (:inherit modus-themes-intense-cyan))))
  ;; (symbol-overlay-face-6 ((t (:inherit modus-themes-intense-green))))
  ;; (symbol-overlay-face-7 ((t (:inherit modus-themes-subtle-magenta))))
  ;; (symbol-overlay-face-8 ((t (:inherit modus-themes-subtle-blue))))
  :bind(
        ( "M-h" . symbol-overlay-put)          ;; キーワードをハイライトする
        ( "M-n" . symbol-overlay-jump-next)    ;; カーソルを当てて、ハイライトした次のキーワードに移動
        ( "M-p" . symbol-overlay-jump-prev)    ;; カーソルを当てて、ハイライトした前のキーワードに移動
        ( "M-q" . symbol-overlay-remove-all))  ;; ハイライトした全てをキャンセル
  :init
  (add-hook 'prog-mode-hook 'symbol-overlay-mode))

symbol-overlayの使い方

基本的な使い方はとてもシンプルです。
例えば、このようなpythonの関数があったとします。
def replace_file_string(filename, oldstring, newstring):
    with open(filename, 'r') as f:
        contents = f.read()
        contents = contents.replace(oldstring, newstring)
    with open(filename, 'w') as f:
        f.write(contents)

replace_file_string('file.txt', 'old', 'new')
contents変数にカーソルをホバーすると、ホバーハイライトされます。
article image
そのままM-h (symbol-overlay-put)を実行すると、contents変数に色がつきます。
article image
ハイライトした変数にカーソルを当てて、pで1つ前の変数へnで次の変数へカールソルを移動できます。
ハイライトを解除したいときはハイライトされた変数にカーソルを当ててM-h (symbol-overlay-put)を実行すれば解除されます。
複数のキーワードをハイライトしている場合、1つ1つ解除するのは面倒です。そのような時は、M-q (symbol-overlay-remove-all)で全てのハイライトを解除できます。
article image

ヘルプの起動

上の完成済みコードで割り振っているバインドはそこまで多くありません。 symbol-overlayはその他にも便利なコマンドがあります。
ヘルプの起動はハイライトしているキーワードにカーソルを当てて、hをタイプすると起動します。左側に表示されているkeyはハイライトされたキーワードにカーソルを当てているときに起動するショートカットです。
article image

symbol-overlay-rename

よく使うのはsymbol-overlay-renameでしょう。ハイライトされたキーワードにカーソルを当ててrをタイプすると、エコーエリアにキーワードが表示されます。別の名前に書き換えてエンターを押すと、同一ファイル上の全てのキーワードが書き変わります。
article image

ハイライトスタイルの変更

私はテーマにmodus-themesを使っています。symbol-overlayは自動的にテーマで使われている色を参照してハイライトに利用してくれます。
ただ、自動的に選択された結果が微妙で、色の指定に重複があったので自分で上書きしています。 もしも、同じようにmodus-themsを使っているならば、コメントアウトするだけで良さそうなカラーセットが利用できます。別のテーマを使っている場合は、一度symbol-overlayのカラーパレットを見て問題ないか確認すると良いでしょう。
M-x customize-groupでエンターを押しsymbol-overlayタイプすると設定画面に移動できます。
article image
色は全部で1〜8まであります。もしも変更したい場合は、下のコードの右部分を利用しているテーマ色に変更すると良いでしょう。
(symbol-overlay-face-1 ((t (:inherit modus-themes-intense-blue))))
(symbol-overlay-face-2 ((t (:inherit modus-themes-intense-magenta))))
(symbol-overlay-face-3 ((t (:inherit modus-themes-intense-yellow))))
(symbol-overlay-face-4 ((t (:inherit modus-themes-intense-red))))
(symbol-overlay-face-5 ((t (:inherit modus-themes-intense-cyan))))
(symbol-overlay-face-6 ((t (:inherit modus-themes-intense-green))))
(symbol-overlay-face-7 ((t (:inherit modus-themes-subtle-magenta))))
(symbol-overlay-face-8 ((t (:inherit modus-themes-subtle-blue))))

まとめ

symbol-overlayはコードを読んでいるときに特に便利です。知らない関数が出てきたらとりあえずハイライトしてどのように使われているか追ってみたり、背景色がつくことでエディタの中で一段と目立つようになります。ぜひ使ってみてください。
profile image
Ted
大学でコンセンサスアルゴリズムを研究。卒業後ベンチャー企業に入社してフルスタックでWebサービスを開発。現在は大手IT企業に転職し、プログラミングを行っている。AIにプログラマーの仕事を奪って欲しいと願っている。