Pourquoi Vim indente-t-il le code collé de manière incorrecte?

101

Dans Vim, si je colle ce script:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

Je reçois ces résultats étranges:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Les signes de hachage (#) et les onglets sont apparus. Pourquoi?

Elbarna
la source
31
C'est peut-être une meilleure question pour vi.stackexchange.com
Eric Renouf
@EricRenouf pourquoi? (question honnête)
Qix
3
@qix je pensais que c'était une question sur le fonctionnement de vim, qui est un outil commun à utiliser sur * nix, mais * nix n'est pas indispensable pour utiliser vim
Eric Renouf
1
@JaredBurrows J'espère vraiment que ça le fera
Eric Renouf
1
Comment allez-vous déclencher la pâte? Avec la souris?
Ben Voigt le

Réponses:

123

Il y a deux raisons:

Pour coller vimlorsque l’indentation automatique est activée, vous devez passer en mode Coller en tapant:

:set paste

Ensuite, vous pouvez passer en mode insertion et coller votre code. Une fois le collage terminé, tapez:

:set nopaste

désactiver le mode coller. Comme il s’agit d’une action courante et fréquente, vimpropose le mode de collage bascule:

set pastetoggle=<F2>

Vous pouvez modifier la F2touche de votre choix et maintenant, vous pouvez activer et désactiver facilement le collage.


Pour désactiver l'insertion automatique de commentaires, vous pouvez ajouter ces lignes à votre vimrc :

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vimfournit également un registre de collage pour vous permettre de coller du texte à partir du Presse-papiers du système. Vous pouvez utiliser "*pou "+pselon votre système. Sur un système sans X11, tel que OSX ou Windows, vous devez utiliser le *registre. Sur un système X11, comme Linux, vous pouvez utiliser les deux.

Lectures complémentaires

cuonglm
la source
2
J'utilise Vim depuis toujours et je ne savais rien à ce sujet. Merci beaucoup.
Caja
La plupart des émulateurs de terminaux graphiques modernes prennent en charge une fonctionnalité appelée "mode de collage entre crochets". Vim peut demander au terminal d'activer ce mode, qui encerclera le texte collé avec certaines séquences d'échappement. Vim peut le reconnaître et désactiver l'emballage / l'indentation pendant toute la durée de la pâte. La longue histoire stort: ​​coller va "fonctionner comme prévu". Je ne suis pas un utilisateur de vim, mais une recherche rapide sur le Web vous expliquera comment configurer ce mode.
egmont le
2
@ MichaelDurrant set pastene devrait jamais être dans votre vimrc. Il désactive ou réinitialise beaucoup de choses, y compris les mappages en mode insertion, les mappages en ligne de commande, les abréviations, la largeur de texte, wrapmargin, autoindent, smartindent, softtabstop, formatoptions, indentexpr et quelques autres. :h pastea toute la liste. La plupart des gens utilisent tout ou partie de ces éléments et se demandent pourquoi leurs paramètres sont ignorés.
FDinoff
4
J'utilise habituellement :r!catpour coller mot à mot.
Simon Richter
1
Il peut être intéressant de discuter de l’interaction avec set mouse, qui peut automatiquement entrer et quitter le mode Coller lors du collage avec un clic de souris.
Ben Voigt
36

Utilisez la pâte vim. Ce que vous voulez, c'est coller ce qu'il y a dans le tampon du presse-papier "+p

Cela sélectionne le +et le colle en place.

Si vous utilisez Linux, *est-ce que le tampon X / clic intermédiaire (le dernier texte sélectionné).

Ensuite, Vim sait que c'est une pâte.

Sinon, vim pense que vous avez tapé les clés en train d'être collées et effectue sa propre indentation automatique (en plus de votre indentation copiée) jusqu'à la fin du collage.

Pour que cela fonctionne sur SSH, vous devez définir l'option de partage de votre presse-papiers. -Y

Voir man sshpour plus de détails.

exussum
la source
4
C'est en fait la bonne réponse à mon humble avis
Kristoffer Sall-Storgaard
Il semble que cela ne fonctionne que pour le graphique vim ( gvim); vim s'exécutant dans un émulateur de terminal colle le dernier texte supprimé avec "* p, et non la sélection actuelle.
wurtel
Je n'utilise pas gvim, seulement le terminal vim. quel est le réglage de votre souris? mon réglage de souris est c. Vous ne savez pas comment cela fonctionne lorsque la sélection de la souris est autorisée. set mouse?
Exussum
2
vérifiez également vim --versionsi elle a été compilée avec le support du presse-papiers +xterm_clipboarddoit être dans la sortie
exussum
@wurtel: Peut-être que vous avez défini le presse-papiers avec une unnamedchaîne.
jeudi
8

Les onglets ont été insérés car autoindent est activé et vous pouvez désactiver ce comportement en désactivant autoindent ( :set noai) avant de le coller dans le terminal.

Les lignes commentées sont produites par auto-commentaire et peuvent être désactivées en les désactivant.

Au lieu de cela, vous devriez obtenir le comportement souhaité en utilisant les options :set paste, en collant votre code formaté et :set nopasteen rétablissant un comportement normal.

casey
la source