43 votes

Comment garder le code formaté comme la source d'origine lorsque je les colle dans vim?

Lorsque je copie du code à partir de pages web et que je le colle dans Vim, je trouve que c'est un vrai fouillis, avec un style en forme d'échelle :

xxxxxx
   xxxxxx
      xxxxxx
         xxxxxxxxxx

Comme cela se passe aussi régulièrement de cette façon, je pense peut-être qu'il y a quelque chose qui ne va pas dans mon .vimrc, donc je l'ai copié 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

En général, j'écris du python dans Vim, donc une indentation correcte est cruciale.

58voto

Ignacio Vazquez-Abrams Points 107432

Faites ceci avant :

:set paste

Ensuite après :

:set nopaste

17voto

Shadowmancer Points 19

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

Activer/désactiver l'indentation automatique pour le collage de code

Contexte

Si vous utilisez des commandes Vim pour coller du texte, rien d'inattendu ne se produit. Le problème survient uniquement lors du collage à partir d'une autre application, et uniquement lorsque vous n'utilisez pas une version de Vim en mode GUI. Dans une console ou une version de terminal de Vim, il n'existe pas de procédure standard pour coller du texte à partir d'une autre application. Au lieu de cela, le terminal peut émuler le collage en insérant du texte dans le tampon du clavier, de sorte que Vim pense que le texte a été saisi par l'utilisateur. Après chaque saut de ligne, Vim peut déplacer le curseur de sorte que la ligne suivante commence avec la même indentation que la précédente. Cependant, cela modifiera l'indentation déjà présente dans le texte collé.

Activer/désactiver le collage

Placez la ligne suivante dans votre vimrc (changez par la touche de votre choix):

set pastetoggle=

Pour coller à partir d'une autre application :

  • Commencez le mode insertion.
  • Appuyez sur F2 (active l'option 'paste').
  • Utilisez votre terminal pour coller le texte du presse-papiers.
  • Appuyez sur F2 (désactive l'option 'paste').

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

Vous n'avez pas besoin de commencer par le mode insertion, mais si vous êtes en mode normal et que vous avez un mapping pour F2, ce mapping s'appliquera et la fonction 'pastetoggle' ne fonctionnera pas.

Certaines personnes apprécient les retours visuels affichés dans la barre d'état avec l'alternative suivante pour votre vimrc:

nnoremap  :set invpaste paste?
set pastetoggle=
set showmode

La première ligne définit un mapping de sorte que en appuyant sur F2 en mode normal inversera l'option 'paste' et affichera ensuite la valeur de cette option. La deuxième ligne vous permet d'appuyer sur F2 en mode insertion pour activer et désactiver 'paste'. La troisième ligne permet d'afficher si 'paste' est activé en mode insertion.

2voto

Candidasa Points 1560

C'est l'auto-indentation qui vous pose problème.

définir auto-indentation
définir smart-indentation

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

0voto

Kameron Spruill Points 449

J'ai appris cette astuce d'automatisation sur coderwall, écrivez ce qui suit dans votre fichier .vimrc

let &t_SI .= "\[?2004h"
let &t_EI .= "\[?2004l"

inoremap   [200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=[201~
  set paste
  return ""
endfunction

et cela activera et désactivera le mode collage pour vous.

Utiliser vim dans tmux peut être un peu délicat, car vous pouvez (j'utilise "pouvez" car je n'ai pas besoin de doubler l'échappement quand je suis dans tmux) devoir doubler l'échappement en utilisant

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\Ptmux;"
  let tmux_end = "\\\"

  return tmux_start . substitute(a:s, "\", "\\", 'g') . tmux_end
endfunction

let &t_SI .= WrapForTmux("\[?2004h")
let &t_EI .= WrapForTmux("\[?2004l")

function! XTermPasteBegin()
  set pastetoggle=[201~
  set paste
  return ""
endfunction

inoremap   [200~ XTermPasteBegin()

-2voto

h2obro Points 1

Le montant le plus bas d'effort pour accomplir cela est (peut être mis dans .vimrc):

:set paste

Ensuite, collez votre code.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X