Evil 有効下で paredit-forward/backward をちゃんと動くようにする
背景
Emacs でS式を書く時には ParEdit がとても便利ですが、Evil と併用すると paredit-forward
と paredit-backward
が上手く動いてくれません。カッコとカーソルとの相対的な位置関係が素の Emacs と Evil で異なるためですが、これを気にしながら Lisp を書くのは無駄に疲れるので挙動を修正します。
既に evil-paredit.el は存在していますが、paredit-forward
と paredit-backward
に関しては考慮されていないようです(たぶん)。
コード
;; Evil compatibility fix
(defun evil-end-of-line-p ()
(let ((offset (if (evil-emacs-state-p)
0
1)))
(eq (- (line-end-position) offset) (point))))
(defun evil-paredit-forward (origfun arg)
(funcall origfun)
(unless (evil-emacs-state-p)
(backward-char)))
(defun evil-paredit-backward (origfun arg)
(if (evil-end-of-line-p)
(forward-line)
(forward-char))
(funcall origfun))
(advice-add 'paredit-forward :around #'evil-paredit-forward)
(advice-add 'paredit-backward :around #'evil-paredit-backward)
やっていること
;; Evil compatibility fix
(defun evil-end-of-line-p ()
(let ((offset (if (evil-emacs-state-p)
0
1)))
(eq (- (line-end-position) offset) (point))))
(defun evil-paredit-forward (origfun arg)
(funcall origfun)
(unless (evil-emacs-state-p)
(backward-char)))
(defun evil-paredit-backward (origfun arg)
(if (evil-end-of-line-p)
(forward-line)
(forward-char))
(funcall origfun))
(advice-add 'paredit-forward :around #'evil-paredit-forward)
(advice-add 'paredit-backward :around #'evil-paredit-backward)
基本的にはparedit-forward
した後に1文字戻り、paredit-backward
する前に1文字進むようにするだけです。ただし、Evil の Normal State でカーソルが行末にある時に1文字進もうとするとエラーが出てしまうので、行末かどうかを判定してから、行末であれば次行の先頭に、そうでなければ次の文字にカーソルを移動させるようにしています。
Author And Source
この問題について(Evil 有効下で paredit-forward/backward をちゃんと動くようにする), 我々は、より多くの情報をここで見つけました https://qiita.com/uKLEina/items/b7bdc02fa4874adede85著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .