9
votes

Arrêtez Vim de mettre à jour dynamiquement les plis

Y a-t-il un moyen d'arrêter Vim de mettre à jour automatiquement les plis à la volée? J'adore vraiment le pliage de Vim et je préfère l'avoir en mode Syntaxe afin que les plis soient créés comme je tape. Mais par exemple, lorsque je code C ++ et j'écris un support {Il ferme automatiquement tous les plis suivants, et lorsque je ferme ensuite le support à nouveau avec A}, VIM élargit automatiquement tous les plis suivants, ce qui signifie que je dois tout refourir.

Un autre problème connexe, si j'ai le même document ouvert dans un tampon différent, disons que je suis exécuté ": Split", puis écrit un support ouvert {Nubliez tous les plis dans le tampon sous le pli dans lequel j'ai ouvert le support et la fermeture Il n'enveloppera les plis mais aussi les plus proches. Si j'utilise soit "". ou "->" pour accéder à une fonction / variable membre, il réinitialise tous les plis dans la mémoire tampon, quelle que soit la pliard de pliage actuel, quels que soient les plis que j'ai ouverts / fermés moi-même.

Ceci est un peu frustrant Lorsque j'ai le même document ouvert sur deux tampons, je peux donc lire le contenu d'une fonction lors de l'écriture d'une autre, car je dois constamment changer de mémoire tampon et rouvrir mes plis.

dans mon .vimrc j'ai xxx

et c'est à ce sujet. Pour l'auto-complétion, j'utilise Clang-Complete et SuperTab avec: XXX

Je pense que c'est tout ce qui affecte cela.

EDIT: < P> Ajout de photos pour illustrer le problème

vim

0 commentaires

4 Réponses :


0
votes

Je pense que vous devez vérifier : h 'refinlvel . Vous devriez également utiliser : mkview , probablement dans autocmd qui restaure les plis manuellement ouverts et fermés.

Autre alors que vous devriez peut-être définir la méthode de pliage différemment sur différents types de fichiers (par exemple sur C, vous pouvez la définir sur manuel ou marqueur)


10 commentaires

Je préférerais continuer à utiliser la syntaxe pliante, car elle fonctionne généralement bien, et je ne pense pas que la pliard ait quelque chose à voir avec cela. Le problème est que chaque fois que j'écris quelque chose qui créera un pli, tous les plis suivants sont ouverts quelles que soient les pliards.


Pouvez-vous essayer de mkview sur startinsert et restaurer la vue sur l'insert de fin?


Autre que le fait qu'il semble un peu trayonné, il avait un effet légèrement différent. Tout d'abord, il semble plier tout ce qui suit le support une fois (mais pas tout le chemin), qui est une amélioration, je suppose, mais ne fonctionne toujours pas. De plus, si j'écris un support, écrivez-en quelque chose à l'intérieur et arrêtez d'éditer à l'intérieur de mon nouveau support, qui sera plié lorsque je quitte le mode d'insertion, qui est inférieur à l'idéal.


La partie ultérieure est facilement résolvable en ajoutant zv après la visualisation de la vue sur la sortie (ouvert suffisamment de plis pour voir le curseur). Semble trichy? :) ça marche ou non.


