Comment puis-je conserver le code au format d'origine en le collant dans vim?


37

Lorsque je copie du code à partir de pages Web et que je le colle dans VIM, je constate que cela devient un désordre ressemblant à une échelle, comme suit

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Puisqu'il a tellement chié, je pense qu'il y a peut-être quelque chose qui ne va pas avec le mien, .vimrccomme ci-dessous:

set number
set nocompatible
set nowritebackup
set noswapfile
syntax on
filetype indent on
filetype plugin on
filetype on
set background=light
set autoindent
set smartindent
set tabstop=4
set shiftwidth=4
set showmatch
set guioptions=T
set fileencodings=utf-8,prc
set ruler
set incsearch
map gs :%s
set t_Co=256
:colorscheme evening
filetype plugin indent on

D'habitude j'écris en python dans VIM.Et l'aide serait appréciée.


1
Merci. Cela m'a énervé pendant des années, et je n'ai jamais eu le temps d'en parler à qui que ce soit. +1
DevSolar le

Réponses:


50

Faites cela avant:

:set paste

Puis après:

:set nopaste

Pas nécessaire pour gvim; il les allume et les éteint automatiquement lors du collage.
Benjamin Bannier

aucune idée pourquoi c'est?
Nathan Fellman

1
Juste deviner: Plain vim est uniquement en ligne de commande et ne "connaît" pas le presse-papiers. Il prend le "coller" en tant que séquence de caractères d'entrée et applique une indentation automatique. Le gvim compatible avec l'interface graphique peut "savoir" que les données entrantes proviennent du presse-papiers, et désactiver ainsi l'identification automatique à cette fin.
DevSolar

C'est correct. Le terminal traite l'opération "coller" comme une entrée de caractère brut.
Ignacio Vazquez-Abrams Le

Ce n'est pas purement un problème de vim - vous pouvez obtenir un effet similaire en le collant dans l'ancien éditeur DOS à l'aide d'une invite de commande. Ce programme semble manquer dans Windows 7 64 bits - sans doute parce que c'est vraiment une ancienne application DOS 16 bits et que cela ne valait pas la peine de l'actualiser. C'est dans Windows XP, cependant, et coller dans (1) fonctionne très lentement, en agissant sur la saisie caractère par caractère, et (2) crée un véritable désordre.
Steve314

16

http://vim.wikia.com/wiki/Toggle_auto-indenting_for_code_paste

Basculer l'indentation automatique pour le collage de code

Contexte

Si vous utilisez les commandes Vim pour coller du texte, rien d’inattendu ne se produit. Le problème ne survient que lors du collage à partir d'une autre application, et uniquement lorsque vous n'utilisez pas une version graphique de Vim. Dans une version console ou terminal de Vim, il n'y a pas de procédure standard pour coller du texte depuis une autre application. Au lieu de cela, le terminal peut émuler le collage en insérant du texte dans la mémoire tampon du clavier, de sorte que Vim pense que le texte a été saisi par l'utilisateur. À la fin de chaque ligne, Vim peut déplacer le curseur pour que la ligne suivante commence par le même retrait que la dernière. Cependant, cela modifiera l'indentation déjà dans le texte collé.

Coller bascule

Mettez ce qui suit dans votre vimrc (changez la clé de votre choix):

set pastetoggle=<F2>

Pour coller depuis une autre application:

  • Lancer le mode insertion.
  • Appuyez sur F2 (activez l'option "coller").
  • Utilisez votre terminal pour coller du texte dans le presse-papiers.
  • Appuyez sur F2 (désactive l'option 'Coller').

Ensuite, l'indentation existante du texte collé sera conservée.

Vous n'êtes pas obligé de démarrer le mode insertion en premier, mais si vous êtes en mode normal et disposez d'un mappage pour F2, ce mappage s'appliquera et la fonction 'pastetoggle' ne fonctionnera pas.

Certaines personnes aiment le retour visuel affiché dans la ligne d'état par l'alternative suivante pour votre vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

La première ligne définit un mappage de sorte que le fait d'appuyer sur F2 en mode normal inversera l'option 'coller', puis affichera la valeur de cette option. La deuxième ligne vous permet d’appuyer sur F2 en mode insertion pour activer / désactiver le «coller». La troisième ligne permet d'afficher si «coller» est activé en mode insertion.


1
+1 pour la solution de raccourci clavier. Pour ceux qui ne sont pas trop fermes dans VIM (comme moi) et qui ont déjà associé les touches F à quelque chose d'autre (comme moi), <C-F2> serait Ctrl-F2 ...
DevSolar

excellent - J'utilise maintenant ceci
hoju

pourquoi ne pas simplement mapper les touches de collage pour le faire automatiquement, comme <S-Insert> ou <Ctrl + V>, avec leurs fonctions d'origine? Ou alors, écrivez une fonction qui désactive le collage lorsque plus d'une poignée de caractères sont écrits dans la mémoire tampon en l'espace d'une seconde. , J’ai même un clavier avec 12 touches F et + 15 autres touches F (touches G), et avec cela, trois niveaux, ce qui n’est toujours pas suffisant :) mais c’est juste moi. Le seul problème est le menu clic-droit, qui n'a pas été envoyé pour signaler un début de
collage

2

C'est l'autoindent qui vous dérange.

set autoindent
set smartindent

Essayez de les désactiver lorsque vous coupez et collez votre code, puis réactivez-les lorsque vous avez terminé.


-2

Le plus petit effort pour y parvenir est (peut être mis en .vimrc):

:set paste

Ensuite, collez votre code.


3
L' 'paste'option n'a jamais été conçue pour être définie de manière permanente. Cela désactive beaucoup de choses, y compris les correspondances et les abréviations. En outre, une réponse précédente couvre déjà l' 'paste'option.
Heptite

2
Bienvenue sur Super User! Cela duplique une réponse existante et n’ajoute aucun nouveau contenu. S'il vous plaît, ne postez pas de réponse sauf si vous avez réellement quelque chose de nouveau à contribuer.
Toby Speight
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.