L’édition de fichiers xml avec des lignes longues est vraiment lente dans vim. Que puis-je faire pour résoudre ce problème?

J’édite beaucoup de fichiers XML avec vim. Le problème est que, à cause des longues lignes, la navigation / édition dans vim est extrêmement lente. Y a-t-il quelque chose que je peux faire (en plus de désactiver la mise en évidence de la syntaxe / les plugins de type de fichier et l’indentation de type de fichier) pour pouvoir éditer ces fichiers sans tout ce décalage?

C’est vraiment frustrant qu’une chose sortingviale telle que la coloration syntaxique soit si mal gérée par vim. Je ne me souviens pas que cela soit un problème avec un autre éditeur. J’aime vraiment utiliser vim et j’espère qu’il y a un moyen de résoudre ce problème.

Le problème est que la mise en évidence de la syntaxe VIM est lente pour les longues lignes. Une solution simple qui ne dégrade que légèrement les fonctionnalités consiste à limiter la mise en évidence de la syntaxe aux premières x colonnes. Quelque chose comme ça dans votre .vimrc :

 set synmaxcol=120 

Nous sums en 2014, j’utilise la version 7.4 de Vim. la mise en évidence de la syntaxe et la combinaison de lignes longues entraînent toujours un ralentissement inacceptable de vim. Comme il s’agit de la première réponse de Google, je voulais laisser tomber mes solutions “actuelles”.

  • J’ai trouvé que l’activation et la désactivation de votre syntaxe après le chargement du fichier incriminé permettent à vim de se comporter à un rythme acceptable. Pour plus de commodité, vous pouvez le lier

    :syntax off :syntax on

    ou liez-le: nnoremap ts :syntax off:syntax on

  • J’ai aussi trouvé que le sourcing de mon .vimrc produirait le même résultat

    :source $MYVIMRC

    et carte obligatoire: nnoremap sv :source $MYVIMRC

EDIt —- 31/07/14

Une exploration plus poussée m’a amené à limiter la syntaxe avec une colonne maximale. Cela a très bien fonctionné et je n’ai eu aucun problème depuis que j’ai ajouté le ci-dessous à mon vimrc.

 set synmaxcol=250 

cela limite généreusement la syntaxe aux 250 premières colonnes.

 :set nocursorline 

devrait aider.

Que pensez-vous de la jolie impression de votre fichier XML (si la longueur de la ligne est le véritable problème)? Vous pouvez le faire par exemple en utilisant xmllint qui fait partie du paquet Gnome libxml2 (et il y a aussi une version disponible pour Windows).

Vous pouvez joliment imprimer sur place en exécutant

 xmllint --format -o xmlFile.xml xmlFile.xml 

Avez-vous désactivé le retour à la ligne? Dans mon expérience, le retour à la ligne peut ralentir un peu le travail avec des lignes très longues.

 set nowrap 

La solution la plus simple et la plus efficace que j’ai trouvée consiste à désactiver simplement la coloration syntaxique:
syntax off

Cela semble être le coupable quand il s’agit de longues lignes. De plus, d’après mon expérience avec vim et xml, la taille du fichier ne semble pas avoir d’importance – ce sont les longues lignes qui causent ces ralentissements.

Un autre travail que j’ai trouvé utile est d’emballer des zones avec de longues lignes dans des plis :

   A reeealy long line  

La fermeture des plis empêchera vim d’parsingr la syntaxe de ces lignes. Bien sûr, cette approche n’est pas toujours pratique, mais elle a très bien fonctionné là où je n’avais que quelques lignes longues ou dans un domaine spécifique du fichier.

Souvent, Vim est encore plus lent, mais dans la plupart des cas, les performances deviennent acceptables.

Nan. C’est la syntaxe qui souligne penser, AFAIK. L’approche de Regex que Vim utilise n’est pas la solution optimale pour éditer des fichiers XML.

(bien sûr, vous pouvez toujours essayer d’écrire votre propre fichier de syntaxe pour xml, en espérant que vous ferez un meilleur travail)

Il y a un plugin, LargeFile pour le travail. Il désactive certains événements, la coloration syntaxique et même l’annulation. Vous n’avez pas mentionné la taille des fichiers XML, mais le plugin est configurable. Vous pouvez définir la taille d’un “fichier volumineux” en mégaoctets pour que les “fichiers non volumineux” puissent être traités normalement.

Je remplace souvent> \ r <-> :s/>\s*\r , puis réinsère tout le fichier avec gg=G

Commenter la ligne

 syn sync match xmlSyncDT grouphere xmlDocType +\_.\( 

dans votre fichier xml.vim (avec " ).

Ce type de problème peut être débogué dans une session vim en tapant :syntime on , en faisant quelque chose qui démontre la lenteur du problème, puis :syntime report . Dans mon cas, il a signalé que xmlSyncDT prenait plus de 10 secondes dans mon fichier XML de 6 Mo avec des lignes de 4 000 caractères juste pour afficher la dernière page du fichier. Commenter la ligne ci-dessus n’a pas eu d’effet sur la coloration syntaxique, à ma connaissance, sauf qu’il ne faut plus qu’une fraction de seconde pour afficher un écran.

Ajouter au fichier vimrc

 nmap x :set filetype=xml:%s/>\rgg=G:noh 

appuyez sur x pour imprimer automatiquement le fichier xml.

Elle est causée par l’parsing de longue ligne dans vim. J’ai finalement constaté que si je supprime la suite de mon .vimrc , le problème résolu:

 filetype indent plugin on 

Notez que cela ne fonctionne pas si vous tapez :filetype indent plugin off lors de l’édition d’un fichier avec une ligne longue.

Vous pouvez cette fonction à votre .vimrc pour reformater votre fichier xml et, espérons-le, réduire la longueur de ligne.

 function! DoPrettyXML() " save the filetype so we can restore it later let l:origft = &ft set ft= " delete the xml header if it exists. This will " permit us to surround the document with fake tags " without creating invalid xml. 1s///e " insert fake tags around the entire document. " This will permit us to pretty-format excerpts of " XML that may contain multiple top-level elements. 0put ='' $put ='' silent %!xmllint --format - " xmllint will insert an  header. it's easy enough to delete " if you don't want it. " delete the fake tags 2d $d " restore the 'normal' indentation, which is one extra level " too deep due to the extra tags we wrapped around the document. silent %< " back to home 1 " restore the filetype exe "set ft=" . l:origft endfunction command! PrettyXML call DoPrettyXML()