Como criar automaticamente blocos de comentários em puro C durante a digitação?

17

Alguns editores de código, como o eclipse, formam automaticamente blocos simples quando você começa a digitar um comentário com várias linhas:

insira a descrição da imagem aqui

Existe algum pacote ou outra maneira de fazer isso no emacs também?

Editar: para esclarecer: não quero uma combinação de teclas que insira um bloco de comentários. Quero que um bloco de comentários seja criado automaticamente quando pressionar RETdepois /*.

Geier
fonte
Você checou essa pergunta semelhante? stackoverflow.com/a/6578421/4780877
Usuário Emacs
@EmacsUser: Sim. Mas não é isso que eu quero. Não quero apenas um trecho ou o recurso para comentar uma região já escrita.
Geier
Consulte o manual para várias linhas de comentários .
Dan
@ Dan: Isso é muito perto, mas não inserir automaticamente o fechamento*/
Geier
2
@Name Os *sinais não são estritamente necessários, mas agradáveis.
Geier

Respostas:

7

O código abaixo funciona bem no meu breve teste em um c-modebuffer:

  • Após digitar /*, pressione M-ja ligação padrão para indent-new-comment-line(e a ligação padrão para c-indent-new-comment-linein c-mode). Se for a primeira linha de comentário, os caracteres de fechamento */serão inseridos automaticamente.
  • Bater M-jmais vezes com a inserção de mais linhas de comentário com o *prefixo. Esse é o comportamento interno de c-indent-new-comment-line/ indent-new-comment-linefunções. Confira a documentação de várias linhas de comentários .
  • Uma pepita extra no código abaixo garante que haja pelo menos um espaço entre o *em cada linha de comentário e o comentário.
(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)

Por exemplo, depois de avaliar o código acima, eu recebo a seguir na digitação: /* M-j First comment line M-j Second comment line. O ▮ indica a localização do cursor no final da digitação.

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

Testando o bloco de comentários de deslocamento ..

Com o cursor após o ponto e vírgula, digitando: /* M-j Test offset commentfornece o abaixo. O ▮ indica a localização do cursor no final da digitação.

#include<stdio.h>
main() {
  printf("Hello World"); /*
                          * Test offset comment▮  
                          */                                 
}
Kaushal Modi
fonte
Obrigado! Isso funciona, mas se eu tiver (setq c-default-style "bsd" c-basic-offset 4)no meu init.el, isso acontece: i.imgur.com/KMLx6Ll.gif Alguma idéia?
Geier
1
A remoção (move-to-column star-col-num) (insert "*")da solução acima corrigirá isso para você. Como não codifico em C, não investiguei quais variáveis ​​são definidas por "bsd"estilo.
precisa saber é o seguinte
Usando esse código no modo Dafny em github.com/boogie-org/boogie-friends , recebo `/ *` para cada nova linha em vez de `*`.
JAB