如何在键入时自动创建整洁的C注释块?


17

当您开始输入多行注释时,某些代码编辑器(例如eclipse)会自动形成整齐的块:

在此处输入图片说明

在emacs中也有一些软件包或其他方式可以做到这一点吗?

编辑:澄清:我希望插入注释块的组合键。我希望在按RETafter 时自动创建一个注释框/*


您是否检查过类似的问题? stackoverflow.com/a/6578421/4780877
Emacs用户

@EmacsUser:是的。但这不是我想要的。我不想要片段或功能来评论已经编写的区域。
盖尔2015年

请参见手册中的多行注释

@Dan:非常接近,但不会自动插入结尾*/
-Geier

2
@Name *标志不是严格要求的,但是很高兴拥有。
盖尔2015年

Answers:


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任何想法?
Geier

1
(move-to-column star-col-num) (insert "*")从上述解决方案中删除将为您解决此问题。我没有用C语言编写代码,因此我没有研究"bsd"样式设置了哪些变量。
2015年

使用此代码与Dafny模式github.com/boogie-org/boogie-friends,我得到`/ *`每个换行,而不是`*`。
JAB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.