> EmacsのIdo Modeで補完を快適にする

Emacsでファイルを開いたり、バッファを切り替えたりする操作は、1日に何十回、何百回と繰り返します。
そんな日常的な操作を劇的に改善してくれるのが、Ido Mode(Interactively DO things)です。

;; IDO あいまい一致補完の設定
(setq ido-enable-flex-matching t)
(setq ido-everywhere t)
(ido-mode 1)
(ido-everywhere 1)

ただし、上下で最近開いたファイル表示はできなくなります。

関連記事

1. Ido Modeはflex matchingを提供する

Ido Modeは、Emacsでよく使われる入力補完機能の一つです1

通常のEmacsでは、「 .emacs.d/init.el 」というバッファを開こうとすると、TABを押して補完を試みて、うまくいかなければさらに文字を入力して…という繰り返しになります。

1. Ido Modeはflex matchingを提供する

Ido Modeを使えば、inel などと入力するだけです。
たった、これだけで目的のバッファを見つけてくれます。

Flex Matching(柔軟なマッチング) 入力した文字が順番に含まれていればマッチ 従来の補完 ファイル名:.emacs.d/init.el .emacs → TAB → d/ → TAB… Ido Mode ファイル名:.emacs.d/init.el emcini マッチングの仕組み .emacs.d/init.el e m c i n i

この仕組みは「flex matching(柔軟なマッチング)」と呼ばれています。
入力した文字が候補の中に含まれていれば、順番や位置が離れていてもマッチするという考え方です。

1.1. 基本的な設定を有効化(ido-mode)

IDOは、emacsの標準に組み込まれているので、init.elなどの設定ファイルに、次のように記述します。

(setq ido-enable-flex-matching t)
(setq ido-everywhere t)
(ido-mode 1)

これだけで、ファイルとバッファの補完にIdo Modeが適用されます。

カーソル位置にファイルパスやURLがあるとき、それを自動的に認識してファイルを開く機能があります。これは「Find File At Point(ffap)」と呼ばれる仕組みです。

2. 基本的な移動と選択

Ido Modeには多くのキーバインドがありますが、すべてを覚える必要はありません。
ここでは実際によく使うものを中心に紹介します。

  • C-s / C-r:次の候補 / 前の候補へ移動
  • RET:選択を確定
  • C-j:入力したテキストそのものを確定します(ido-select-text)2
  • Backspace:文字を削除、またはディレクトリを1つ上がる
  • C-d:現在のディレクトリでdiredを開く
  • C-SPC または C-@ :現在の入力にマッチする候補だけに絞り込む(ido-restrict-to-matches)

C-SPC または C-@は、候補が多すぎて選びにくいときに便利です3
たとえば .org と入力して C-SPC を押せば、org-modeのファイルだけに候補を限定できます。

2.1. パスの素早い移動

ファイルを開くとき、パスの途中から入力し直したい場面があります。

  • //:ルートディレクトリに移動(Windowsでは現在のドライブのルート)
  • ~/:ホームディレクトリに移動

たとえば /home/user/projects/work/src/ というパスで作業中に、別のプロジェクトを開きたくなったとします。
// と入力すればすぐにルートに戻れるので、パスを一から入力し直す手間がかかりません。

2.2. Ido Modeを一時的に無効化

Ido Modeが邪魔になる場面もあります。
そんなときは、Ido Mode中に

  • C-f:通常のファイル選択に戻る
  • C-b:通常のバッファ選択に戻る

2.3. その他の便利な操作

  • C-k:選択中のバッファを削除、またはファイルを削除
  • TAB:通常の補完動作を試みる
  • M-d:サブディレクトリも含めて検索

M-d は、現在のディレクトリ配下のすべてのファイルから検索したいときに使います4
ファイルがどこにあるか忘れたときに重宝します。

3. 作業ディレクトリの活用

