В 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"))
Если пройдет достаточно времени, я возьму это, создам ответ и приму его, чтобы другие, кто нашел этот вопрос, могли легко найти / использовать его.