読者です 読者をやめる 読者になる 読者になる

ace-isearch に新オプション項目が追加された話

ace-isearch emacs

はじめに

拙作ace-isearchに対して先日プルリクエストを頂き、内容が十分納得できまた動作も問題なかったのでマージさせて頂いた。結果として新しくオプション項目が追加されたので、本稿はその内容を解説することを目的とする。以下が当該プルリクエストのページである。

Add an option to invoke ace-jump-mode only after a printing character is input. by knu · Pull Request #5 · tam17aki/ace-isearch · GitHub

解説

現状のace-isearchは、isearch中の入力文字列長が1のときに「必ず」ace-jump-modeが発動する仕様になっている。C-sやC-rでisearchを起動し、ミニバッファが空の状態でジャンプする先の文字を1つ入力するという使い方ならばこれで問題はない。

しかしながら、以下のような副作用も内包することになる。

  1. ジャンプした後、例えばC-sを再度押下して1文字searchを発動するとまたace-jump-modeが発動する。
  2. isearchのミニバッファに入力された文字列長が1以上のとき、isearch-delete-charにより入力済み文字を削除し、文字列が1になるとace-jump-modeが発動してしまう。クエリの再入力に不便が生じるというわけである。
  3. 1文字クエリをヤンクしたときも上と同様の状況である。

そういうわけで、頂いたプルリクエストというのは上記の副作用の解消に役立つ、新しいカスタマイズ項目を追加するパッチである。以下で仕様を説明する。

仕様

パッチはカスタマイズオプションace-isearch-use-ace-jumpに関するものであった。

(defcustom ace-isearch-use-ace-jump t
  "If `nil', `ace-jump-mode' is never invoked.
If `t', it is always invoked if the length of `isearch-string' is
equal to 1.
If `printing-char', it is invoked only if you hit a printing
character to search for as a first input.  This prevents it from
being invoked when repeating a one character search, yanking a
character or calling `isearch-delete-char' leaving only one
character."
  :type '(choice (const :tag "Always" t)
                 (const :tag "Only after a printing character is input" printing-char)
                 (const :tag "Never" nil))
  :group 'ace-isearch)

ace-isearch-use-ace-jumpの取りうる値として新たにprinting-charが追加されている。docstringにも書いてあるように、printing-charに設定した場合、上記副作用は解消され真に最初の1文字をキーボードから入力したときのみ、ace-jump-modeが発動するようになる。

おわりに

本稿では拙作ace-isearchに対して送られたプルリクエストの内容を解説した。今回プルリクエストを送って下さったknu氏には感謝申し上げる。

以上