remballer automatiquement les lignes lors de l'écriture de démarques dans VIM

10

Très souvent, j'écris des démarques dans VIM, et il y aura des paragraphes dans ces démarques. Pour faciliter mon édition, j'ai configuré mon Vim pour encapsuler une ligne sur 80 caractères. Cela fonctionne bien si je continue à taper, mais le problème est que si je dois faire une correction, cela devient très ennuyeux.

démo (tirée de la logique de premier ordre de wikipedia):

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments. In first-order 
theories, predicates are often associated with sets. In interpreted higher-order 
theories, predicates may be interpreted as sets of sets.

Jusqu'ici tout va bien. Mais quand je révise l'article, je peux décider d'ajouter quelque chose au milieu, par exemple:

The adjective "first-order" distinguishes first-order logic from higher-order logic 
in which there are predicates having predicates or functions as arguments,
or in which one or both of predicate quantifiers or function quantifiers are permitted.
In first-order theories, predicates are often associated with sets. In interpreted higher-order
theories, predicates may be interpreted as sets of sets.

remarquez que la ligne 3 est celle que je veux terminer. Si je le fais dans VIM, je devrai joindre manuellement les lignes et recadrer tout le paragraphe.

Quelqu'un a-t-il une idée de comment faire pour que VIM le fasse automatiquement?

Jason Hu
la source

Réponses:

6

Encore plus simple: l' aindicateur pour 'formatoptions'permet la mise en forme automatique des paragraphes chaque fois que du texte est inséré ou supprimé. Voir :help fo-tablepour plus de détails sur les 'formatoptions'drapeaux et :help autoformat.

:set formatoptions+=a

gqet gwformatera les lignes sur lesquelles le mouvement suivant se déplace.

Formatting is done with one of three methods:
                1. If 'formatexpr' is not empty the expression is
                   evaluated.  This can differ for each buffer.
                2. If 'formatprg' is not empty an external program
                   is used.
                3. Otherwise formatting is done internally.

                In the third case the 'textwidth' option controls the
                length of each formatted line

La différence entre les deux, c'est que gqle curseur restera sur le premier non vide de la dernière ligne formatée. gwremettra le curseur là où il a commencé.

Vous pouvez facilement recadrer manuellement le paragraphe avec lequel votre curseur se trouve actuellement gwap, ou le document entier gggwG, bien que cela déplace votre curseur grâce à l'interlignage gg.

Avec une commande automatique, le formatage peut se produire automatiquement. Voici un exemple qui met en forme le paragraphe actuel lorsque vous quittez le mode d'insertion:

augroup myformatting
    autocmd!
    autocmd InsertLeave * normal gwap<CR>
augroup END

Il existe d'autres déclencheurs de commande automatique que vous pourriez trouver plus efficaces. Vous pouvez explorer les options sous :help autocmd-events. Les plus pertinents se trouvent probablement dans la sous-rubrique "divers".

8bittree
la source
un mot: génial!
Jason Hu
1

Je voudrais voir :help 'textwidth'. Il coupera automatiquement les lignes lorsque vous tapez. Cependant, cela ne fonctionne pas si vous modifiez le milieu d'une ligne.

Personnellement, je préfère laisser de textwidthcôté, donc j'ai créé une fonction qui se joindra automatiquement et divisera un paragraphe. (Fondamentalement, formatez-le automatiquement à 80 caractères) Il ressemble à ceci:

function! ParagraphToEightyChars()
   while (len(getline(".")) > 80)
      normal! 0
      " Find the first white-space character before the 81st character.
      call search('\(\%81v.*\)\@<!\s\(.*\s.\{-}\%81v\)\@!', 'c', line('.'))
      " Replace it with a new line.
      exe "normal! r\<CR>"
      " If the next line has words, join it to avoid weird paragraph breaks.
      if (getline(line('.')+1) =~ '\w')
         normal! J
      endif
   endwhile
   " Trim any accidental trailing whitespace
   :s/\s\+$//e
endfunction

J'ai ensuite un mappage pour l'appeler chaque fois que j'en ai besoin:

nnoremap <silent><A-J> :call ParagraphToEightyChars()<CR>

Cette fonction fonctionne très bien avec formatoptions+=jrpour formater les commentaires dans le code aussi! Placez simplement votre curseur sur la première ligne de plus de 80 caractères et appelez la fonction.

(Remarque: je n'ai pas rendu cette fonction générale pour faire des longueurs autres que 80, mais je pense que vous ne devez changer les 80 et 81 que si vous voulez en faire autre chose)

Voir :help 'textwidth'et :help 'formatoptions'pour plus d'informations.

Tumbler41
la source
Merci pour votre partage. Lorsque je vérifie votre configuration, le formatage n'est pas automatique lors de la frappe, n'est-ce pas? Si oui, alors c'est toujours une solution sous-optimale, non?
Jason Hu
textwidthformatera automatiquement à mesure que vous tapez. Ma fonction ne le sera pas. Je préfère contrôler quand vim enveloppe les choses, donc ça marche pour moi. Mais si vous recherchez spécifiquement un formateur au fur et à mesure, oui; il ne correspond pas tout à fait à votre flux de travail.
Tumbler41
1

Par souci d'exhaustivité, je voudrais mentionner l'option basée sur les plugins.

Si vous utilisez quelque chose comme ALE qui prend en charge l'exécution de vos tampons via un embellisseur lors de la sauvegarde, vous pouvez laisser Prettier gérer le reconditionnement de votre code.

J'ai accompli cela en mettant ceci dans ~/.vim/ftplugin/markdown.vim:

let b:ale_fixers = ['prettier', 'remove_trailing_lines', 'trim_whitespace']
let b:ale_javascript_prettier_options = '--prose-wrap always'

... et mettre ceci dans ~/.vimrc:

let g:ale_fix_on_save = 1
ssokolow
la source