Заставить gg=G работать в Evil-Mode для отступа всего буфера?
Я пытаюсь перейти от Vim к Emacs, используя режим зла, но не могу получить gg=G
сделать отступ для всего буфера.
gg
правильно перемещает курсор в верхнюю часть буфераG
правильно перемещает курсор в нижнюю часть буфера==
правильно выравнивает текущую строку
Однако комбинация gg=G
просто не работает, и я не могу понять, как определить это сам.
У меня есть следующая функция, определенная для отступа всего буфера:
(defun indent-whole-buffer ()
"indent whole buffer and untabify it"
(interactive)
(delete-trailing-whitespace)
(indent-region (point-min) (point-max) nil)
(untabify (point-min) (point-max)))
Однако, если я попытаюсь связать это с gg=G
как это: (define-key evil-normal-state-map "gg=G" 'indent-whole-buffer)
, затем gg
больше не работает. Я застрял. Помогите!
2 ответа
Ничего не связывая, самое простое, что нужно сделать, это ggVG=
, который 1) приведет вас к вершине буфера, 2) войдет в состояние визуальной линии, 3) приведет вас к концу буфера и 4) сделает отступ для всего, что вы только что выделили. РЕДАКТИРОВАТЬ: вы уверены, gg=G
не работает? Это дает ожидаемое поведение для меня.
Будет лучше, если вы забудете, как Vim выполняет привязки клавиш, и посмотрите, как Emacs выполняет сопоставления клавиш (см. Здесь, здесь и здесь, чтобы начать). В этом конкретном случае вы должны помнить, что у вас не может быть длинной последовательности ключей (например, gg=G
) а также более короткое подмножество (gg
) потому что вы эффективно перезаписываете более короткое подмножество (т. е. вы не можете получить gg=G
без первого входа gg
).
Например, предположим, вы написали пользовательскую функцию для отступа всего буфера:
(defun indent-buffer ()
"Apply indentation rule to the entire buffer."
(interactive)
(indent-region (point-min) (point-max)))
Затем вы можете связать его с несвязанным ключом, таким как Q
(или последовательность как gQ
или перезаписать что-нибудь еще) в карте нормального состояния как:
(define-key evil-normal-state-map "Q" 'indent-buffer)
(РЕДАКТИРОВАТЬ: о, я забыл, что вы уже написали свою функцию; извините за дублирование.)
Просто отметьте, что другим и, возможно, более естественным вариантом является использование
:motion
mark-whole-buffer
, привязка по умолчанию
C-x h
. Преимущество в том, что вам не нужно перемещать курсор.
Итак, с
= C-x h
в нормальном состоянии весь буфер имеет отступ, а положение курсора сохраняется.
Конечно, с чем-то вроде
(define-key evil-normal-state-map "Q" #'mark-whole-buffer)
мы можем избежать использования «управления», теперь
=Q
отступит весь буфер. Плюс новая обвязка
Q
может быть удобно для многих других злых операторов.