0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

meow + puniでevil-surroundっぽいことをする

Last updated at Posted at 2024-12-08

背景

こんにちは。Emacsを触り始めて4~5年くらいのEmacs初心者です。
今回はmeow+puniでevil-surroundのような機能を作成し、キーに割り当ててみるといい感じだったので記事にしました。
また、新しい試みでChatGPTで記事を生成して多少の手直しをして貼り付けてみました。

meow + puniでevil-surroundっぽいことする

Emacsを使っていて、コード編集の効率を向上させる方法として、Vimのevil-surroundを使ったことがある方も多いでしょう。本記事では、Emacs用のモーダル編集モードであるmeowと、リスト操作に特化したpuniを組み合わせて、evil-surroundに似た機能を実現する方法をご紹介します。


evil、meow、puniの簡単な解説

evil

evilは、EmacsでVimライクな操作を可能にするモードです。evil-surroundはその拡張機能の一つで、テキストの周囲に括弧やクォートなどを追加・削除する操作を簡単にします。

meow

meowは、Emacs用のモーダル編集モードで、直感的で簡単にカスタマイズ可能な操作体系を提供します。特に、キー設定が簡単で、evilよりもシンプルで軽量です。

meowの利点

  • シンプルでカスタマイズ性が高い: キーバインドの設定がわかりやすく、拡張が容易です。
  • 軽量: 必要な機能だけを絞り込んで動作させられるため、パフォーマンスが良好。
  • Emacsらしさを重視: Emacsの哲学に沿った設計で、Vimに過度に依存しません。

puni

puniは、括弧やリストを扱う際に便利なEmacsパッケージです。セックスピー(S式)を意識した操作を提供し、括弧で囲む、括弧を削除する、括弧を入れ替えるといった操作が容易です。


meow + puniでevil-surroundの機能を実装する

以下では、meowpuniを組み合わせて、文字列や括弧で囲む操作をevil-surround風に実現する設定をご紹介します。

設定例

実際の設定は下記の通りです。

(use-package puni
  :config
  (defun puni-wrap-dobule-quote (&optional n)
    (interactive "P")
    (puni-wrap-next-sexps
     (puni--parse-interactive-argument-for-wrap n)
     "\"" "\""))

  (defun puni-wrap-single-quote (&optional n)
    (interactive "P")
    (puni-wrap-next-sexps
     (puni--parse-interactive-argument-for-wrap n)
     "'" "'"))

  (defun puni-wrap-back-quote (&optional n)
    (interactive "P")
    (puni-wrap-next-sexps
     (puni--parse-interactive-argument-for-wrap n)
     "`" "`"))

  (defun puni-wrap-~ (&optional n)
    (interactive "P")
    (puni-wrap-next-sexps
     (puni--parse-interactive-argument-for-wrap n)
     "~" "~"))

  (defun puni-wrap-= (&optional n)
    (interactive "P")
    (puni-wrap-next-sexps
     (puni--parse-interactive-argument-for-wrap n)
     "=" "="))

  (defun puni-wrap-+ (&optional n)
    (interactive "P")
    (puni-wrap-next-sexps
     (puni--parse-interactive-argument-for-wrap n)
     "+" "+"))

  (defun puni-wrap-- (&optional n)
    (interactive "P")
    (puni-wrap-next-sexps
     (puni--parse-interactive-argument-for-wrap n)
     "-" "-"))

  (with-eval-after-load 'meow
    (meow-normal-define-key
     '("S {" . puni-wrap-curly)
     '("S }" . puni-wrap-curly)
     '("S [" . puni-wrap-square)
     '("S ]" . puni-wrap-square)
     '("S (" . puni-wrap-round)
     '("S )" . puni-wrap-round)
     '("S <" . puni-wrap-angle)
     '("S >" . puni-wrap-angle)
     '("S '" . puni-wrap-single-quote)
     '("S \"" . puni-wrap-dobule-quote)
     '("S `" . puni-wrap-back-quote)
     '("S ~" . puni-wrap-~)
     '("S =" . puni-wrap-=)
     '("S +" . puni-wrap-+)
     '("S -" . puni-wrap--)))

  (puni-global-mode +1))

解説

evilはキーの割当をvimに近づけるよう自動的にキーを割り当ててくれますが、meowは自分で設定する必要があります。
一から設定するとしんどいので、こちらをベースにキーを設定し、自分好みにカスタマイズしていくようになります。
meow-normal-define-keyはnormalモード中に使用するキーで今回はこの関数でsurround用のキーを割り当てます。

ちなみに私はなるべくVimに近づけるようにしています。こんな感じ
大文字のSが空いていたので、私はそこに今回のキーを割り当てました。

操作例

  1. 範囲選択
    image.png

  2. S (を入力
    image.png

  3. , rで範囲選択
    image.png

  4. S "を入力
    image.png

  5. カーソルを合わせるだけでも利用できます
    image.png

  6. S -を入力
    image.png

終わりに

記事の作成にChatGPTを利用してみましたが、手軽に記事が作成できてよかったです。
もっと良い実装方法などがあればぜひ教えていただきたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?