我想要一个函数,它给出paredit-kill的end。
我想把它用作evil的text object,效果是:找到这个函数后我把evil-operator-map
按键定为L
,这样在normal-state下,我按下d L
的效果和paredit-kill
一样,y L
可以复制当前point到paredit-kill
将会kill到的point(但不会进行任何kill)。
我看了下paredit-kill
里面是cond
里各种kill
,没有能给出kill终点的函数。另外有个paredit-point-at-sexp-end
,但它只是简单用了forward-sexp
等等,只能对lisp代码使用,不如paredit-kill
智能。
kill可以直接paredit-kill
, yank可以paredit-kill
再undo,但是我希望用主楼提到的d L
y L
这样的evil风格按键来保持一致的evil体验。
想到了,先kill一下再undo-tree-undo
,计算一下kill前后buffer的总长度,测试了一下这样不支持visual-state,normal-state和operator-state都行:
(defun jjpandari/goto-kill-end (kill-fun forward?)
"When supplied with a kill function `kill-fun', go to the point the kill function kills to."
(let* ((old-max (point-max))
(new-max (progn (funcall kill-fun) (point-max)))
(kill-end (progn
(undo-tree-undo)
(funcall (if forward? '+ '-) (point) (abs (- new-max old-max))))))
(goto-char kill-end)))
(defun jjpandari/goto-end-of-sexp ()
"Go to the end of current expression."
(interactive)
(jjpandari/goto-kill-end 'paredit-kill+ t))
(defun jjpandari/goto-beginning-of-sexp ()
"Go to the end of current expression."
(interactive)
(jjpandari/goto-kill-end 'fontux/paredit-kill-backward nil))
paredit-kill+
和fontux/paredit-kill-backward
看这个帖子
另外elisp风格的变量forward?
应该叫forwardp
?但是我看p
结尾的好像都是函数,不知道变量应该怎么取名。