Подтвердить что ты не робот

Установить комментарии на том же уровне отступов, что и все формы

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

(defun example ()
  just
  some
                ; a comment
  words)

Как настроить его так, чтобы первая точка с запятой была вертикально выровнена с регулярными формами Lisp?

(defun example ()
  just
  some
  ; a comment
  words)

Что я могу узнать, так это то, что механизм по умолчанию работает, выравнивая комментарии к фиксированному столбцу (запрашиваемый через M-x comment-set-column), и что можно изменить переменную comment-indent-function (установив ее на ноль, частично исправляя мою проблему).

4b9b3361

Ответ 1

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

(defun test-single ()
                                        ; A single semicolon
  nil)

(defun test-double ()
  ;; Do two semicolons make a colon ;)
  nil)

Кроме того, три точки с запятой ;;; вообще не перефразируются. Как правило, они используются для обозначения новых основных разделов в исходном файле.

Ответ 2

Вы можете настроить функцию комментария-отступ

Вместо comment-indent-default используйте свою собственную функцию.

Написание нового, заменив в последней строке `comment-column 'на (save-excursion (forward-line -1) (текущий-отступ))

должен поставить отправную точку.

Ответ 3

Если вы удалите случай для одиночных точек с запятой из lisp-indent-line, он будет вести себя так, как вы хотите.

Я удалил его в коде ниже, вы можете добавить его в конфигурацию emacs:

(defun lisp-indent-line (&optional _whole-exp)
  "Indent current line as Lisp code.
With argument, indent any additional lines of the same expression
rigidly along with this one.
Modified to indent single semicolon comments like double semicolon comments"
  (interactive "P")
  (let ((indent (calculate-lisp-indent)) shift-amt
    (pos (- (point-max) (point)))
    (beg (progn (beginning-of-line) (point))))
    (skip-chars-forward " \t")
    (if (or (null indent) (looking-at "\\s<\\s<\\s<"))
    ;; Don't alter indentation of a ;;; comment line
    ;; or a line that starts in a string.
        ;; FIXME: inconsistency: comment-indent moves ;;; to column 0.
    (goto-char (- (point-max) pos))
      (if (listp indent) (setq indent (car indent)))
      (setq shift-amt (- indent (current-column)))
      (if (zerop shift-amt)
      nil
    (delete-region beg (point))
    (indent-to indent))
      ;; If initial point was within line indentation,
      ;; position after the indentation.  Else stay at same point in text.
      (if (> (- (point-max) pos) (point))
      (goto-char (- (point-max) pos))))))