Заставить 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может быть удобно для многих других злых операторов.

Другие вопросы по тегам