Existe um modo de preenchimento de parágrafo totalmente automático para comentários de código?

18

Estou procurando um modo menor para manter os parágrafos preenchidos o tempo todo durante a digitação (semelhante ao que aggressive-indent-modeocorre no recuo). Ele também precisa ser inteligente o suficiente para preencher apenas comentários (e talvez seqüências de caracteres, dependendo do idioma).

Algumas coisas que eu tentei são:

  • auto-fill-mode é preenchido automaticamente enquanto você digita novos parágrafos, mas não é preenchido novamente quando você edita parágrafos.

  • refill-mode constantemente preenche parágrafos, mas tenta agrupar o código em parágrafos e também em comentários.

  • Tentei adicionar fill-paragraphao after-change-functionsgancho, mas ele estraga tudo e muitas outras coisas (provavelmente tudo isso pode ser corrigido, mas seria necessário algum esforço).

Alguma ideia melhor?

dshepherd
fonte
6
Além disso, o capítulo 7 do Writing GNU Emacs Extensions da Glickstein mostra como você pode implementar a funcionalidade que procura. Pode ser uma ótima oportunidade para aprender / praticar com a elisp.
Dan
Estou procurando a-fill-parágrafo auto (com auto-preenchimento habilitado) em org-mode, mas você pode tentar rebox2
CodyChan

Respostas:

4

Eu vim com uma maneira mínima de implementar essa funcionalidade: basta ligar a barra de espaço para também chamar (fill-paragraph)!

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

Há algumas ressalvas que eu encontrei até agora:

  1. elisp-mode(possivelmente outros) faz algum preenchimento de código sofisticado quando você liga fill-paragraph, isso pode ou não ser o que você deseja. Provavelmente pode ser corrigido testando se point está em um comentário ou uma doutrina, mas não tenho certeza de como fazer isso.

  2. Às vezes, você não pode inserir facilmente vários espaços (porque fill-paragraphmata todos os espaços à direita). Como a barra de espaço agora age como just-one-spaceprovavelmente não há problema em substituir essa ligação por (insert " ").

Eu criei um modo menor contendo essa funcionalidade, que está disponível no github ou no pacote melpa aggressive-fill-paragraph.

dshepherd
fonte
Acho irônico que aggressive-fill-paragraphé muito menos agressivo do que refill-mode, o que é agressivo até ser bastante inútil (como você não pode nem citar alguém > sem coisas de reorganização no modo de recarga: mesmo se você usar regexps para substituição) .
Hi-Angel
1

Se você gosta de como o modo de recarga se comporta (não: p), mas não quando se comporta, deve ser relativamente fácil de corrigir, inibindo-o sempre que você não estiver nas condições certas

Por exemplo

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

Basicamente, ele remove a função que aciona a recarga after-change-functionse a substitui por uma que também verifica se estamos em um comentário antes de fazer exatamente a mesma coisa.

Sigma
fonte
Parece um bom começo, mas ainda não está certo: se uma recarga for acionada durante a edição de um comentário, ela recarregará o parágrafo inteiro, incluindo o código ao redor. Isso pode ser culpa do modo circundante por não definir os limites do parágrafo corretamente, mas duvido: tentei no modo Emacs Lisp, que presumo que faça as coisas pelo livro.
Gilles 'SO- deixa de ser mau'
bem, é por isso que eu disse que eu não gosto refill-mode:) O problema é que refill-modeos usos fill-regionem vez de fill-paragraph, perdendo assim a capacidade de honra fill-paragraph-functione fazer as coisas potencialmente confuso
Sigma