見えているバッファの好きな場所にカーソルをavyで移動させる

2023年4月15日
thumbnail
Emacsでカーソルを移動させるコマンドは沢山あれど、avyほど早いものは多分無いでしょう。 avyはバッファの目的の場所にカーソルを最速で移動させます。
avyが用意しているコマンドはざっくりいうと、目的の場所のキーワードをタイプしてマッチした場所にカーソルを移動するだけです。候補の絞り込み機能がスマートなので愛用されています。
完成したコードはこちらです。
(use-package avy
  :ensure t
  :bind (;;("C-;" . avy-goto-char-2)
         ("C-;" . avy-goto-char-timer))
  :config
  (setq avy-timeout-seconds 0.2))

使い方

設定で唯一指定したのは(setq avy-timeout-seconds 0.2)で、検索文字を入力してから0.2秒何もしない場合、ジャンプするキーを表示します。デフォルトでは0.5秒で長く感じたので短くしています。
とりあえずpythonのサンプルコードを用意しました。
def get_integer(prompt):
    while True:
        try:
            value = int(input(prompt))
            break
        except ValueError:
            print("Please enter an integer.")
    return value

def add_numbers():
    num_values = get_integer("How many numbers do you want to add? ")
    total = 0
    for i in range(num_values):
        num = get_integer("Enter a number: ")
        total += num
    print("The total is:", total)

if __name__ == '__main__':
    add_numbers()
Emacsでファイルを開いて、int の部分にカーソルを移動してみます。 ("C-;" avy-goto-char-timer)を実行して、intと打ち込みます。
intで引っかかる場所は全部で7箇所あります。
水色で表示されたキーがジャンプキーです。その文字をタイプするとカーソルが移動します。下の画像の場合、目的の場所はsキーで表現されています。sをタイプし移動します。
article image
このように高速で目的の場所に移動しました。
article image

avy-goto-char-timerが遅く感じる人へ

上の完成済みコードでコメントアウトしているのは2文字打ったらジャンプキーを表示してくれるコマンド("C-;" . avy-goto-char-2)です。 こちらは、必ず2文字タイプしたら候補が表示されるので、0.2秒の待ち時間がありません。
しかし、個人的に少しミス入力がが多くてやめています。 例えば、移動先のキーワードがdefの場合、avy-goto-char-2ならば2文字のdeだけ打ち込みあとはジャンプキーを打つ必要があります。しかし、こういう時って、勢いでdefと打ってしまいますよね。そうすると、ジャンプキーのfの場所に勝手に移動します。
個人的には0.2秒我慢して打ちたい文字数で候補を表示してくれる("C-;" . avy-goto-char-timer)を使っています。

まとめ

avyのカーソル移動は慣れないとやや難しく感じます。僕も利用頻度はそこまで高く無いです。htmlのように目的の場所がネストしてて右側にある場合とかに、avyでババっと移動することがあります。要所要所で使っていくと力を発揮するパッケージです。
profile image
Ted
大学でコンセンサスアルゴリズムを研究。卒業後ベンチャー企業に入社してフルスタックでWebサービスを開発。現在は大手IT企業に転職し、プログラミングを行っている。AIにプログラマーの仕事を奪って欲しいと願っている。