¿Existe un modo de llenado de párrafo completamente automático para comentarios de código?

18

Estoy buscando un modo menor para mantener los párrafos llenos en todo momento mientras escribo (similar a lo que aggressive-indent-modehace para la sangría). También debe ser lo suficientemente inteligente como para llenar solo comentarios (y tal vez cadenas dependiendo del idioma).

Algunas cosas que he probado son:

  • auto-fill-mode se llena automáticamente mientras escribe nuevos párrafos, pero no se rellena cuando edita párrafos.

  • refill-mode rellena constantemente los párrafos, pero trata de incluir el código en párrafos y comentarios.

  • Intenté agregar fill-paragraphal after-change-functionsgancho, pero arruina deshacer y muchas otras cosas (esto probablemente sea todo reparable, pero tomaría un poco de esfuerzo).

¿Alguna idea mejor?

dshepherd
fuente
66
Aparte: el capítulo 7 de Escritura de extensiones GNU Emacs de Glickstein explica cómo implementar la funcionalidad que busca. Puede ser una gran oportunidad para aprender / practicar con elisp.
Dan
Estoy buscando el párrafo de autocompletar (con autocompletar habilitado) org-mode, pero puedes probar rebox2
CodyChan

Respuestas:

4

Se me ocurrió una forma mínima de implementar esta funcionalidad: ¡solo une la barra espaciadora para llamar también (fill-paragraph)!

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

Hay un par de advertencias con las que me he topado hasta ahora:

  1. elisp-mode(posiblemente otros) rellena un código elegante cuando llama fill-paragraph, esto puede o no ser lo que desea. Probablemente se pueda solucionar probando si el punto está en un comentario o en una cadena de documentos, pero no estoy seguro de cómo hacerlo.

  2. A veces no puede ingresar fácilmente múltiples espacios (porque fill-paragraphmata los espacios finales). Dado que la barra espaciadora ahora actúa como just-one-spaceprobablemente está bien reemplazar ese enlace con (insert " ").

Hice un modo menor que contiene esta funcionalidad, está disponible en github o en el paquete melpa aggressive-fill-paragraph.

dshepherd
fuente
Me parece irónico que aggressive-fill-paragraphsea ​​mucho menos agresivo que refill-mode, que es agresivo hasta ser bastante inútil (ya que ni siquiera puedes citar a alguien > sin reorganizar el modo de recarga: incluso si usas regexps para el reemplazo) .
Hola Ángel,
1

Si le gusta cómo se comporta el modo de recarga (no: p) pero no cuando se comporta, debería ser relativamente fácil de solucionar inhibiéndolo cuando no esté en las condiciones adecuadas

Por ejemplo

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

Básicamente, elimina la función que activa la recarga after-change-functionsy la reemplaza por una que además verificará que estamos en un comentario antes de hacer exactamente lo mismo.

Sigma
fuente
Parece un buen comienzo, pero aún no está del todo bien: si se activa una recarga al editar un comentario, rellena todo el párrafo, incluido el código circundante. Esto puede ser culpa del modo circundante por no definir los límites de párrafo correctamente, pero lo dudo: lo intenté en el modo Emacs Lisp, que supongo que hace las cosas según el libro.
Gilles 'SO- deja de ser malvado'
bueno, es por eso que dije que no me gusta refill-mode:) El problema es que refill-modeusa en fill-regionlugar de fill-paragraph, por lo tanto, pierde la capacidad de honrar fill-paragraph-functiony hace las cosas potencialmente desordenadas
Sigma