Как перемещаться между визуальными линиями и перемещаться мимо новой строки в режиме зла
В "нормальном" состоянии 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>