Gibt es einen vollautomatischen Absatzfüllmodus für Codekommentare?

18

Ich suche einen Nebenmodus, um die Absätze während der Eingabe immer gefüllt zu halten (ähnlich aggressive-indent-modewie beim Einrücken). Es muss auch klug genug sein, um nur Kommentare (und möglicherweise Zeichenfolgen, die von der Sprache abhängen) auszufüllen.

Einige Dinge, die ich ausprobiert habe, sind:

  • auto-fill-mode Wird automatisch ausgefüllt, während Sie neue Absätze eingeben, wird jedoch beim Bearbeiten von Absätzen nicht wieder aufgefüllt.

  • refill-mode füllt Absätze ständig nach, versucht aber, Code in Absätze und Kommentare zu packen.

  • Ich habe versucht fill-paragraph, den after-change-functionsHaken zu ergänzen, aber es macht das Aufheben und viele andere Dinge kaputt (dies ist wahrscheinlich alles reparabel, würde aber einige Mühe kosten).

Irgendwelche besseren Ideen?

dshepherd
quelle
6
Nebenbei: In Kapitel 7 von Glicksteins Writing GNU Emacs Extensions erfahren Sie, wie Sie die gewünschten Funktionen implementieren können. Könnte eine großartige Gelegenheit sein, mit elisp zu lernen / zu üben.
Dan
Ich schaue nach dem Auto-Fill-Absatz (mit aktiviertem Auto-Fill) org-mode, aber Sie können versuchen, rebox2
CodyChan

Antworten:

4

Ich hatte eine minimale Möglichkeit, diese Funktionalität zu implementieren: Binden Sie einfach die Leertaste, um auch aufzurufen (fill-paragraph)!

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

Es gibt ein paar Vorbehalte, über die ich bisher gestolpert bin:

  1. elisp-mode(möglicherweise andere) füllt sich mit ausgefallenem Code, wenn Sie anrufen fill-paragraph. Dies kann sein oder nicht, was Sie wollen. Kann wahrscheinlich behoben werden, indem getestet wird, ob der Punkt in einem Kommentar oder einer Dokumentationszeichenfolge enthalten ist, aber ich bin mir nicht sicher, wie ich das machen soll.

  2. Sie können manchmal nicht einfach mehrere Leerzeichen eingeben (da die fill-paragraphnachfolgenden Leerzeichen gelöscht werden). Da die Leertaste jetzt so aussieht, als wäre just-one-spacees wahrscheinlich in Ordnung, diese Bindung durch zu ersetzen (insert " ").

Ich habe einen Minor-Modus mit dieser Funktionalität erstellt, der auf github oder im melpa-Paket verfügbar ist aggressive-fill-paragraph.

dshepherd
quelle
Ich finde es ironisch, dass aggressive-fill-paragraphes weitaus weniger aggressiv ist als refill-mode, was aggressiv ist, bis es ziemlich nutzlos ist (da man nicht einmal jemanden zitieren kann, der keine > Neuordnung im Nachfüllmodus vornimmt: selbst wenn man Regexps als Ersatz verwendet) .
Hallo-Engel
1

Wenn Sie möchten, wie sich der Nachfüllmodus verhält (I don't: p), aber nicht, wenn er sich verhält, sollte es relativ einfach sein, ihn zu deaktivieren, wenn Sie nicht unter den richtigen Bedingungen sind

Beispielsweise

(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)

Im Grunde genommen wird die Funktion entfernt, die das Nachfüllen auslöst, after-change-functionsund durch eine ersetzt, die zusätzlich prüft, ob ein Kommentar vorliegt, bevor genau dasselbe ausgeführt wird.

Sigma
quelle
Sieht nach einem guten Start aus, ist aber immer noch nicht ganz richtig: Wenn beim Bearbeiten eines Kommentars eine Auffüllung ausgelöst wird, wird der gesamte Absatz einschließlich des umgebenden Codes aufgefüllt. Dies mag an dem umgebenden Modus liegen, der Absatzgrenzen nicht richtig definiert, aber ich bezweifle es: Ich habe es im Emacs-Lisp-Modus versucht, von dem ich annehme, dass er die Dinge nach dem Buch macht.
Gilles 'SO- hör auf, böse zu sein'
Nun, das ist , warum ich sagte , ich mag sie nicht refill-mode:) Das Problem , das ist refill-modeVerwendung fill-regionstatt fill-paragraph, wodurch die Fähigkeit zur Ehre zu verlieren fill-paragraph-functionund Dinge potentiell chaotisch
Sigma