Braindump

evilの代替になり得るか?meowの紹介

December 16, 2021
emacs

この記事は 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-modemagit のコミットメッセージの入力バッファでは入力専用の 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)))))