Eh bien, je suppose. C'est juste que la fermeture de tous les plis suivants à la création automatique d'un nouveau pli (si c'est ce qui se passe) n'est pas un comportement attendu, et on aurait donc pensé qu'il y aurait une solution générale, ou au moins une explication. Le problème initial se tient toujours, comme la seule différence est que cela ne se plie que une fois, mais cela me fera toujours forcer à ré-ouvrir les plis.


Avez-vous essayé de définir différents plimethod sur INSERT INTER / EXIT?


Oui, cela semblait faire l'affaire pour la première question =). Une idée de la façon dont on pourrait éviter le problème avec les tampons (spécialement une scission)? Un simple "bufo" n'a pas fonctionné.


Permet de réitérer la vieille idée à nouveau - MKView en Entrée avec Bufdo Restaurer la vue sur la sortie?


Cela ne semble pas fonctionner. Maintenant, entrez: bufdo! SET FLETMETHOD = Manuel ALORS BUFDO! mkview et quand je pars j'ai: bufdo! Silent LockView et ensuite bufdo! SET FLETMETHOD = Syntaxe . Également essayé de les mélanger, ce qui n'a rien fait. De plus, ne sont pas les vues des différents tampons enregistrés dans le même dossier? Si tel est le cas, vaincre le but d'avoir des vues différentes dans différents tampons.


Ah, tu as raison. Avez-vous essayé d'utiliser un plugin au lieu de fractionnement, comme WearReRegion. De plus, vous n'avez pas besoin d'utiliser Split, mais vous pouvez créer une fonction qui clonera un tampon de courant à une seule différence avec ses propres réglages.



0
votes

Si vous définissez temporairement le plimethod sur le manuel, VIM conservera tous les plis actuellement définis par la syntaxe et les conservera dans l'état Open / Closed que vous les avez maintenant. Cela peut être fait automatiquement avec un Autocmd insertener et restauré sur INSERVELEIVE pour protéger vos états de pliage dans une seule fenêtre. Malheureusement, je n'ai pas encore passé de temps à essayer de le faire fonctionner dans des fenêtres fractionnées, mais à l'aide de variables locales de fenêtre, il est suffisamment facile pour même de prendre en compte les fenêtres de commutation utilisateur ou de quelque chose sans laisser le mode insertion. Voir http://vim.wikia.com/wiki/keeds_folds_closed_while_inserting_text pour plus de détails et discussions.


1 commentaires

Merci, changeant plimethod lors de la saisie et de la sortie du premier problème, mais j'aimerais beaucoup résoudre le second ainsi que la fractionnement de votre fenêtre pour lire plusieurs parties d'un fichier à la fois très pratique.



5
votes

Les deux problèmes peuvent être résolus avec les deux autocmd S: xxx

Ceci définit le tampon local 'plimethod' à à < Code> manuel Lorsque le mode Insérer est entré ou sa fenêtre (un écran tampon) est laissé et la définit sur syntaxe lorsque l'insertion est laissée ou que sa fenêtre est entrée.

Ceci fonctionne car réglage 'plimethod' sur manuel gardera les plis automatiquement créés par syntaxe comme si vous les définissez (manuellement) et les plis manuels ne sont pas mis à jour en fonction de la syntaxe du fichier.

J'ai trouvé deux bugs avec cette solution:

  1. Lors de la commutation de fenêtres en mode insertion, le autocmd définira le 'FoldMethod' sur Syntaxe pour la nouvelle fenêtre, Même s'il est en mode insertion et doit être réglé sur manuel .

    Ce n'est pas vraiment un problème pour moi, car j'utilise Vim comme une personne civilisée et opérer en mode normal par défaut.

  2. quand

    • Un nouveau tampon est créé (par exemple en lisant un fichier)
    • et 'FIDELEVEL' est 0
    • et une syntaxe particulière est utilisée (je suis capable de dupliquer le problème avec un fichier C)
    • et la commande O ou o est utilisé pour entrer en mode insertion pour la première fois dans ce tampon (faire i < ESC> O ne duplique pas le bogue),

      Ensuite, tous les plis sous le curseur seront ouverts.

      J'ai accidentellement découvert cela lors du test de la solution ci-dessus et de regarder en arrière, je suis surpris que je l'ai trouvé; Il ne vaut même pas la peine de mentionner. Je n'ai pas l'intention d'essayer d'écrire un fichier de test qui possède la syntaxe exacte nécessaire pour dupliquer le bogue. Cela peut donc passer inaperçu pour un autre EON.


      J'ai effectivement découvert cette question il y a plusieurs mois et j'ai utilisé la solution Ben liée à pendant un certain temps, avant de finalement être assez agacé avec la fenêtre multiple pour un problème de tampon (votre deuxième problème) pour le réparer.

      Donc, grâce à Ben pour sa solution et que vous avez demandé à cela. Question!


2 commentaires

À un premier coup d'œil avec un peu de test, cela semblent en effet corriger mon problème. Bien sûr, Modulo Vim étant un peu bizarre lorsque vous travaillez avec des divisions et plusieurs tampons, mais c'est quelque chose que j'ai appris à vivre avec.


"Lors de la commutation de fenêtres en mode insertion" ... Est-ce que cela est encore possible?!?! Oh mon ... Pourquoi quelqu'un ferait-il quelque chose comme ça? O.o



3
votes

J'ai fait un peu une modification de la réponse de User4830797 qui aide à faire face aux situations où le fichier que vous modifiez n'utilise pas plimethod = syntaxe (par exemple, un fichier .vimrc qui pourrait utiliser plimethod = marqueur ): xxx


1 commentaires

Erreur détectée lors du traitement des autocommandes Winenter pour "*": E121: Variable non définie: G: OldfoldMethod