evilの代替になり得るか?meowの紹介
December 16, 2021
この記事は Emacs Advent Calendar 2021 の17日目の記事です.
Emacs は小指を酷使するテキストエディタであり,Emacs ユーザーの小指は逞しくなっていることと思う.この記事ではそんな可哀そうな小指を労るパッケージである meow の概要と設定を紹介する (解説はしない).
概要 #
- meow は vi/vim に代表される modal editing を提供するパッケージ.
- modal editing とは, Normal Mode や Insert Mode のような移動や編集に特化したモードを切り替えながら編集すること.
hjkl
による移動,s
で1行カット,p
でペースト,A
で下に1行追加など,移動・編集のための1ストロークのコマンドが複数あるSPC
を prefix とするコマンドの実行が可能になっている.例えばC-x C-f
ならSPC x f
- キーバインドのテンプレートとして QWERTY やその他のキー配列に合わせたものが予め用意されている
- Emacs 由来のキーバインドと conflict しない設計になっており,
meow
使用中でも入力専用のINSERT
なら普段通り Emacs を使うこともできる- 移動や範囲選択を少し楽にしたいという用途としては手軽に導入できて良い
- 最も有名な関連パッケージとして evil があるが,それと比べて faster & simple
- god-modeも1ストロークのコマンド実行を可能にするが,
meow
はそれに加えて便利なテキスト編集機能を備える - 基本的には 1ストロークのコマンド実行専用の
NORMAL
モードと,入力専用のINSERT
モードを行き来する- 便利な編集機能は こちらで解説されている
設定 #
leaf.el での設定はこれだけ.パッケージのインストールと設定が済んだら M-x meow-tutor
を実行しよう.meow の操作に慣れるためのチュートリアルが始まる.
(leaf meow
:ensure t
:config
(defun meow-setup nil
"公式githubからキー配列に合った設定をコピペ
https://github.com/meow-edit/meow/blob/master/GET_STARTED.org#set-up-command-layout"
...)
(meow-setup)
(meow-global-mode 1))
オレオレ設定 #
参考までに私の設定を下に示す.
(leaf meow
:after consult
:ensure t
:load-path "~/.emacs.d/elisp/meow-config/"
:bind ((meow-normal-state-keymap
("C-j" . (lambda ()
(interactive)
(if skk-mode (skk-j-mode-on))
(meow-append)))))
:hook
((meow-insert-exit-hook . (lambda nil
(if skk-mode (skk-latin-mode-on))))
(eshell-mode-hook . meow-insert)
(after-change-major-mode-hook . (lambda nil
(if (and (featurep 'magit)
(magit-commit-message-buffer))
(meow-insert)))))
:config
(require 'meow-keybindings)
(meow-setup)
(meow-global-mode 1))
設定のポイント #
キーバインドの設定は邪魔なので
~/.emacs.d/elisp/meow-config/meow-keybindings.el
に移して,(meow-setup)
を呼ぶ前にrequire
している... :load-path "~/.emacs.d/elisp/meow-config/" :config (require 'meow-keybindings) (meow-setup) ...
1ストロークのコマンド実行が可能な
NORMAL
モードで,/
でconsult-line
が実行されるようにキーバインドを変更し,meow がconsult
よりも後に呼ばれるようにしている... :after consult ... (defun meow-setup () ... '("/" . my-consult-line))
eshell-mode
とmagit
のコミットメッセージの入力バッファでは入力専用のINSERT
モードに入るようにしている:hook ... (eshell-mode-hook . meow-insert) (after-change-major-mode-hook . (lambda nil (if (and (featurep 'magit) (magit-commit-message-buffer)) (meow-insert)))) ...
ddskk
の日本語モードと meow のNORMAL
モードがコンフリクトするため,INSERT
からNORMAL
に遷移する際に ddskk を latin-mode にしている... :hook (meow-insert-exit-hook . (lambda nil (if skk-mode (skk-latin-mode-on)))) ...
C-j
でいきなり日本語入力を開始できるようにしている:bind ((meow-normal-state-keymap ("C-j" . (lambda () (interactive) (if skk-mode (skk-j-mode-on)) (meow-append)))))