入力中に適切なCコメントブロックを自動的に作成する方法


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-linec-mode)。それが最初のコメント行である場合、終了の終了文字*/が自動的に挿入されます。
  • 打撃M-jでより多くのコメント行挿入で複数回*の接頭辞。これはc-indent-new-comment-line/ indent-new-comment-line関数の組み込みの動作です。複数行のコメントドキュメントをご覧ください。
  • 以下のコードの余分なナゲットにより、*各コメント行とコメントの間に少なくとも1つのスペースが確保されます。
(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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.