Pourquoi l'insertion décalée ne fonctionne-t-elle pleinement qu'en mode insertion?

13

Je viens d'essayer de coller du contenu (dans Git Bash sur le serveur CentOS) dans un fichier en utilisant vim.
Je viens d'ouvrir le fichier et j'ai essayé d'utiliser shift+ insertet j'ai remarqué que la première moitié est (grossièrement) coupée, mais si je mets vim en mode d'insertion et que je frappe shift+ inserttout est collé parfaitement.
Je me demandais juste pourquoi c'était?

Merci

treyBake
la source
Hé, j'ai aussi deux pouces !!! : D
RonJohn

Réponses:

24

Le Shift+ Insertet le " collage " dans un terminal se comportent de la même manière - ils émulent les pressions de touches.

Il s'agit d'une distinction importante qui est souvent impossible pour les terminaux à faire - saisissez-vous ou collez-vous? Remarque : certains terminaux prennent en charge les modes " coller entre crochets ", après le commentaire de @ Josh, je suis même tombé sur un plugin vim collé entre crochets dans xterm qui pourrait vous intéresser.

Vos données collées seront perdues jusqu'au premier caractère qui entre en mode d'insertion. Vous pouvez également constater que votre curseur a bougé et que d'autres parties du fichier ont changé (par exemple: cas modifié / supprimé / etc) ...

En résumé, si vous collez du texte que vous souhaitez insérer dans le fichier, passez d'abord en mode d'insertion.


Essayez de copier le texte suivant et collez-le dans un terminal exécutant Vim (pas en mode insertion):

hello how are you

Le résultat est le même que la saisie des mêmes lettres sur votre clavier:

résultat du collage dans Vim

Dans ce cas, il vous laisse en mode insertion ...

Essayez maintenant de quitter le mode d'insertion - Esc- et de coller ce qui suit

/are
n

Ceci effectue une recherche de "sont":

résultat du collage dans Vim

Collez maintenant ceci:

:0
dG

Oh non ... tout est parti!

tous partis


Vous constaterez également que si vous avez activé le retrait, le collage d'un bloc de code dans vim (en mode insertion) induira trop - il se mettra automatiquement en retrait, puis votre code collé comprendra le retrait.

def my_print(message):
    print(message)
    print('done...')

coller le code

Pour résoudre ce problème, utilisez les commandes :set pasteet:set nopaste

coller du code (mode coller)

Attie
la source
4
"Il s'agit d'une distinction importante que les terminaux ne peuvent pas faire - tapez-vous ou collez-vous?" - ce n'est pas tout à fait vrai, certains terminaux et applications prennent en charge le "collage entre crochets" où une séquence spéciale est envoyée avant et après le texte collé.
Ash
@Josh: intéressant, merci ... votre commentaire m'a même conduit à un plugin vim
Attie
Suis-je le seul qui me dérange set nopaste? Je m'attendais unset paste.
Eric Duminil
@ThisGuyHasTwoThumbs comme alternative, au moins lors de l'utilisation de Vim, vous pouvez utiliser le "+registre pour interagir avec le presse-papiers du système, car il aura tendance à se comporter plus sainement. L'inconvénient est que certains systèmes ou versions de Vim peuvent utiliser à la "*place, ou tout simplement ne pas prendre en charge le presse-papiers du système, mais d'après mon expérience, il "+a été assez fiable.
8bittree