web-dev-qa-db-fra.com

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

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"

J'obtiens ces résultats étranges:

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

Des signes de hachage (#) et des onglets sont apparus. Pourquoi?

108
elbarna

Il y a deux raisons:

Pour coller dans vim alors que le retrait automatique est activé, vous devez passer à 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

pour désactiver le mode coller. Comme il s'agit d'une action courante et fréquente, vim propose de basculer le mode de collage:

set pastetoggle=<F2>

Vous pouvez changer F2 à la touche de votre choix, et vous pouvez désormais activer et désactiver le collage facilement.


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

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

vim fournit également un registre de collage pour vous permettre de coller du texte à partir du presse-papiers du système. Vous pouvez utiliser "*p ou "+p selon votre système. Sur un système sans X11, comme OSX ou Windows, vous devez utiliser le * S'inscrire. Sur un système X11, comme Linux, vous pouvez utiliser les deux.

Lectures complémentaires

131
cuonglm

Utilisez la pâte vim. Ce que vous voulez, c'est coller ce qui est dans le tampon du presse-papiers "+p

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

Si vous utilisez Linux, * est le tampon X/clic du milieu (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 cours de collage et effectue sa propre auto-indentation (au-dessus de votre indentation copiée) jusqu'à la fin du collage.

Pour que cela fonctionne sur SSH, vous devez définir l'option pour que votre presse-papiers soit partagé -Y

Voir man ssh pour plus de détails.

36
exussum

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

Les lignes commentées sont produites par des commentaires automatiques et peuvent être désactivées en les désactivant.

Alternative à ceux que vous devriez obtenir le comportement souhaité en utilisant les bascules :set paste, en collant votre code formaté et :set nopaste pour rétablir un comportement normal.

8
casey