Help us understand the problem. What is going on with this article?

君は誰とEmacsる? (補完インターフェイス紹介篇)

More than 1 year has passed since last update.

Anything? それともIDO?

承前

Emacsの初期設定の補完インターフェイスは前方一致補完しかできないので、効率を上げるための代替手法を提案する。

具体的にはC-x C-f(find-file)とかC-x b(switch-to-buffer)、M-x(execute-extended-command)みたいなコマンドの操作性を改善できる。

find-file-default.gif

注意

拡張パッケージをインストールする際にはpackage.el - Emacs JPGetting Started - MELPAを参考にMELPAの設定をすること。

また、以下に紹介する「IDO」「Helm」「Counsel」「Anything」のどれかを選んで、設定は混在させない方が良い。

最初に比較表

パッケージ名 リポジトリ 独断と偏見による立ち位置
IDO (ido-mode) Emacs標準添付 最近は利用者多い印象・さくさく
Ivy/Counsel MELPA
GNU ELPA
新進気鋭・さくさく
Helm MELPA 定番だけど拡張仕様が安定しない
Anything MELPA 良くも悪くも枯れてる

この場合の枯れたは比較的ポジティブな意味です。筆者はHelmが慣れてるのでこれを使ってますが、Anythingを使ってるひともまだまだたくさん居ますし、これから導入するならIvy/Counselも良い選択肢です。

IDO (ido-mode)

IDO(Interactive DoまたはInteractively Do Things)は最少のキーボード打鍵で補完入力できるように設計された補完入力インターフェイスです。Emacsに同梱されてるので、最少の設定で利用する場合はパッケージ導入が不要です。

バッファ切替ファイル名補完が主機能ですが、ido-everywhereを有効化すると、それ以外の箇所でもIDOインターフェイスが利用できます。

find-file-ido.gif

idoの設定

.emacsファイル(~/.emacs.d/init.el)に以下のように記述します。デフォルトでは前方一致で利用するので、(setq ido-enable-flex-matching t)で曖昧一致で絞り込みができるようになって便利です。

init.el
(ido-mode 1)
(ido-everywhere 1)

(setq ido-enable-flex-matching t) ;; 中間/あいまい一致

idoを強化する

smex

smexはIDOのインターフェイスを利用してM-xを再定義してくれるパッケージです。M-x package-install smexでインストールできます。

