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
追記

他の操作でもエラーが発生.たとえば,elscreenのfind-fileをread-onlyで開く関数とか,idoでカンマ入力による拡張とか.なんかいろいろと面倒くさくなって来たので,素直にicompleteを使おうかな.
というのも,iswitchbとかなら選択肢が少なくて,C-sとか途中から入力とかが意味を持ってたけど,M-xの補完候補はめっちゃ多くてあまり意味がないから.historyで頻繁に使うぐらいならキーバインドしたらいいと思うし.
とりあえず,補完中に第一候補で決定できるようにだけ拡張しようかな.

*1:デフォルトはRETかC-mで少々やりにくい.また,空白を入力する場合はC-qSPCで代用する