Désactiver le retrait automatique lors du collage du texte dans vim

Je fais l'effort d'apprendre Vim.

Lorsque je colle du code dans mon document à partir du presse-papiers, j'obtiens des espaces supplémentaires au début de chaque nouvelle ligne:

line
  line
    line

Je sais que vous pouvez désactiver le retrait automatique mais je ne peux pas le faire fonctionner parce que j'ai d'autres paramètres en conflit ou quelque chose (qui semblent assez évidents dans mon .vimrc mais ne semblent pas avoir d'importance quand je les sors).

Comment puis-je désactiver l'indentation automatique lorsque je colle du code mais que je conserve l'indentation automatique vim quand je le suis l'écriture de code? Voici mon fichier .vimrc:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  
977
demandé sur dreftymac 2010-03-25 12:52:47

19 réponses

Mise à Jour: Meilleure réponse ici: https://stackoverflow.com/a/38258720/62202

Pour désactiver l'autoindent lorsque vous collez du code, il existe un mode spécial "coller".

De Type

:set paste

Puis collez votre code. Notez que le texte de l'info-bulle indique maintenant -- INSERT (paste) --.

Après avoir collé votre code, désactivez le mode coller, de sorte que l'indentation automatique lorsque vous tapez fonctionne à nouveau correctement.

:set nopaste

Cependant, j'ai toujours trouvé cela encombrant. C'est pourquoi je map <F3> de telle sorte qu'il peut basculer entre les modes coller et nopaste lors de l'édition du texte! j'ajoute ceci à .vimrc

set pastetoggle=<F3>
1729
répondu P Shved 2018-09-20 14:56:29

Pour éviter les effets indésirables lors du collage, il y a une option qui doit être définie:

set paste

Une commande utile d'avoir dans votre .vimrc est set pastetoggle=<F10> ou un autre bouton, pour basculer facilement entre coller et nopaste.

250
répondu Jacob R 2017-10-31 07:38:47

J'utilise habituellement :r! cat puis je colle ( shift + insert ) le contenu, et CTRL+D.

Pas besoin d'activer et désactiver, utilisation directe.

121
répondu thegeek 2010-03-30 12:50:15

Si vous travaillez localement, vous pouvez coller à partir du presse-papiers système avec la séquence de touches:

"+p

Ceci est une commande vim appropriée, donc pas besoin de s'inquiéter d'entrer dans un mode d'insertion ou de désactiver l'autoindent en premier.

Bien sûr, si vous travaillez à distance (console sur SSH, par exemple), cela ne fonctionnera pas et vous devriez aller en mode :set noai, Insérer, coller dans la console, laisser insertmode, :set ai route comme décrit ailleurs.

77
répondu thomasrutter 2011-11-05 07:45:24

Les utilisateurs de Mac peuvent éviter le formatage automatique en lisant directement à partir du tableau avec:

:r !pbpaste
36
répondu maniacalrobot 2013-08-28 12:58:25

Voici un post par quelqu'un qui a compris comment remapper la pâte événement automatiquement tourner la pâte mode et puis revenir. Fonctionne pour moi dans tmux / iTerm sur MacOSX.

18
répondu Von 2014-02-08 20:30:22

Bien que le réglage du mode coller avec paste/nopaste/pastetoggle soit parfaitement correct, vous devez toujours activer manuellement le mode coller avant de coller et désactiver le mode coller après le collage. Étant la personne paresseuse que je suis, voici la meilleure solution que j'ai trouvée jusqu'à présent, qui bascule automatiquement le mode coller lorsque vous collez.

Voici une petite astuce qui utilise le mode de collage entre crochets du terminal pour définissez/désactivez automatiquement le mode coller de Vim lorsque vous collez. Mettre la suite dans votre .vimrc:

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

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

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

Maintenant, vous pouvez coller sans activer/désactiver explicitement le mode coller - c'est géré automatiquement pour vous.

Source: Coderwall

15
répondu thdoan 2016-07-08 04:00:35

Ajouter à votre ~/.vimrc et vous n'aurez qu'à appuyer sur F2 avant et après le collage de:

set pastetoggle=<F2>
12
répondu anh_ng8 2015-03-22 17:27:05

Je viens de mettre set clipboard=unnamed dans mon .vimrc. Cela rend la carte de tampon de pâte par défaut dans le presse-papiers de X.

Donc, si je marque un peu de texte dans un terminal, il me suffit d'appuyer sur p coller dans vim. De même, je peux tirer des choses dans vim (par exemple YY pour tirer la ligne actuelle dans le tampon) et cliquer au milieu dans n'importe quelle fenêtre pour la coller.

Je sais pas. Je trouve ça super pratique.

9
répondu Soren 2015-01-20 11:15:37

Lorsque vous travaillez à l'intérieur d'un terminal, le plugin vim-bracketed-paste vim gère automatiquement les pâtes sans avoir besoin de frappes avant ou après la pâte.

Cela fonctionne en détectant le mode de collage entre crochets qui est une séquence d'échappement envoyée par des terminaux compatibles" modernes " à terme X comme iTerm2, gnome-terminal et d'autres terminaux utilisant libvte. En prime, cela fonctionne également pour les sessions tmux. Je l'utilise avec succès avec iTerm2 sur un Mac se connectant à un linux serveur et en utilisant tmux.

9
répondu studgeek 2016-04-09 03:53:21

Collez ceci dans votre ~/.vimrc et être heureux:

" enables :Paste to just do what you want
command Paste execute 'set noai | insert | set ai'

Edit: en réflexion, :r !cat est une bien meilleure approche car elle est courte, sémantique et ne nécessite aucun vimrc personnalisé. Utiliser à la place!

6
répondu Dergachev 2013-12-09 21:21:59

Cela fonctionne pour moi (cas pour + register, ce que j'utilise comme un tampon d'échange entre aps):

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
3
répondu Sergey Vakulenko 2012-06-01 15:53:47

Bien que :pastetoggle ou :paste et :nopaste devraient fonctionner correctement (s'ils sont implémentés - ils ne sont pas toujours comme nous pouvons le voir dans la discussion), je recommande fortement de coller en utilisant l'approche directe "+p ou "*p et de lire avec "+r ou "*r:

Vim a accès à dix types de registres (:help registers) et de l'interlocuteur est intéressé à quotestar et quoteplus section

  1. registres de sélection et de dépôt "*, "+ et " ~

Utilisez ces registres pour stocker et récupérer le texte sélectionné pour L'interface graphique. Voir quotestar et quoteplus. Lorsque le presse-papiers n'est pas disponible ou pas en travaillant, le registre sans nom est utilisé à la place. Pour les systèmes Unix le presse papiers n'est disponible que lorsque la fonction + xterm_clipboard est présente. {pas dans Vi}

Notez qu'il n'y a qu'une distinction entre "* et "+ pour les systèmes X11.

:help x11-selection outre des précisions sur la différence de * et +:

                                                  quoteplus quote+

Il y en a trois sélections x documentées: primaire (qui devrait représente la sélection visuelle actuelle-comme dans le mode visuel de Vim), secondaire (qui est mal défini) et le presse-papiers (qui devrait être utilisé pour couper, copier et coller).

De ces trois, Vim utilise primaire lors de la lecture et de l'écriture du " * register (par conséquent, lorsque les sélections X11 sont disponibles, Vim définit une valeur par défaut pour 'presse-papiers' de "autoselect"), et presse-papiers lors de la lecture et de l'écriture du "+ inscrire. Vim n'accède pas à la sélection secondaire.

Exemples: (en supposant les valeurs d'option par défaut)

  • Sélectionnez une URL en mode visuel dans Vim. Accédez à votre navigateur et cliquez sur bouton du milieu de la souris dans le champ de texte URL. Le texte sélectionné sera inséré (je l'espère!). Remarque: dans Firefox, vous pouvez définir le middlemouse.contentLoadURL préférence à true dans about: config, puis le URL sélectionnée sera utilisée lorsque vous appuyez sur le bouton du milieu de la souris dans la plupart lieux dans la fenêtre.

  • Sélectionnez du texte dans votre navigateur en les faisant glisser avec la souris. Aller à Vim et appuyez sur le bouton central de la souris: Le texte sélectionné est inséré.

  • sélectionnez du texte dans Vim et faites " + Y. allez dans votre navigateur, sélectionnez du texte dans un champ de texte en faisant glisser avec la souris. Maintenant, utilisez le bouton droit de la souris et sélectionnez "Coller" dans le menu contextuel. Le texte sélectionné est remplacé par texte de Vim. Notez que le texte dans le "+ registre reste disponible lors de la réalisation D'un visuel sélection, qui rend d'autres textes disponibles dans le registre"*. Qui permet écrasement du texte sélectionné.
3
répondu codingdave 2017-04-18 06:20:48

Si vous êtes sur un mac, macvim semble gérer sans avoir à basculer coller.

Brew install macvim --remplacer le système de vim

2
répondu Marcus Ericsson 2014-05-18 14:05:27

Veuillez lire cet article: basculer l'indentation automatique pour la pâte de code

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
1
répondu d.danailov 2015-07-01 11:18:44

Le moyen le plus rapide que je connaisse pour passer rapidement en mode coller-insérer pour une pâte one-shot est unimpaired de tpope, qui comporte yo et yO, vraisemblablement mnémoniques pour "vous ouvrez". Ils ne sont documentés que dans son vimdoc, comme:

Une bascule n'a pas été fournie pour 'paste' car le cas d'utilisation typique de l'emballage d'une insertion Solitaire est si inutile: vous basculez deux fois, mais vous ne collez qu'une seule fois (YOPO). Au lieu de cela, appuyez sur yo ou yO pour appeler o ou O avec 'coller' déjà défini. Quitter le mode insertion définit automatiquement "nopaste".

1
répondu Micah Elliott 2015-08-13 21:00:21

Une autre façon de coller est via <CR> et de supprimer le contenu du registre (ici le registre global). Voir: :h i_ctrl-r et h i_CTRL-R_CTRL-O.

De la documentation d'aide vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

Donc, pour coller le contenu dans vim sans indentation automatique, Utilisez <CR><CO>* dans la plupart des systèmes unix.

Note: cela ne fonctionne que si vim est compilé avec clipboard.

0
répondu TheChetan 2017-08-16 11:17:37

Malheureusement, j'ai trouvé que le plugin vim mentionné ne fonctionnait pas avec iTerm2 3.0.15 ( pour être juste, Je ne sais pas si cela a cassé sur les anciennes versions) - mais j'ai trouvé ce hack à la place.

Map commande-p pour faire le coller et en utilisant les touches vim iTerm2. Évidemment, cela ne fonctionne que pour iTerm2.

Comment ça marche. J'utilise "jk" pour entrer en mode d'échappement, donc vous aurez également besoin de:

: inoremap jk

Dans votre .vimrc.

Ensuite, il appelle simplement P pour entrer en mode coller, " + p pour coller à partir du presse-papiers et puis P pour désactiver le mode coller. hth.

entrez la description de l'image ici

0
répondu Neil McGill 2017-09-16 01:05:46

De vim: ]p

À Partir de l'extérieur: "*]p ou "+]p

0
répondu Bruno 2018-07-22 17:07:43