Как перемещаться между визуальными линиями и перемещаться мимо новой строки в режиме зла

В "нормальном" состоянии evil-mode движение курсора эмулирует стандартное поведение vim. Я хочу сделать его более похожим на стандартное поведение emacs двумя способами.

  • Я хочу, чтобы вертикальное движение происходило внутри визуальных линий, а не логических линий. То есть если строка завернута, нажатие j или <down> должно перейти к следующей части той же строки.

  • Я хочу, чтобы горизонтальное движение не останавливалось на символах новой строки. То есть если курсор находится в конце строки, нажатие l или <right> должно перейти к следующей строке.

Как я могу это достичь?

Ответы

Ответ 1

Я нашел, как решить проблему 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)

Ответ 2

Решение для переназначения приведет к сбою комбинаций "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)

Ответ 3

Я не могу заставить себя работать. C-h k l говорит right-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)

Ответ 4

2) Что касается второго вопроса (хорошая точка), мне удалось сделать следующее. Я не знаю, как сказать зло, чтобы не останавливаться на конце/начале строк, но я знаю, как переопределить некоторые ключи:

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

левая клавиша:

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

но делать то же самое с emacs 'right-char не работает:/Я смотрю на него.

ps: найти функцию, связанную с ключом: C-h k <your key>