7

В vim я переназначил > и < в визуальном режиме на >gv и <gv соответственно, вот так:

vnoremap > >gv
vnoremap < <gv

Поскольку моей целью в этом вопросе являются люди, имеющие опыт работы с emacs, а не vim, то что > и < do это визуально выделенный текст отступ / отступ. Что делает gv - это повторно выбирает ранее выбранный текст. Эти карты вызывают > и < для отступа / отступа, а затем повторно выбирают ранее выбранный текст.

Я пробую Emacs в режиме зла, и я хотел бы сделать то же самое, но у меня возникли некоторые трудности с выяснением, как именно выполнить автоматический повторный выбор.

Похоже, мне нужно как-то последовательно вызывать evil-shift-right и evil-visual-restore , но я не знаю, как создать карту, которая будет выполнять оба этих действия, поэтому я попытался создать свою собственную функцию, которая вызывала бы и последовательно, и отобразите это вместо этого, но это не сработало, возможно, из-за того, что оба они определены не как функции с defun а как операторы с evil-define-operator .

Я попытался создать свои собственные операторы:

(evil-define-operator shift-left-reselect (beg end)
    (evil-shift-left beg end)
    (evil-visual-restore))

(evil-define-operator shift-right-reselect (beg end)
    (evil-shift-right beg end)
    (evil-visual-restore))

но это не восстанавливает визуальное, как ожидалось. Удар в темноте дал мне это:

(evil-define-operator shift-left-reselect (beg end)
    (evil-shift-left beg end)
    ('evil-visual-restore))

(evil-define-operator shift-right-reselect (beg end)
    (evil-shift-right beg end)
    ('evil-visual-restore))

но это выбирает одну дополнительную строку всякий раз, когда она должна повторно выбрать.

На данный момент я использую следующее, которое имеет проблему только при повторном выборе дополнительной строки в операторе < .

(evil-define-operator shift-right-reselect (beg end)
  (evil-shift-right beg end)
  (evil-visual-make-selection beg end))

(evil-define-operator shift-left-reselect (beg end)
  (evil-shift-left beg end)
  (evil-visual-make-selection beg end))

и я сопоставил их:

(define-key evil-visual-state-map ">" 'shift-right-reselect)
(define-key evil-visual-state-map "<" 'shift-left-reselect)

любая помощь / указатели / советы будут с благодарностью.

Заранее спасибо.

редактировать:

Я хотел бы иметь возможность по существу сделать это:

(define-key evil-visual-state-map ">" (kbd ">gv"))
(define-key evil-visual-state-map "<" (kbd "<gv"))

Но поскольку нет концепции отображения по умолчанию для > или < идея рекурсивного отображения не имеет никакого смысла, и в этом есть все проблемы, которые вы ожидаете от такой карты. Следующее работает, однако, но это некрасиво, поскольку требует добавления двух одноразовых карт. Есть ли способ избежать этого?

(define-key evil-visual-state-map "g>" 'evil-shift-right)
(define-key evil-visual-state-map "g<" 'evil-shift-left)
(define-key evil-visual-state-map ">" (kbd "g>gv"))
(define-key evil-visual-state-map "<" (kbd "g<gv"))

Если пройдет достаточно времени, я возьму это, создам ответ и приму его, чтобы другие, кто нашел этот вопрос, могли легко найти / использовать его.

2 ответа2

4

Команде evil-shift-right требуется начальный и конечный аргументы с требованием, чтобы начальный аргумент был меньше, чем конечный аргумент. Одним из способов достижения этого является следующее:

(define-key evil-visual-state-map ">" (lambda ()
    (interactive)
    ; ensure mark is less than point
    (when (> (mark) (point)) 
        (exchange-point-and-mark)
    )
    (evil-normal-state)
    (evil-shift-right (mark) (point))
    (evil-visual-restore) ; re-select last visual-mode selection
))

(define-key evil-visual-state-map "<" (lambda ()
    (interactive)
    ; ensure mark is less than point
    (when (> (mark) (point)) 
        (exchange-point-and-mark)
    )
    (evil-normal-state)
    (evil-shift-left (mark) (point))
    (evil-visual-restore) ; re-select last visual-mode selection
))
2

Я закончил тем, что использовал следующее:

(define-key evil-visual-state-map (kbd "<") (lambda ()
  (interactive)
  (evil-shift-left (region-beginning) (region-end))
  (evil-normal-state)
  (evil-visual-restore)))
(define-key evil-visual-state-map (kbd ">") (lambda ()
  (interactive)
  (evil-shift-right (region-beginning) (region-end))
  (evil-normal-state)
  (evil-visual-restore)))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .