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でぜひ味わってみてください。