2023年4月09日
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
変数にカーソルをホバーすると、ホバーハイライトされます。そのまま
M-h (symbol-overlay-put)
を実行すると、contents
変数に色がつきます。ハイライトした変数にカーソルを当てて、
p
で1つ前の変数へn
で次の変数へカールソルを移動できます。ハイライトを解除したいときはハイライトされた変数にカーソルを当てて
M-h (symbol-overlay-put)
を実行すれば解除されます。複数のキーワードをハイライトしている場合、1つ1つ解除するのは面倒です。そのような時は、
M-q (symbol-overlay-remove-all)
で全てのハイライトを解除できます。ヘルプの起動
上の完成済みコードで割り振っているバインドはそこまで多くありません。
symbol-overlayはその他にも便利なコマンドがあります。
ヘルプの起動はハイライトしているキーワードにカーソルを当てて、
h
をタイプすると起動します。左側に表示されているkey
はハイライトされたキーワードにカーソルを当てているときに起動するショートカットです。symbol-overlay-rename
よく使うのは
symbol-overlay-rename
でしょう。ハイライトされたキーワードにカーソルを当ててr
をタイプすると、エコーエリアにキーワードが表示されます。別の名前に書き換えてエンターを押すと、同一ファイル上の全てのキーワードが書き変わります。ハイライトスタイルの変更
私はテーマにmodus-themesを使っています。symbol-overlayは自動的にテーマで使われている色を参照してハイライトに利用してくれます。
ただ、自動的に選択された結果が微妙で、色の指定に重複があったので自分で上書きしています。
もしも、同じようにmodus-themsを使っているならば、コメントアウトするだけで良さそうなカラーセットが利用できます。別のテーマを使っている場合は、一度symbol-overlayのカラーパレットを見て問題ないか確認すると良いでしょう。
M-x customize-group
でエンターを押しsymbol-overlay
タイプすると設定画面に移動できます。色は全部で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はコードを読んでいるときに特に便利です。知らない関数が出てきたらとりあえずハイライトしてどのように使われているか追ってみたり、背景色がつくことでエディタの中で一段と目立つようになります。ぜひ使ってみてください。
Ted
大学でコンセンサスアルゴリズムを研究。卒業後ベンチャー企業に入社してフルスタックでWebサービスを開発。現在は大手IT企業に転職し、プログラミングを行っている。AIにプログラマーの仕事を奪って欲しいと願っている。