コードコメント用の全自動のフィルパラグラフモードはありますか?


18

入力中に常に段落を埋めるマイナーモードを探しています(aggressive-indent-modeインデントの場合と同様)。また、コメント(および場合によっては言語に応じた文字列)のみを埋めるのに十分なスマートである必要があります。

私が試したいくつかのことは次のとおりです。

  • auto-fill-mode 新しい段落を入力している間は自動的に塗りつぶされますが、段落を編集するときは補充されません。

  • refill-mode 常に段落を補充しますが、コメントだけでなく段落にもコードをラップしようとします。

  • fill-paragraphafter-change-functionsフックに追加しようとしましたが、元に戻すと他の多くのことを台無しにします(これはおそらくすべて修正可能ですが、いくつかの努力が必要です)。

より良いアイデアはありますか?


6
余談:Glicksteinの執筆GNU Emacs拡張機能第7章では、目的の機能をどのように実装するかについて説明します。elispで学習/練習する絶好の機会になるかもしれません。
ダン

でauto-fill-paragraph(auto-fillが有効になっている)を探してorg-modeいますが、rebox2を
1

回答:


4

この機能を実装する最小限の方法を思いつきました(fill-paragraph)

(defun fill-then-insert-space ()
  (interactive)
  (fill-paragraph)
  (insert " "))
(global-set-key (kbd "SPC") #'fill-then-insert-space)

これまでに偶然見つけたいくつかの注意事項があります。

  1. elisp-mode(おそらく他の人)を呼び出すとfill-paragraph、いくつかの派手なコードを入力します。ポイントがコメントまたはdocstringにあるかどうかをテストすることでおそらく修正できますが、その方法はわかりません。

  2. 複数のスペースを簡単に入力できない場合があります(fill-paragraph末尾のスペースが削除されるため)。スペースバーは現在just-one-space、そのバインディングをに置き換えても問題ないように動作するためです(insert " ")

この機能を含むマイナーモードを作成しました。これはgithubまたはmelpaパッケージで利用できますaggressive-fill-paragraph


皮肉なことに、かなり無駄になるaggressive-fill-paragraphまで攻撃的でrefill-modeはありません(> リフィルモードの再配置なしでは誰かを引用することさえできません:置換に正規表現を使用しても)
Hi-Angel

1

あなたはどのようにリフィルモードの振る舞いを好きなら(私はそうではない:p)のではなく、とき、それは動作しますあなたが適切な条件でないならいつでも、それを阻害することにより、比較的容易に修正するべきです

例えば

(defvar plop/refill-enabler-function nil)

(defun plop/region-in-comment (beg end)
  ;; should really be comment-only-p, but that seems really broken for me
  (not
   (loop for c from beg to end
      if (not (eq 'font-lock-comment-face (get-char-property c 'face)))
      return t)))

(defun plop/refill-after-change-function (beg end len)
  (unless undo-in-progress
    (when (and plop/refill-enabler-function
               (funcall plop/refill-enabler-function beg end))
      (setq refill-doit end))))

(defun plop/install-refill-hack ()
  (if refill-mode
      (progn
        (add-hook 'after-change-functions 'plop/refill-after-change-function nil t)
        (remove-hook 'after-change-functions 'refill-after-change-function t))
    (progn
      (remove-hook 'after-change-functions 'plop/refill-after-change-function t))))

(defun plop/refill-hook ()
  (set (make-local-variable 'plop/refill-enabler-function)
       #'plop/region-in-comment)
  (add-hook 'refill-mode-hook 'plop/install-refill-hack t t)
  (refill-mode))

(add-hook 'some-hook 'plop/refill-hook)

基本的に、リフィルをトリガーする関数を削除し、after-change-functionsまったく同じことを行う前にコメント内にあることを確認する関数に置き換えます。


良いスタートのように見えますが、それでもまだ正しくありません。コメントの編集中にリフィルがトリガーされると、周囲のコードを含む段落全体がリフィルされます。これは、段落の制限を適切に定義しないための周囲のモードのせいかもしれませんが、私はそれを疑います:Emacs Lispモードで試しました。
ジル 'SO-悪であるのをやめる'

私は好きではないと述べた理由も、それはだrefill-mode問題はということです:) refill-mode用途fill-regionの代わりにはfill-paragraph、このように名誉に能力を失うfill-paragraph-functionと、物事が潜在的に厄介な作り
シグマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.