Попытка автоматически найти лучший отступ для emacs - PullRequest
2 голосов
/ 03 февраля 2011

Я считаю, что самостоятельно исправляю отступ слишком часто, поэтому я ищу способ автоматически сделать отступ для строки в соответствии с режимом при входе или выходе из нее.В данный момент я просто оборачиваю команды next-line и previous-line с помощью indent-according-to-mode и привязываю мои Cn и Cp к новым функциям, например так:

(defun next-line-and-indent (&optional arg try-vscroll)
  "Move to the next line and indent according to mode."
  (interactive)
  (indent-according-to-mode)
  (next-line arg try-vscroll)
  (indent-according-to-mode))

(defun previous-line-and-indent (&optional arg try-vscroll)
  "Move to the previous line and indent according to mode."
  (interactive)
  (indent-according-to-mode)
  (previous-line arg try-vscroll)
  (indent-according-to-mode))

Это работает, но это грязное чувствои тому подобное, он также не будет охватывать строку, вводимую или выходящую любым способом, кроме Cn и Cp.Есть ли какой-то крючок, который я не могу найти, например enter-line и leave-line?

Ответы [ 2 ]

1 голос
/ 03 февраля 2011

Вы можете использовать pre- и post-command-hook, чтобы определить, находится ли точка на той же строке после команды, какой она была до нее?

(defun my-auto-indent-remember ()
  "Remember the current beginning and end of line."
  (setq my-auto-indent-line-beginning-position (line-beginning-position))
  (setq my-auto-indent-line-end-position (line-end-position)))

(defun my-auto-indent ()
  "Indent if we have changed lines."
  (and (boundp 'my-auto-indent-line-beginning-position)
       (boundp 'my-auto-indent-line-end-position)
       (or (< (point) my-auto-indent-line-beginning-position)
           (> (point) my-auto-indent-line-end-position))
       (indent-according-to-mode)))

(add-hook 'pre-command-hook 'my-auto-indent-remember)
(add-hook 'post-command-hook 'my-auto-indent)

Я просто не могу представить, что этохорошая идея, между прочим, но я должен был попробовать это:)

С включенным я уже испытал нежелательное повторное отступление, просто пытаясь скопировать этот код после отступа в четыре пробеладля переполнения стека.

Всякий раз, когда отступ не верен, я обнаружил, что быстрый indent-region почти всегда все исправит.

Этот код не обрабатывает бит "оставляя строку",Кстати, и я не уверен, как это будет работать после команды, если честно.Возможно, вам придется поймать заранее известные команды перемещения и сделать отступ.Вы могли бы легко проверить идею с помощью безусловного (отступ в соответствии с режимом) в my-auto-indent-запомнить, хотя.

0 голосов
/ 03 февраля 2011

Вы можете попробовать следующее:

(define-key global-map (kbd "RET") 'newline-and-indent)

Это должно переключиться на новую строку и автоматически сделать отступ в соответствии с текущими настройками отступа.

...