Текстовый редактор с переносом комментариев - PullRequest
5 голосов
/ 23 декабря 2009

Я обычно использую Geany или Hi-Tide в Debian (GNU / Linux) для разработки прошивки, в основном C (но также и для чтения старого ассемблера). Я документирую код, используя однострочные комментарии, и это действительно раздражает, когда я что-то перепечатываю, и приходится вручную разбивать каждую следующую строку, чтобы оставить его в поле из 80 символов.

Существует ли текстовый редактор, который может перематывать последовательные однострочные комментарии (и делать это автоматически при наборе текста)? То есть дано:

/// This is a really long line that should have been wrapped at "that" but was not.
/// This sentence is in the same
/// paragraph as the last.

... Я хочу редактор, который перенесет это в

/// This is a really long line that
/// should have been wrapped at "that"
/// but was not. This sentence is in
/// the same paragraph as the last.

... желательно делать это разумно, пока я печатаю.

Я пробовал:

  • Hi-Tide (на основе Eclipse 3.3)
  • Geany
  • jEdit
  • UniversalIndentGUI + куча преттификаторов (я не смог найти ни одного работающего форматера, и это тоже не очень хороший рабочий процесс)
  • GVim - начинается следующая строка //should have been ... вместо /// should have been ...

Обновление : просто для уточнения моего принятого ответа - я пошел с снимком Emacs и также потребовался дополнительный режим Filladapt

Ответы [ 2 ]

6 голосов
/ 04 января 2010

В Emacs, чтобы запустить автоматическое перенос, введите auto-fill-mode .Чтобы установить ширину линии, запустите Cu ⟨ столбцы ⟩ Cx f .Emacs, или действительно CC Mode, будет предвидеть вашу структуру комментариев, так что, набрав /// Это действительно длинная строка, которая будет иметь значение

/// This is a really long line that
/// shoul‸

.Абзац в любое время с помощью Mq .

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

;;; Can't advise SELF-INSERT-COMMAND, so create a wrapper procedure.
(defun self-insert-refill (n)
  (interactive "p")
  (self-insert-command n))

;;; Advise SELF-INSERT-REFILL to execute FILL-PARAGRAPH after every
;;; keypress, but *only* if we're inside a comment
(defadvice self-insert-refill (after refill-paragraph)
  (let ((face (or (get-char-property (point) 'read-face-name)
                  (get-char-property (point) 'face))) )

    (if (and (eq face 'font-lock-comment-face)
             (not (string= " " (this-command-keys))))  ; Spaces would get deleted on refill.
        (fill-paragraph))))

(ad-activate 'self-insert-refill)

(add-hook 'c-mode-hook
  ;; Remap SELF-INSERT-COMMAND to be SELF-INSERT-REFILL.
  (local-set-key [remap self-insert-command] 'self-insert-refill) ))

Это, вероятно, не очень надежно или не соответствует передовому опыту и, вероятно, не совсем удовлетворительно, так как не будет работать для общего редактирования, например, Cd и backspace , и это несколько замедляет работу редактора, но это только начало.

6 голосов
/ 23 декабря 2009

Vim наверняка может сделать это.

Во-первых, вы должны указать Vim, что "///" является префиксом комментария (по умолчанию это не так):

:set comments^=:///

Если вы хотите, чтобы перенос происходил по мере ввода текста, установите предпочитаемую ширину текста:

:set textwidth=80

Для форматирования существующих абзацев используйте любой вариант команды gq . Например, вы могли бы:

  • Выберите абзац визуально и введите g q или
  • Введите g q j для повторной переноса из текущей строки в конец абзаца
...