19

在“正常”状态下evil-mode,光标移动模拟 vim 的标准行为。我想通过以下两种方式使其更类似于标准的 emacs 行为。

  1. 我希望垂直运动发生在视线内,而不是逻辑线。即,如果一行被换行,按下j<down>应该移动到同一行的下一部分。

  2. 我希望水平移动不要停在换行符处。即如果光标在一行的末尾,按l<right>应该移动到下一行。

我怎样才能做到这一点?

4

4 回答 4

31

我找到了解决问题 2 的方法:原来有一个变量evil-cross-lines. 将其设置为t简单地解决了该问题。


连同 PythonNut 对垂直移动的修复,这里是完整的解决方案:

;; Make movement keys work like they should
(define-key evil-normal-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
(define-key evil-normal-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
(define-key evil-motion-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
(define-key evil-motion-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
; Make horizontal movement cross lines                                    
(setq-default evil-cross-lines t)
于 2014-01-03T08:20:44.573 回答
5

重映射解决方案会使“dj”之类的组合失败。下面的建议解决方案仍然保持 `dj' 的正确行为:

(defun evil-next-line--check-visual-line-mode (orig-fun &rest args)
  (if visual-line-mode
      (apply 'evil-next-visual-line args)
    (apply orig-fun args)))

(advice-add 'evil-next-line :around 'evil-next-line--check-visual-line-mode)

(defun evil-previous-line--check-visual-line-mode (orig-fun &rest args)
  (if visual-line-mode
      (apply 'evil-previous-visual-line args)
    (apply orig-fun args)))

(advice-add 'evil-previous-line :around 'evil-previous-line--check-visual-line-mode)
于 2015-09-18T20:20:15.490 回答
2

我似乎无法正确运动。C-h k lright-char

;; kill two birds with one stone using remap: arrow keys and h,j,k,l
(define-key evil-normal-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
(define-key evil-motion-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
(define-key evil-motion-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
(define-key evil-normal-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
(define-key evil-normal-state-map (kbd "<remap> <evil-backward-char>") 'left-char)
(define-key evil-motion-state-map (kbd "<remap> <evil-forward-char>") 'right-char)
(define-key evil-normal-state-map (kbd "<remap> <evil-backward-char>") 'left-char)
(define-key evil-motion-state-map (kbd "<remap> <evil-forward-char>") 'right-char)
于 2014-01-02T18:56:31.580 回答
0

2)至于第二个问题(好点),我设法做到了以下几点。我不知道如何告诉邪恶不要在行尾/行首停止,但我知道如何重新定义一些键:

(define-key evil-normal-state-map "h" 'left-char) ;;remaps evil's h to emacs' left movement

左键:

(define-key evil-normal-state-map [left] 'left-char)

但是对 emacs 做同样的事情是right-char行不通的:/我正在研究它。

ps:要查找与键关联的功能:C-h k <your key>

于 2014-01-02T14:45:14.753 回答