読者です 読者をやめる 読者になる 読者になる

evilがあるのでemacsつこてください

vim advent calendarの110日目を大幅に遅刻し申し訳ありません。
さらに申し訳ないことにvimではなくemacsの話です。

evilというemacs lisp packageを皆さんご存知でしょうか。
evilはvip.elから連なるvi(m)の操作性をエミュレートするelispの最新進化型です。
vip, viper, vimpulse ときてevilです。
名前がかっこいいですね。

evilの何がいいのか

emacsがmodal(vimのhjkl移動ができたりする)になります。
またevilはvi(m)の操作性をエミュレートしつつもemacsの機能とうまく共存 できるようになっています。
これを

  • 両方おいしいとこどりですばらしいと思うか
  • 中途半端と思うか

は別れるところでしょう。
ですがとりあえず

どちらにも一度試してみてもらいたいです。

modalなemacs

evilはvimの機能のエミュレートをその主目的としているわけではなく emacsが持つ本来の機能との親和性に重きを置いているようです。
下記は私の設定の一部です。

(evil-mode 1) 
(define-key evil-normal-state-map " " 'dired-jump)
(define-key evil-normal-state-map ";" 'evil-ex)
(define-key evil-normal-state-map "\C-n" 'helm-mini)
(define-key evil-insert-state-map "\C-h" 'delete-backward-char)
(define-key evil-insert-state-map "\C-j" 'tcode-activate-input-method)
(define-key evil-insert-state-map "\C-l" 'evil-normal-state)
(define-key evil-insert-state-map "\C-k" 'tcode-inactivate-input-method-recenter)
  • define-key evil-normal-state-map は vim での nnoremap に
  • define-key evil-insert-state-map は vim での inoremap に
  • 最後がemacsのコマンドに

対応していると考えてください。
normal-stateのようにmodeでなくstateという語を使っているのは emacsには元々メジャーモード、マイナーモードという概念があり、この用途で既に用いられているためかと思います。
normal, insert, motion, visual, operatorといったstateに加え

(evil-ex-define-cmd "on[ly]" 'delete-other-windows)

のようにvimのexコマンド的にemacsのコマンドを呼ぶことも可能です。

私は vim-likeなmodalなemacs + emacsのコマンドの組み合わせ を非常に便利と思っています。

emacsのコマンドはemacs lisp名前空間がフラットなため、必ず名前の先頭にプレフィックスが付いています。
このため、vimと異なり用いたい(emacsの)コマンドを適当なキーワードですぐに見つけることができます。
機能が見つけられれば前述のようにそれを適当なmode(state)に割り当てます。 modalになることでキーバインドにマップできるコマンド数が増えるだけでなく、キー押下の負担も軽減されます。

「mode(state)概念の導入と、emacsの機能(コマンド)の共存」
これをevilでぜひ味わってみてください。