Как автоматически создавать аккуратные блоки комментариев C при наборе текста?


17

Некоторые редакторы кода, такие как eclipse, автоматически формируют аккуратные блоки, когда вы начинаете вводить многострочный комментарий:

введите описание изображения здесь

Есть ли какой-нибудь пакет или другой способ сделать это в emacs?

Изменить: чтобы уточнить: я не хочу комбинацию клавиш, которая вставляет блок комментария. Я хочу, чтобы блок комментариев создавался автоматически при нажатии RETпосле /*.


Вы проверяли этот похожий вопрос? stackoverflow.com/a/6578421/4780877
Пользователь Emacs

@ EmacsUser: Да. Но это не то, что я хочу. Я не хочу, чтобы просто фрагмент или функция комментировали уже написанную область.
Гейер

Смотрите руководство для нескольких строк комментариев .
Дан

@Dan: Это довольно близко, но он автоматически не вставляет закрытие*/
Geier

2
@ Имя *Знаки не обязательны, но приятно иметь.
Гейер

Ответы:


7

Приведенный ниже код отлично работает из моего краткого тестирования в c-modeбуфере:

  • После ввода /*нажмите M-j, привязка по умолчанию для indent-new-comment-line(и привязка по умолчанию для c-indent-new-comment-linein c-mode). Если это первая строка комментария, закрывающие закрывающие символы */будут вставлены автоматически.
  • Ударьте M-jбольше раз, вставьте больше строк комментария с *префиксом. Это встроенное поведение функций c-indent-new-comment-line/ indent-new-comment-line. Ознакомьтесь с документацией « Несколько строк комментариев» .
  • Дополнительный слепок в приведенном ниже коде гарантирует, что между *каждой строкой комментария и комментарием есть хотя бы один пробел .
(defun my-prettify-c-block-comment (orig-fun &rest args)
  (let* ((first-comment-line (looking-back "/\\*\\s-*.*"))
         (star-col-num (when first-comment-line
                         (save-excursion
                           (re-search-backward "/\\*")
                           (1+ (current-column))))))
    (apply orig-fun args)
    (when first-comment-line
      (save-excursion
        (newline)
        (dotimes (cnt star-col-num)
          (insert " "))
        (move-to-column star-col-num)
        (insert "*/"))
      (move-to-column star-col-num) ; comment this line if using bsd style
      (insert "*") ; comment this line if using bsd style
     ))
  ;; Ensure one space between the asterisk and the comment
  (when (not (looking-back " "))
    (insert " ")))
(advice-add 'c-indent-new-comment-line :around #'my-prettify-c-block-comment)
;; (advice-remove 'c-indent-new-comment-line #'my-prettify-c-block-comment)

Например, после оценки приведенного выше кода, я получаю ниже на типизации: /* M-j First comment line M-j Second comment line. ▮ указывает местоположение курсора в конце ввода.

/*
 * First comment line
 * Second comment line▮
 */ 

Тестирование смещения комментария блока.

С курсором после запятой, набрав: /* M-j Test offset commentдает ниже. ▮ указывает местоположение курсора в конце ввода.

#include<stdio.h>
main() {
  printf("Hello World"); /*
                          * Test offset comment▮  
                          */                                 
}

Благодарность! Это работает, но если у меня есть (setq c-default-style "bsd" c-basic-offset 4)в моем init.el, это происходит: i.imgur.com/KMLx6Ll.gif Есть идеи?
Гейер

1
Удаление (move-to-column star-col-num) (insert "*")из вышеупомянутого решения исправит это для вас. Я не пишу код на C, поэтому я не исследовал, какие переменные задаются "bsd"стилем.
Каушал Моди

Используя этот код с режимом Dafny из github.com/boogie-org/boogie-friends , я получаю `/ *` для каждой новой строки, а не `*`.
JAB
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.