Автоматическое расширение блоков комментариев в Emacs - PullRequest
7 голосов
/ 17 января 2011

Мне нравится, чтобы любой комментарий появлялся в отдельной строке.Я не люблю размещать комментарии в той же строке, что и код.На некоторых языках вы можете написать блок комментариев, например:

/**
 * I am a comment block. This comment block will be automatically expanded by the
 * IDE such that it can contain all of the text in this block.
**/

Мне это нравится.Мне нравится, как блок комментариев продолжает получать больше строк, когда я добавляю в него больше текста.Мне нравится, как если я вставлю текст в какую-то произвольную точку в блоке, последующий текст будет перемещен вниз, чтобы текст не выходил за определенную точку справа.Я использую Python.Python не имеет многострочного блочного комментария.Я думаю, самое близкое, что вы могли бы получить:

# I am a comment block.  This comment block will NOT be automatically expanded by
# the IDE, because it does not recognize these two comment lines as being joined.

Я также использую emacs.Мне просто интересно, есть ли у кого-нибудь какое-нибудь умное решение, чтобы они могли открыть блок комментариев и просто начать печатать.Не беспокойтесь о необходимости нажать клавишу возврата, чтобы перейти к следующей строке, когда ширина строки комментария слишком велика.Нет необходимости перетасовывать комментарий в целом, когда вы хотите вставить его в блок комментария.Любые идеи?

Резюме: Я ищу способ сделать многострочные непрерывные комментарии (для Python) в emacs, без необходимости вручную форматировать текст в самом блоке комментариев.

Спасибо

Ответы [ 2 ]

4 голосов
/ 17 января 2011

auto-fill-mode, кажется, делает то, что вы хотите. Когда длина строки превышает значение fill-column, она разбивает строку и вставляет новую строку комментария.

Это не полностью автоматически, хотя, если текст вставлен между ними, вам придется нажать M-q для повторного заполнения.

[Редактировать: вот способ умничать команду "пробел". Каждый раз, когда вы нажимаете SPC , ваш блок комментариев будет пополняться:

(defun refill-when-in-comment ()
  (interactive)
  (let ((curr-face (get-char-property (point) 'face)))
    (if (member "comment" (split-string (prin1-to-string curr-face) "-"))
        (fill-paragraph t)
      )
    )
  )

(defun smart-space (arg)
  (interactive "P")
  (refill-when-in-comment)
  (self-insert-command (prefix-numeric-value arg))
  )

(global-set-key " " 'smart-space)

Это работает для вас?

2 голосов
/ 17 января 2011

Это немного неортодоксально, но вы не ограничены использованием строк в качестве комментариев только для строк документации.Единственная магическая часть использования их в качестве первого элемента - это то, что они будут назначены методу __doc__ объектов.Хотя они могут использоваться где угодно и не влияют на эффективность вообще

>>> import dis
>>> def test():
...     """This is a standard doc string"""
...     a = 3  # This will get compiled
...     """This is a non standard doc string and will not get compiled"""
... 
>>> dis.dis(test)
  3           0 LOAD_CONST               1 (3)
              3 STORE_FAST               0 (a)

  4           6 LOAD_CONST               2 (None)
              9 RETURN_VALUE

Вы можете видеть, что сгенерированный код не ссылается ни на одну из двух строк.упомяните об этом только потому, что строки документации, кажется, имеют все функции, которые вы запрашиваете.Это несколько нестандартно, хотя лично я не вижу в этом проблемы.Многострочные комментарии были бы хороши.

...