请问 evil-mode 中如何将 "y" 绑定为 "ygv<esc>" 呢?

或者,有没有 yank 后不移动光标的办法?

谢谢

没看懂你想干嘛。你确定你说的是y?

我觉得他的意思是让evil在按y复制之后不会取消对选区的选定,或者复制之后让光标保持在之前的位置(默认复制之后光标会跳到选区开头的吧)。其实我也想知道该怎么做_(:зゝ∠)_

Spacemacs 里面定义了一个 evil-map 宏:

    (evil-map visual "y" "ygv")

可以通过这种方式来做到。

evil-map的定义如下:

    (defmacro evil-map (state key seq)
        "Map for a given STATE a KEY to a sequence SEQ of keys.
Can handle recursive definition only if KEY is the first key of SEQ.
Example: (evil-map visual \"<\" \"<gv\")"
        (let ((map (intern (format "evil-%S-state-map" state))))
          `(define-key ,map ,key
             (lambda ()
               (interactive)
               ,(if (string-equal key (substring seq 0 1))
                    `(progn
                       (call-interactively ',(lookup-key evil-normal-state-map key))
                       (execute-kbd-macro ,(substring seq 1)))
                  (execute-kbd-macro ,seq))))))
1 个赞

忘记你还有一个 esc,

可以使用下面的设置:

(defun my-evil-yank ()
  (interactive)
  (save-excursion
    (call-interactively 'evil-yank)))

(define-key evil-visual-state-map (kbd "y") 'my-evil-yank)

刚刚在 vim 下面也试了一下,光标的位置差了一个字符, my-evil-yank 可以修改成:

    (defun my-evil-yank ()
      (interactive)
      (save-excursion
        (call-interactively 'evil-yank))
      (backward-char))

注:添加了一个 backward-char 的调用,不知道是我这边设置的原因还是其它。总之,如果大家有发现 cursor 的位置不正确,可以自行调整。

2 个赞

Work like a charm!

学到了,非常感谢

原来是在visual mode下啊。。我想了半天