Supposons que je modifie du code Python dans vim qui ressemble un peu à:
myobj.myfunc("Some string parameter that goes on and on and on and on and sometimes doesn't"
"split very"
"neatly over different lines so that"
"it is formatted attractively")
Je préférerais reformater ceci afin qu'il se redirige jusqu'à ce que textwidth
j'ai défini:
myobj.myfunc("Some string parameter that goes on and on and "
"on and on and sometimes doesn't split very "
"neatly over different lines so that it is "
"formatted attractively")
Y a-t-il un moyen facile de faire ceci? S'il s'agissait d'un paragraphe de texte conventionnel, gqipou similaire serait utile, mais cela ne traitera pas les guillemets utilisés pour délimiter la chaîne.
Remarque : Je pose des questions spécifiques sur Python ici, mais idéalement, cette réponse serait pertinente pour de nombreux types de langage de programmation qui permettent la continuation de chaînes.
formatting
line-breaks
filetype-python
Andrew Ferrier
la source
la source
"""multi-line string"""
?Réponses:
Oh, c'est difficile. Je pense que la meilleure approche est peut-être une macro mais plus probablement un plugin. Voici un exemple que j'ai fouetté (j'ai besoin d'un meilleur passe-temps). Cela semblait fonctionner pour moi mais aurait besoin du plugin d'indentation python pour indenter correctement. Essaye le.
Ensuite, vous pouvez l'utiliser avec
:call ReformatMultiLines()
et / ou l'utiliser dans un mappage.la source
Si cela se produit régulièrement, il vaut mieux chercher un plugin ou utiliser la fonction de @Sukima. Si je faisais cela à la volée, voici ce que je ferais probablement:
Ajoutez une nouvelle ligne après la parenthèse ouvrante et avant la parenthèse fermante afin que les chaînes soient sur des lignes distinctes.
Sélectionnez des lignes avec des chaînes et supprimez les guillemets environnants:
:norm ^x$x
:set tw-=2
gvgq
:set tw+=2
gv:norm I"<Esc>A"
. Au lieu de<Esc>
vous souhaitez insérer un échappement littéral en tapant ctrl-v suivi de la touche d'échappement. Puisque je mappe jj pour m'échapper, je tape généralement jj ici.la source
:set tw-=2
traduit parE487: Argument must be positive: tw-=2
. La syntaxe est-elle incorrecte?:set tw?
. Je suppose que la largeur de texte est définie sur 0. Ces étapes supposent que la largeur de texte commence comme le nombre de caractères que vous souhaitez par ligne.s/2/3/
ajouter un espace avant la citation de fermeture, votre longue chaîne n'aurait pas l'espacement approprié entre les mots.L'analyse et le formatage du code est difficile, en particulier pour les langages dynamiques tels que Python.
Au lieu d'essayer d'analyser Python dans Vimscript, je vous recommande d'utiliser un formateur externe tel que yapf . Avec ma réponse ici, vous pouvez l'écrire automatiquement en écrivant avec:
La
s:write_cmd()
fonction est dans l'autre réponse - je ne l'ajouterai pas ici donc je n'aurai pas à la mettre à jour à deux endroits si je trouve un bug :-)Vous pouvez également définir
formatprg
àyapf
et formater manuellement avecgq
.la source
yapf
ne semble pas le cas. Néanmoins, je conviens que cela ressemble à un outil utile.Les fonctions suivantes et les mappages correspondants ont résolu ce problème pour moi:
la source