Як автоматично створювати акуратні блоки блоків коментарів під час введення тексту?


17

Деякі редактори коду, такі як eclipse, автоматично формують акуратні блоки, коли ви починаєте вводити багаторядковий коментар:

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

Чи є якийсь пакет чи інший спосіб зробити це також у emacs?

Редагувати: Для уточнення: я не хочу комбінацію клавіш, яка вставляє блок коментарів. Я хочу, щоб блок коментарів був автоматично створений, коли натискаю RETпісля /*.


Ви перевіряли це подібне питання? stackoverflow.com/a/6578421/4780877
Користувач Emacs

@EmacsUser: Так. Але це не те, що я хочу. Я не хочу просто фрагмент або функцію, щоб коментувати вже написаний регіон.
Геєр

Дивіться посібник для кількох рядків коментарів .
Дан

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

2
@Name *Знаки не обов'язково, але приємно мати.
Геєр

Відповіді:


7

Наведений нижче код добре працює з мого короткого тестування в c-modeбуфері:

  • Після введення /*, натисніть M-j, прив'язка за замовчуванням для indent-new-comment-line(та прив'язка за замовчуванням для c-indent-new-comment-lineв 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.