Ido Modeは、最近使ったディレクトリを記憶しています。
この機能を「作業ディレクトリ(work directory)」と呼びます。

  • M-n / M-p:次の作業ディレクトリ / 前の作業ディレクトリに移動
  • M-k:現在の作業ディレクトリをリストから削除
  • M-s:すべての作業ディレクトリから検索

M-s は、数秒待つと自動的に実行されます5
この待ち時間は ido-auto-merge-delay-time で変更できます。

頻繁にアクセスするディレクトリが複数ある場合、この機能を使えば素早く行き来できます。
たとえばプロジェクトAとプロジェクトBを並行して作業しているとき、ディレクトリの履歴から選ぶだけで切り替えられるわけです。

特定のディレクトリをキャッシュから除外したい場合は、ido-work-directory-list-ignore-regexps に正規表現を追加します。
ネットワークドライブや一時的なディレクトリなど、遅い・頻繁には使わないディレクトリを除外しておくと快適です。

4. 知っておきたい実用的な設定

基本設定だけでも十分便利ですが、さらに使いやすくするための設定をいくつか紹介します。

4.1. ファイルパスを自動推測する(find file at point)

(setq ido-use-filename-at-point 'guess)
Code language: PHP (php)

たとえばEmacsのコード内で (require 'foobar) と書かれている箇所にカーソルがあると、foobar.elを開こうとしてくれます。
ただしURLの自動認識は誤判定が多いため、無効にしておくのが無難です6

4.2. バッファ作成時の確認を省略(ido-create-new-buffer)

一時的なメモ用のバッファをよく作る場合、毎回確認を求められるのは煩わしいものです。

(setq ido-create-new-buffer 'always)
(setq-default confirm-nonexistent-file-or-buffer nil)
Code language: PHP (php)

この設定で、存在しないバッファ名を入力したとき、即座に新しいバッファが作成されます7

4.3. よく使うファイル拡張子を優先(ido-file-extensions-order )

複数の候補がある場合、よく使う拡張子のファイルを先に表示させると選びやすくなります。

(setq ido-file-extensions-order 
      '(".org" ".txt" ".py" ".emacs" ".xml" ".el" ".ini" ".cfg" ".cnf"))

自分の作業環境に合わせて、拡張子の順序を調整してみてください。

4.4. 不要なファイルを非表示にする(ido-ignore-extensions)

Ido Modeには、特定のファイルやディレクトリを補完候補から除外する機能があります8

(setq ido-ignore-extensions t)

この設定により、Ido Modeは completion-ignored-extensions に登録された拡張子のファイルを非表示にします。
たとえば、オブジェクトファイル(.o)やバックアップファイル(~)などを除外できます。

設定は M-x customize-option RET completion-ignored-extensions から行えます。

なお、除外されたファイルでも、その名前を明示的に入力すれば開くことは可能です。
完全に隠されるわけではありません。

5. 合わせて使えるパッケージ

;; IDO everywhereの強化(ubiquitous-mode)
(use-package ido-completing-read+
  :ensure t
  :config
  (ido-ubiquitous-mode 1))

;; smex (M-xでidoを使う)
(use-package smex
  :ensure t
  :bind (("M-x" . smex)
         ("M-X" . smex-major-mode-commands)
	 ("C-c C-c M-x" . 'execute-extended-command)
	 )
  :config
  (smex-initialize))

;; This is your old M-x.
(global-set-key (kbd "C-c C-c M-x") 'execute-extended-command)  ;; This is your old M-x.

;; 候補を縦に表示して見やすく
(use-package ido-vertical-mode
  :ensure t
  :config
  (ido-vertical-mode 1)
  (setq ido-vertical-define-keys 'C-n-and-C-p-only))
Code language: PHP (php)
合わせて使えるパッケージ ido-completing-read+ より広範囲で ido補完を適用 smex M-xコマンドで ido風補完 ido-vertical-mode 候補を縦に表示 視認性向上 flx-ido より賢い マッチング Ido

5.1. 1. ido-completing-read+

ido-everywhereを強化し、より多くの場面でido補完を使えるようにします9

(use-package ido-completing-read+
  :ensure t
  :config
  (ido-ubiquitous-mode 1))Code language: CSS (css)

5.2. 2. smex (M-xでidoを使う)

M-xコマンドの実行時にido風の補完を提供します。

(use-package smex
  :ensure t
  :bind (("M-x" . smex)
         ("M-X" . smex-major-mode-commands))
  :config
  (smex-initialize))Code language: CSS (css)

5.3. 3. ido-vertical-mode (視認性向上)

候補を縦に表示して見やすくします。

(use-package ido-vertical-mode
  :ensure t
  :config
  (ido-vertical-mode 1)
  (setq ido-vertical-define-keys 'C-n-and-C-p-only))Code language: PHP (php)

6. 日常に溶け込む道具として

Ido Modeを使い始めると、最初は操作に戸惑うかもしれません。でも数日使えば、自然と指が動くようになります。

バッファを切り替える。ファイルを開く。この単純な操作が、わずかに速く、わずかに快適になる。その積み重ねが、長い時間をかけて大きな違いを生みます。

設定も最小限で済むので、まずは基本的な有効化だけ試してみてください。必要に応じて、カスタマイズを加えていけばいいのです。

;; 最小限の設定でIdo Modeを始める
(setq ido-enable-flex-matching t)
(setq ido-everywhere t)
(ido-mode 1)

たったこれだけで、Emacsの使い心地が変わります。

  1. Ido Modeは2002年頃から開発され、Stephen Eglenによるiswitch-bufferモードをベースにしています。Emacs 22.1以降は標準パッケージとして組み込まれています。現代的な代替としてはEmacs 27以降で標準搭載されたFido Modeや、外部パッケージのHelm、Ivy、Verticoなどがあります。 – Introduction to Ido Mode – Mastering Emacs
  2. 既存のファイル名と同じ文字列で新規ファイルを作成したい場合や、候補を無視して入力テキストを使いたい場合に必須の機能です。 – Ido lets you interactively do things with buffers and files
  3. この機能は「ido-restrict-to-matches」と呼ばれ、現在表示されている候補リストを固定して、さらにその中から絞り込むことができます。複数回使用することで段階的な絞り込みが可能です。 – Introduction to Ido Mode – Mastering Emacs
  4. M-dは「Wide find directory」を起動し、親ディレクトリを選択してサブディレクトリの名前をマッチングします。ファイルをサブディレクトリ内から検索する場合はM-f(Wide find file)を使用します。 – Introduction to Ido Mode – Mastering Emacs
  5. 正確には、現在のディレクトリで候補が見つからない場合、ido-auto-merge-delay-time(デフォルトは0.7秒)後に自動的に作業ディレクトリからの検索(マージ)が開始されます。M-sを手動で押すことでこの動作を即座に実行できます。 – Interactive Do
  6. ‘guess設定自体がURL認識を含むため、より安全な設定は’ffapまたはnilです。’ffap(find-file-at-point)は従来のffap関数を使用し、nilは自動推測を完全に無効化します。URL認識を避けたい場合はnilの使用を推奨します。 – Interactive Do
  7. この2行目の設定はido固有ではなく、Emacs全体の動作を変更します。ido-modeでは(setq ido-create-new-buffer ‘always)のみで十分であり、グローバル設定を変更すると他の動作にも影響する可能性があります。 – ido-mode — defn.io
  8. これは重要な安全機能です。除外リストに含まれるファイルも完全には隠されず、正確なファイル名を入力すればアクセス可能です。これにより、誤って必要なファイルにアクセスできなくなる事態を防ぎます。 – Interactive Do
  9. このパッケージは以前「ido-ubiquitous」という名前でした。ido-everywhereはIdo Mode本体の標準機能であり、ido-completing-read+(ido-ubiquitous)はそれをさらに拡張する外部パッケージです。 – GitHub – DarwinAwardWinner/ido-completing-read-plus