mcomplete.el においてidoやelscreenとの競合を回避
idoのすすめ
Emacsで,もしanythingを使わなくて,ファイルを開く関数に不満があったら,個人的にはidoがおすすめ.
http://www.bookshelf.jp/soft/meadow_23.html#SEC224
リンク先では酷評されてるし僕も最初は使えないと思ってしまったが,キーバインドをちょっと変更すると劇的に変わる.
(require 'ido) (ido-mode 'file) (ido-everywhere t) (custom-set-variables '(ido-max-directory-size 'const)) (custom-set-variables '(ido-enter-matching-directory 'first)) (custom-set-variables '(ido-ignore-files (cons '"\\`\\." ido-ignore-files))) (define-key ido-file-dir-completion-map (kbd "SPC") 'ido-exit-minibuffer) ; ここ (define-key ido-file-dir-completion-map (kbd "C-h") 'ido-delete-backward-updir)
C-xC-fから,ちょっと文字を入力して,スペースで確定していく*1.先頭から入力しなくてもよかったり,複数の候補をC-sやC-rで切り替えるのはiswitchbと同じ.
おそらくデフォルトで入っているから,上のコードを.emacsに追加するだけで動くはず.
mcompleteと仲良く
自分のemacs環境では,ido, iswitchb, elscreenなどを導入しているが,ここにmcompleteを加えるとファイルを開く時やバッファを切り替える時に動作がおかしくなるというエラーがあった.具体的には,次のようなメッセージが表示され,キーを打つたび "[No match]" が出てくるというもの.
Error in pre-command-hook: (args-out-of-range 39 206)
で,原因等はここが参考になりました.
http://hexe19.net/2008/05/11/46/emacs-elscreen-iswitchb-mcomplete-error-in-pre-command-hook/trackback
適当にまとめると,mcompleteはminibufferの上で動くのだが,iswitchbやidoなどと競合しないようにmcompleteのモードを無効にする関数リストを持っている.で,そのリスト定義はmcomplete.elの1000行目付近の次の記述で,デフォルトでidoやiswitchbの関数が登録されているここにelscreen-find-fileとかelscreen-find-and-goto-by-bufferとかを追加するというわけ.
(mapcar #'(lambda (f) (put f 'mcomplete-mode '(:mode off))) '(...
が,こちらの環境ではidoがうまく動かず,他に追加する必要があったのでメモ.
例えば,idoで一旦上の階層に戻ってから補間する場合,うちの環境では ido-delete-backward-updir をmode-offのリストに追加していないと例のエラーで操作ができなかった.
ということで,他にエラーを起こすかもしれない,keymapに登録されている関数を一応リストアップしておく.
ido-toggle-ignore ido-toggle-case ido-edit-input ido-complete ido-complete-space ido-select-text ido-exit-minibuffer ido-toggle-prefix ido-prev-match ido-next-match ido-toggle-regexp ido-undo-merge-work-directory ido-restrict-to-matches ido-take-first-match ido-restrict-to-matches ido-completion-help ido-magic-backward-char ido-magic-forward-char ido-magic-delete-char ido-enter-switch-buffer ido-fallback-command ido-enter-dired ido-next-match-dir ido-prev-match-dir ido-prev-work-directory ido-next-work-directory ido-delete-backward-updir ido-delete-backward-word-updir ido-up-directory ido-reread-directory ido-wide-find-dir-or-delete-dir ido-push-dir ido-push-dir-first ido-wide-find-file-or-pop-dir ido-forget-work-directory ido-make-directory ido-next-work-directory ido-prev-work-file ido-merge-work-directories ido-delete-file-at-head ido-copy-current-word ido-copy-current-file-name ido-toggle-literal ido-toggle-vc ido-enter-find-file ido-fallback-command ido-kill-buffer-at-head
あとEmacsWikiにあったiswitchbスタイルのfile-cache関数とかも競合したのでその類も登録.
しかし,そのfile-cache-iswitchb-file関数とicomplete.elをちゃんと解析したら,もっと競合が起こりにくそうな拡張ができそうな気もするが,スキルや時間対効果を考えると今動いてるしまぁこれでいいかという結論に.
ヘルプ機能
f1-[afmk]あたりはわりと馴染みがあったけど,他に知らない便利そうなのがあるのでメモ.
- M-x find-function
- f1-a apropos-command
- f1-b describe-bindings
- f1-f describe-function
- f1-i info
- f1-k describe-key
- f1-l view-lossage
- f1-m describe-mode
- f1-p finder-by-keyword
- f1-v describe-variable
- f1-w where-is
*1:デフォルトはRETかC-mで少々やりにくい.また,空白を入力する場合はC-qSPCで代用する