dired からファイルを開くとき、isearch を使ってファイル名を検索することが多いのではないだろうか。もちろんこれでも良いのだけれど、私はキー操作を少し減らしたいと思った。なぜかというと、DOS の VZ Editor に isearch.def という操作性のよいファイラーマクロがあって、私は便利に利用していたのだが、この操作性を Emacs 上でも実現したいと考えたからだ。それでこのプログラムができあがった(とはいえVZマクロの機能の一部を実装しているだけの単機能なプログラムにすぎない)。
たとえば、.emacs を開くときに、"." から始まるファイルはたくさんあるが、起動キーを押して、[.][e][m][a][c][s]と順にタイプすると、その度に検索して .emacs に最短で辿り着くことができる。この点は標準の isearch と同じだが、SPC でマッチするファイルに順にカーソルを進めたり、自動で wrap するので、ファイルを開くまでの手順を少し減らすことができるのがポイントだ。しかし、disearch はファイル名の先頭からマッチする場合に検索可能で、ファイル名の一部にマッチさせることはできない。そのため、標準の isearch と併用している。
インストールと設定
load-path の通ったディレクトリに、disearch.el をコピーして、以下のコードを .emacs に追加します。
(require 'disearch)
これで、dired 上で "i" を押すことによって disearch が起動します。
しかし、"i" には標準で dired-maybe-insert-subdir がバインドされていて、disearch.el は、この設定を上書きしているので、キー設定を変更しておいた方がよいでしょう。disearch 起動に "i" を使いたくなければ、他のキーにバインドし直して下さい。
"I" に、disearch をバインドする例を示します。disearch-invoke-key がカスタマイズ変数になっています。
(setq disearch-invoke-key "I")
下のは、私の設定です。"i" が disearch なので、dired-maybe-insert-subdir を "I" にバインドし直しています。
(add-hook 'dired-mode-hook (lambda () (define-key dired-mode-map "I" 'dired-maybe-insert-subdir)))
使用法
disearch を起動すると下のイメージのようにミニバッファに "i: " というプロンプトが出ます。検索したいファイル名を、先頭から順にタイプして行くと、インクリメンタル検索で徐々に絞り込んで、目的のファイル名にポイントが移動します。このとき、アルファベットは大文字・小文字を区別せずに検索します。また、日本語の検索はできません。
目的のファイルの行にポイントが来たら、C-j をタイプするとポイント位置のファイルが開きます。disearch 起動中に実行可能なコマンドは下の表の通りです。
"/" と f1 が、ヘルプで、describe-key-briefly ライクなコマンドになっています(Emacs 22 以降)。実行されるコマンド名が表示されるので、下の表を参考にして確認して下さい。未定義のキー入力の場合、"undefined" と表示されます。
※印は、コマンドを実行すると共に、disearch を終了するものです。dired の標準のコマンドの場合がそうです。undefined なキー入力の場合、disearch を終了します。それ以外は、続けて文字入力すれば検索を続行します。
バインド | コマンド名 | 説明 |
---|---|---|
backspace | disearch-previous-match | 後方に、マッチする文字列を検索する |
delete | disearch-yank-char | ポイント位置の1文字を検索文字列に追加する |
return | disearch-advertised-find-file | dired-advertised-find-file ※ |
tab | disearch-reverse-direction | 検索方向を転換する |
\C-a | disearch-find-alternate-file | dired-find-alternate-file ※ |
\C-b | disearch-delete-char | 検索文字列を末尾から1個取り除く |
\C-d | disearch-yank-char | ポイント位置の1文字を検索文字列に追加する |
\C-w | disearch-yank-word | ポイント位置の単語を検索文字列に追加する |
\C-m | disearch-view-file | dired-view-file ※ |
\C-j | disearch-advertised-find-file | dired-advertised-find-file ※ |
\C-o | disearch-display-file | dired-display-file ※ |
\M-o | disearch-find-file-other-window | dired-find-file-other-window ※ |
\C-f | disearch-find-file | dired-find-file ※ |
\C-h | disearch-dec | isearch の C-h のような動作 |
127 | disearch-dec | isearch の C-h のような動作 |
\M-h | disearch-backward-kill-sequence | 検索文字列を初期化する |
\C-i | disearch-reverse-direction | 検索方向を転換する |
SPC | disearch-next-match | 前方に、マッチする文字列を検索する |
C-SPC | disearch-space | 機能なし。disearch を終了する |
\C-n | disearch-next-match | 前方に、マッチする文字列を検索する |
\C-p | disearch-previous-match | 後方に、マッチする文字列を検索する |
\C-l | disearch-recenter | recenter |
/ | disearch-describe-key-briefly | describe-key-briefly ライクなヘルプ |
f1 | disearch-describe-key-briefly | describe-key-briefly ライクなヘルプ |
\e | disearch-exit | disearch を終了する |
escape | disearch-exit | disearch を終了する |
alphabetなど | disearch-inc | インクリメンタル検索する |
その他 | disearch-exit | disearch を終了する |
カスタマイズ
上の表のコマンド disearch-* を他のキーに割り当て可能です。カスタマイズ変数は、disearch-command-key-alist-user です。例えば、C-f に disearch-yank-char を、C-e に disearch-find-file をバインドするには、次のようにします。require する前に設定して置く必要があります。
(setq disearch-command-key-alist-user '((?\C-f . disearch-yank-char) (?\C-e . disearch-find-file)))
その他
dired 上で、disearch とは独立して実行可能なコマンドが、4個定義されています。カーソル移動系のコマンドです。下のは私の設定です。
(add-hook 'dired-mode-hook (lambda () (define-key dired-mode-map " " 'disearch-scroll-up) (define-key dired-mode-map "b" 'disearch-scroll-down) (define-key dired-mode-map "n" 'disearch-next-line) (define-key dired-mode-map "p" 'disearch-previous-line)))
既知の問題
- 無限ループになる場合がある。
TODO
- ファイル名の一部にマッチする検索を可能にする。