Esiste una modalità di riempimento paragrafo completamente automatica per i commenti sul codice?


18

Sto cercando una modalità minore per mantenere sempre pieni i paragrafi durante la digitazione (simile a quello che aggressive-indent-modefa per il rientro). Deve anche essere abbastanza intelligente da riempire solo i commenti (e forse le stringhe a seconda della lingua).

Alcune cose che ho provato sono:

  • auto-fill-mode si riempie automaticamente durante la digitazione di nuovi paragrafi ma non si riempie quando si modificano i paragrafi.

  • refill-mode riempie costantemente i paragrafi ma cerca di racchiudere il codice in paragrafi e commenti.

  • Ho provato ad aggiungere fill-paragraphal after-change-functionsgancio ma rovina l'annullamento e molte altre cose (questo è probabilmente tutto risolvibile ma richiederebbe qualche sforzo).

Qualche idea migliore?


6
A parte: il capitolo 7 di Writing GNU Emacs Extensions di Glickstein spiega come implementare la funzionalità che stai cercando. Potrebbe essere una grande opportunità per imparare / esercitarsi con elisp.
Dan

Sto cercando il paragrafo di riempimento automatico (con il riempimento automatico abilitato) org-mode, ma potresti provare rebox2
CodyChan

Risposte:


4

Ho escogitato un modo minimo per implementare questa funzionalità: basta associare la barra spaziatrice per chiamare anche (fill-paragraph)!

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

Ci sono un paio di avvertimenti che mi sono imbattuto finora:

  1. elisp-mode(possibilmente altri) riempie un po 'di fantasia quando chiami fill-paragraph, questo può o meno essere quello che vuoi. Probabilmente può essere risolto testando se il punto è in un commento o docstring ma non sono sicuro di come farlo.

  2. A volte non puoi facilmente inserire più spazi (perché fill-paragraphuccide tutti gli spazi finali). Dal momento che la barra spaziatrice ora si comporta come just-one-spaceprobabilmente è ok per sostituire tale associazione con (insert " ").

Ho creato una modalità minore contenente questa funzionalità, è disponibile su github o nel pacchetto melpa aggressive-fill-paragraph.


Trovo ironico che aggressive-fill-paragraphsia molto meno aggressivo di refill-mode, che è aggressivo fino a essere piuttosto inutile (dato che non puoi nemmeno citare qualcuno con > senza riorganizzare la modalità di ricarica: anche se usi regexps per la sostituzione) .
Ciao-Angel,

1

Se ti piace come si comporta la modalità di ricarica (io no: p) ma non quando si comporta, dovrebbe essere relativamente facile da risolvere inibendola ogni volta che non sei nelle giuste condizioni

Per esempio

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

Fondamentalmente rimuove la funzione che attiva la ricarica after-change-functionse la sostituisce con una che verificherà inoltre che siamo in un commento prima di fare esattamente la stessa cosa.


Sembra un buon inizio, ma non è ancora del tutto corretto: se una modifica viene attivata durante la modifica di un commento, riempie l'intero paragrafo, incluso il codice circostante. Questo potrebbe essere colpa della modalità circostante per non aver definito correttamente i limiti di paragrafo, ma ne dubito: ho provato in modalità Emacs Lisp, che presumo faccia le cose dal libro.
Gilles 'SO- smetti di essere malvagio' il

bene, ecco perché ho detto che non mi piace refill-mode:) Il problema è che refill-modeusa fill-regioninvece di fill-paragraph, perdendo così la capacità di onorare fill-paragraph-functione rendendo le cose potenzialmente disordinate
Sigma
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.