Arrêtez de coller des sélections sous forme de texte!


10

J'utilise VI et VIM depuis des années (30 ou plus) (dans xterms, pas sa propre fenêtre, gvim) et j'ai une énorme bibliothèque de commandes vim que je donne à vim en utilisant le bouton central de la souris comme sélection.

Par exemple, je faisais souvent des choses comme ...

 vi {many_hundreds_of_files}
   paste vim commands using mouse - one paste per file.

La sélection comprendrait de nombreuses commandes VIM pour faire des choses comme remplacer le test, le formatage, déplacer les lignes, etc., etc., etc., et se termine généralement par: w et: les commandes VIM suivantes, à la fin de la sélection, donc vim est prêt pour moi à coller à nouveau dans le fichier suivant. Cela me permet de mettre à jour un grand nombre de fichiers de manière TRÈS complexe, sans avoir besoin de scripts spéciaux (tels que l'édition perl sur place) pour le faire.

Certaines de ces pâtes de commande vim font plus de 200 lignes (stockées dans des fichiers texte que je fais apparaître à l'écran, et «copier tout»! Celles-ci apportent BEAUCOUP de modifications à l'ensemble des milliers de fichiers que je reformate. Mais uniquement pour l'ensemble spécifique de fichiers, pas pour mon travail quotidien sur le vim. EG: reformatage en bloc pour les fichiers texte / données.

Le problème...

Lors de mon dernier correctif système (Fedora 25), vim colle désormais la sélection de souris COMME TEXTE et non pas comme commandes vim, et je n'arrive pas à l'arrêter!

Cela fonctionne toujours bien sur un autre système (Fedora 24).

Si je veux coller comme texte, j'entre en mode insertion avant de coller! Je ne veux pas que VIM colle automatiquement les sélections en tant que texte lorsqu'il n'est pas en mode insertion. Je comprends que cela était censé être une fonction de sécurité, mais pour moi, c'est un problème majeur d'utilisation.

J'ai essayé de dater les entrées terminfo (xterm-256color) à partir d'une machine qui ne fait pas cela (en particulier l'entrée terminfo "kmous"). J'ai également regardé le paramètre vim ": set mouse =" (qui est nul!). Je ne sais pas si c'est le xterm (douteux), ou quelque chose qui a changé dans VIM (probablement), et les journaux de changement et google n'ont pas été utiles.

Cependant, rien ne semble me donner l'ancien comportement.


Trouvé un autre utilisateur avec le même problème, moins de détails, pas de solution unix.stackexchange.com/questions/346293/…
anthony

1
Je doute que ce soit plus probable un vimchangement: comment à l' vimintérieur d'un xtermsavoir quelque chose est entré par le clavier ou collé par le bouton de la souris? Je ne connais pas un tel mécanisme. D'un autre côté, xtermsait qu'il est en cours d'exécution vimafin qu'il puisse décider d'entourer le collage avec iet <esc>. Essayez (a) avec un autre type de fenêtre de terminal et (b) une copie de vimavec un nom différent. Cela devrait aider à réduire la cause du problème.
Philippos

Je suis d'accord avec @philippos. Peut-être autre chose que vimdétourne votre méthode de collage. Essayez peut-être d'utiliser ssh'ing ou telnet sur votre machine et de les coller de cette façon. Si vous avez une boîte Windows, utilisez du mastic pour mettre ssh dans votre machine Fedora25 et collez-le de cette façon.
Jim U

Pas directement lié, mais gvim sur windows se comporte de cette façon depuis des années. Lorsque vous installez gvim, vous obtenez deux exécutables gvim.exe(graphical-vim) et la ligne de commande vim.exe. Collez "itext" dans gvim.exe et vous obtenez itext. Collez-le dans le vim.exe et vous obteneztext
Jim U

1
@Philippos Ce mécanisme pourrait être collé entre crochets . Je ne sais pas comment Vim pourrait le supporter, peut-être l' pastetoggleoption?
Gilles 'SO- arrête d'être méchant'

Réponses:


12

Eh bien, après avoir parcouru BEAUCOUP de pages Web, beaucoup donnant des indices qui ne semblaient pas fonctionner, j'ai trouvé un indice (texte supplémentaire autour d'une pâte) qui m'a conduit à la cause et à la solution du problème.

Il semble que vim y ait intégré un certain nombre de «fausses» entrées termcap qu'il utilise lorsqu'il reconnaît des terminaux spécifiques (et se trompe parfois, même si ce n'était pas le cas dans ce cas).

Les paramètres termcap dans vim sont nombreux à ajouter en tant que tels NE S'AFFICHE PAS dans une liste de paramètres normale ": définir tout". Pour les voir, vous devez utiliser ": set termcap". Le paramètre termcap spécifique "non standard" est "t_BE" (voir vim ": help t_BE"). L'aide intégrée "xterm-bracketed-paste" explique ce paramètre termcap interne à vim.

Fondamentalement, si ce paramètre est défini (dans ce cas par Vim et non par termcap / terminfo), vim l'enverra à xterm au démarrage, ce qui indique à xterm d'ajouter des codes spéciaux autour de tout texte que l'utilisateur colle à partir d'une source externe. Lorsque vim les voit, il passe automatiquement non seulement en mode insertion, mais définit également le «mode collage» afin de ne pas formater le texte.

Le dernier (coller-mode) est je pense TRÈS utile! Le premier est ce qui me donne tous les ennuis.

La solution de force brute est de désactiver le collage entre crochets en l'ajoutant au ".vimrc"

:set t_BE=

Une solution alternative ....

Au lieu de désactiver complètement le collage entre crochets, arrêtez vim de prendre des mesures lorsqu'il voit la séquence de démarrage d'un collage terminal (à partir de la souris), en mode commande ou en mode normal.

:nmap <PasteStart>  <NOP>
:nmap <PasteEnd>    <NOP>
:cmap <PasteStart>  <NOP>
:cmap <PasteEnd>    <NOP>

Cela signifie que si vous collez du texte en mode insertion, vim n'essaiera pas de formater (mettre en retrait) du texte qui est probablement déjà en retrait.

Cela ne signifie pas que je n'ai plus besoin de basculer en mode collage, car j'utilise également le basculement en mode collage (mappé sur F2) pour désactiver "showbreak" et "listchars" (affichant les lignes, les tabulations, les espaces insécables et les espaces espaces supplémentaires à la fin des lignes). J'aurais encore besoin de mettre vim dans ce mode quand je veux faire des sélections de souris pour coller ailleurs.

Les commentaires et suggestions sur les solutions sont les bienvenus.


Cela semble également fonctionner dans Cygwin Vm mais malheureusement ne résout pas le problème dans VS Vim
James Robinson

@JamesRobinson Il est plus que probable qu'il s'agit d'un terminal intégré différent pour VS
anthony
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.