init.el
(global-set-key (kbd "M-x") 'smex)
(global-set-key (kbd "M-X") 'smex-major-mode-commands)

ido-ubiquitous

ido-ubiquitousは標準設定以上のあらゆる箇所でidoが有効化されるように強化するパッケージです。M-x package-install ido-uniquitousでインストールできます。

init.el
(ido-ubiquitous-mode 1)

ido-vertical-mode

ido-vertical-modeはIDOの候補を縦に並べるためのパッケージです。デフォルトのIDOが要素を横に並べるのが見にくければ、これで縦に並べることができます。

init.el
(ido-vertical-mode 1)

Ivy/Counsel

Ivyは補完/絞り込み用のインターフェイスで、CounselはそれをベースにしたEmacsコマンドのラッパーです。キーボード入力で絞り込みできるのみならず、カーソル移動( またはC-n C-p)で要素を選択することもできます。

Ivy/Counselの大本のSwiperはバッファ内を絞り込み検索するための機能です。(swiper.el : 一覧付き正規表現isearch!C-u C-sを置き換えろなど参照)

find-file-counsel.gif

設定

M-x package-install counselでインストールできます。(依存関係でSwiperとIvyもインストールされます)

init.el
(ivy-mode 1) ;; デフォルトの入力補完がivyになる
(counsel-mode 1)
;; M-x, C-x C-fなどのEmacsの基本的な組み込みコマンドをivy版にリマップする

;;; 下記は任意で有効化
(global-set-key "\C-s" 'swiper)
(global-set-key (kbd "C-c C-r") 'ivy-resume)
(global-set-key (kbd "<f6>") 'ivy-resume)
(global-set-key (kbd "<f2> u") 'counsel-unicode-char)
(global-set-key (kbd "C-c g") 'counsel-git)
(global-set-key (kbd "C-c j") 'counsel-git-grep)
(global-set-key (kbd "C-c k") 'counsel-ag)
(global-set-key (kbd "C-x l") 'counsel-locate)
(global-set-key (kbd "C-S-o") 'counsel-rhythmbox)

;; これらは counsel-mode で自動で設定されるため、明示的に設定しなくてよい
;;(global-set-key (kbd "M-x") 'counsel-M-x)
;;(global-set-key (kbd "C-x C-f") 'counsel-find-file)
;;(global-set-key (kbd "<f1> f") 'counsel-describe-function)
;;(global-set-key (kbd "<f1> v") 'counsel-describe-variable)
;;(global-set-key (kbd "<f1> l") 'counsel-load-library)
;;(global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
;;(define-key read-expression-map (kbd "C-r") 'counsel-expression-history)

Helm

Helmはさまざまな情報源から絞り込むインターフェイスを提供するフレームワークです。Ivy/Counselと同じく、カーソル移動( またはC-n C-p)で要素を選択することもできます。

また、Helmによるファイル選択には、単にファイルを選ぶだけではない「アクション」と呼ばれる概念があります。詳細な紹介はAnythingメンテナー@rubikitchさんの#11 Emacs に革命を起こすパッケージ「helm」 (Software Design 2015年3月号掲載記事)をお読みください。

find-file-helm.gif

設定

M-x package-install helmでインストールできます。

(require 'helm-config)
(helm-mode t)
(global-set-key (kbd "M-x") 'helm-M-x)

Anything

Anythingはさまざまな情報源から絞り込むインターフェイスを提供するフレームワークです。Ivy/Counselと同じく、カーソル移動( またはC-n C-p)で要素を選択することもできます。

HelmはAnythingから派生したプロジェクトですが、オリジナルのAnythingは別プロジェクトとして維持されてます。

find-file-anything.gif

設定

M-x package-install anythingでインストールできます。

設定についてはもう初心者なんて言わせない、Anything で始まる Emacs 道。 - 日々、とんは語る。Anything の設定ことはじめ。 - 日々、とんは語る。などを参照してください。

あとがき

なぜ補完インターフェイスが必要なのか?

筆者は比較的最近までEmacsがとても苦手でした。設定したコマンドのキーバインドやM-xに前方一致で入力はコマンド名を丸暗記しないと使ひものにならないと思ってたので、英語が苦手なのも相俟ってかなりつらいものでした。

ところで、Sublime TextやAtom、Visual Studio Codeなどの最近のエディタには「コマンドパレット」と呼ばれる機能があります。これはキーボードショートカットを覚えなくても機能を検索して呼び出せるスグレモノです。

Atom command pallet
Visual Studio Code command pallet

さて、デフォルトのM-xを補完インターフェイスで拡張したhelm-M-xcounsel-M-xのようなコマンドを利用すればコマンド名を丸暗記して前方一致検索しなくても、うろおぼえで適当に入力すればコマンドが起動できるようになってべんりです。また、語順を気にしなくても良いので私のようにものおぼえが悪くてもあんしんです。

Emacs helm-smex

別の選択肢 (Spacemacs)

Emacsのオススメ設定みたいなのをまとめたパッケージはいろいろあるんですが、最近はSpacemacsってパッケージが好評を博してるようで「デフォルトがVimキーバインド」(Emacsキーバインドに設定可能)と書くとギャグにしか見えないのですが、GitHubでStarが9000個以上ついて居り世界中に多数の利用者、これからEmacsに触れるひとはこちらもを使ってみるのも良いのでは。

詳しくはVimも秘伝のタレも飲み込むEmacsの超強力ディストリビューションSpacemacsまとめとかspacemacsについて 〜spacemacsが最強で最高で神エディタであると思い始めた件〜あたりを参照のこと。

結局どれがオススメなの?

これから入れるならIvy/Counselが癖が少なくておすすめ、外部パッケージとか入れるのが面倒ならIDOも良いんじゃないかな、みたいな意見です。筆者はHelmとhelm-smexを使ってます(ivy-smexもあるようです)。AnythingはHelmに派生しましたが、Anythingに慣れてるなら別の補完インターフェイスに以降するメリットもさして多くはないです。

tadsan
僕に警備する自宅をください。Emacs初心者。Rubyist。 全ての投稿された記事は別段の表記がない限りはCC 3.0 BY-SA https://creativecommons.org/licenses/by-sa/3.0/deed.ja で二次利用できます。 記事中に含まれる全てのコードスニペットの著作権は抛棄するので、煮るなり焼くなりお好きにどうぞ。
https://tadsan.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away