web-dev-qa-db-fra.com

Désactivation du retrait automatique lors du collage de texte dans vim

Je fais l'effort d'apprendre Vim.

Lorsque je colle du code dans le document à partir du Presse-papiers, des espaces supplémentaires apparaissent au début de chaque nouvelle ligne:

line
  line
    line

Je sais que vous pouvez désactiver le retrait automatique, mais je ne parviens pas à le faire fonctionner car d'autres paramètres sont en conflit ou similaires (ce qui est assez évident dans mon .vimrc mais qui ne semble pas avoir d'importance lorsque je les supprime). 

Comment désactiver l'indentation automatique lorsque je colle du code tout en conservant l'indentation automatique de vim lorsque j'écris du code? Voici mon fichier .vimrc:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  
1021
Rimian

Mise à jour: Mieux répondre ici: https://stackoverflow.com/a/38258720/62202

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

Type 

:set paste

Ensuite, collez votre code. Notez que le texte dans l'info-bulle indique maintenant -- INSERT (paste) --.

Après avoir collé votre code, désactivez le mode Collé afin que l'auto-indentation lorsque vous tapez fonctionne à nouveau correctement.

:set nopaste

Cependant, j'ai toujours trouvé cela encombrant. C'est pourquoi je mappe <F3> de sorte qu'il puisse basculer entre les modes coller et nopaste en modifiant le texte! J'ajoute ceci à .vimrc

set pastetoggle=<F3>
1811
P Shved

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

set paste

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

251
Jacob R

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

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

123
thegeek

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

"+p

Il s'agit d'une commande vim appropriée, vous n'avez donc pas à vous soucier de passer en mode insertion ou de désactiver tout d'abord l'autoindent.

Bien sûr, si vous travaillez à distance (console sur SSH, par exemple), cela ne fonctionnera pas et vous devrez passer à :set noai, mode insertion, coller dans la console, laissez insertmode, :set ai comme décrit ailleurs.

82
thomasrutter

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

:r !pbpaste
37
maniacalrobot

Bien que définir le mode de collage avec paste/nopaste/pastetoggle soit parfaitement correct, vous devez toujours activer manuellement le mode de collage avant de coller et désactiver le mode de collage 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 un petit truc qui utilise le mode coller entre crochets du terminal pour définit/désactive automatiquement le mode coller de Vim lorsque vous collez. Mettez suivant 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 traité automatiquement pour vous.

Source: Coderwall

Remarque: Cette solution ne fonctionne pas dans WSL (Windows 10 Subsystem for Linux). Si quelqu'un a une solution pour WSL, veuillez mettre à jour cette réponse ou l'ajouter dans les commentaires.

Tmux Si vous utilisez tmux, les déclarations doivent être échappées deux fois. Le code correspondant est également dans Coderwall

27
thdoan

Voici un article de quelqu'un qui a découvert comment remapper l'événement Coller pour activer automatiquement le mode Coller, puis le désactiver. Fonctionne pour moi dans tmux/iTerm sur MacOSX.

19
Von

Ajoutez ceci à votre ~/.vimrc et il vous suffira d'appuyer sur F2 avant et après le collage:

set pastetoggle=<F2>
12
anh_ng8

Lorsque vous travaillez à l'intérieur d'un terminal, le plug-in vim-bracketed-paste vim gérera automatiquement les pâtes sans que vous ayez besoin d'une frappe au clavier avant ou après la pâte.

Il fonctionne en détectant le mode coller entre crochets qui est une séquence d'échappement envoyée par des terminaux "modernes" compatibles avec x-term tels que iTerm2, gnome-terminal et d'autres terminaux utilisant libvte. En prime, cela fonctionne aussi pour les sessions tmux. Je l'utilise avec succès avec iTerm2 sur un Mac se connectant à un serveur Linux et utilisant tmux.

9
studgeek

Je viens de mettre set clipboard=unnamed dans mon fichier .vimrc. Cela rend le mappage de tampon de collage par défaut au presse-papiers de X.

Donc, si je marque un peu de texte dans un terminal, je peux simplement appuyer sur p pour le coller dans vim. De même, je peux extraire des éléments dans vim (par exemple, YY pour extraire la ligne courante dans la mémoire tampon) et cliquer du milieu dans une fenêtre pour la coller.

Dunno. Je trouve ça super pratique.

9
Soren

Collez ceci dans votre ~/.vimrc et soyez heureux:

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

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

7
Dergachev

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

Vim a accès à dix types de registres (:help registers) et le questionneur s'intéresse à quotestar et quoteplus de la section

  1. Sélection et suppression des registres "*, "+ 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 fonctionne, le registre non nommé est utilisé à la place. Pour les systèmes Unix, le presse-papiers est disponible uniquement lorsque la fonctionnalité + 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 clarifie encore la différence entre * et +:

                                                  quoteplus quote+

Il existe trois sélections X documentées: PRIMARY (qui devrait représenter Représente la sélection visuelle actuelle - comme dans le mode visuel de Vim), SECONDARY (ce qui est mal défini) et CLIPBOARD (qui devrait être utilisé pour les opérations couper, copier et coller).

Parmi ceux-ci, Vim utilise PRIMARY pour lire et écrire le "* registre (Ainsi, lorsque les sélections X11 sont disponibles, Vim définit une valeur par défaut pour '. Presse-papiers' de" sélection automatique "), et CLIPBOARD lors de la lecture et de écrire le "+ registre. 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. Allez sur votre navigateur et cliquez sur le bouton central de la souris dans le champ de texte de l'URL. Le texte sélectionné sera inséré (j'espère!). Remarque: dans Firefox, vous pouvez définir le La préférence de middlemouse.contentLoadURL est vraie dans about: config, puis le l'URL sélectionnée sera utilisée lorsque vous appuierez sur le bouton central de la souris dans la plupart des endroits de la fenêtre.

  • Sélectionnez du texte dans votre navigateur en le faisant glisser avec la souris. Allez à 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 le 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 écrasé par le texte De Vim . Notez que le texte du registre "+ reste disponible lors de la création d'un Visual selection, ce qui rend les autres textes disponibles dans le registre "*. Cela permet d'écraser le texte sélectionné.
3
codingdave

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

imap <silent> <S-Insert> <C-O>:set noai<CR><C-R>+<C-O>:set ai<CR>
3
Sergey Vakulenko

Si vous êtes sur un Mac, macvim semble bien le gérer sans avoir à basculer de coller.

brasser installer macvim --override-system-vim

2
Marcus Ericsson

La pâte native/pâte entre crochets est le moyen le plus simple et le meilleur depuis vim 8 (publié en 2016). Cela fonctionne même sur SSH! (La pâte entre crochets fonctionne sous Linux et Mac, mais pas dans Windows Git Bash)

  1. Assurez-vous que vous avez vim 8+ (vous n’avez pas besoin des options +clipboard ou +xterm_clipboard).

    vim --version | head -1

  2. Utilisez simplement la commande de collage natif du système d’exploitation (par exemple ctrl+shift+V ou cmd+V) en mode normal. N'appuyez pas sur i pour le mode Insertion.


Test

  1. Copiez (ctrl+shift+C ou cmd+C) la sortie de celle-ci (2 lignes avec un retrait de tabulation) dans le presse-papiers du système:

    echo -e '\ta\n\tb'

  2. Lancer un vim propre 8+ avec autoindent:

    vim -u NONE --noplugin -c 'set autoindent'

  3. Collez depuis le presse-papiers du système (ctrl+shift+V ou cmd+V) en mode normal. N'appuyez pas sur i pour le mode Insertion. Les variables a et b doivent être alignées sur un seul retrait de tabulation. Vous pouvez même le faire en ssh-ing sur une machine distante (la machine distante aura besoin de vim 8+).

  4. Essayez maintenant l’ancienne méthode, qui identifiera automatiquement la deuxième ligne avec un onglet supplémentaire: Appuyez sur i pour le mode d’insertion. Collez ensuite en utilisant ctrl+shift+V ou cmd+V. Les a et b sont maintenant mal alignés.


Installation de Vim 8

2
wisbucky

Le moyen le plus rapide que je connaisse pour passer rapidement en mode insertion/insertion pour une pâte one-shot est de tpope's unimpaired , qui comporte yo et yO, probablement des mnémoniques pour ” Ils ne sont documentés que dans vimdoc, en tant que:

Une bascule n'a pas été fournie pour 'coller' car le cas d'utilisation typique de L’emballage d’une insertion en solitaire est une perte de temps: vous basculez deux fois, mais vous ne collez qu'une seule fois (YOPO). Appuyez à la place sur yo ou yO pour appeler o ou O avec 'coller' déjà défini. Quitter le mode insertion définit automatiquement «nopaste».

1
Micah Elliott

Veuillez lire cet article: Activer le retrait automatique pour le code coller

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

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode
1
d.danailov

De vim: ]p

De l'extérieur: "*]p ou "+]p

0
Bruno

Malheureusement, j'ai constaté que le plug-in vim ne fonctionnait pas avec iTerm2 3.0.15 (pour être juste, je ne sais pas si cela fonctionnait sous les anciennes versions) - mais j'ai trouvé ce hack à la place.

Mappez la commande-p pour faire le collage et utilisez les touches iTerm2 vim. Évidemment, cela ne fonctionne que pour iTerm2.

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

: inoremap jk 

dans votre .vimrc.

Ensuite, il appelle simplement P pour entrer en mode coller, "+ p pour coller dans le presse-papiers, puis P pour désactiver le mode coller. Hth.

 enter image description here

0
Neil McGill

Une autre réponse que je n'ai pas vue jusqu'à présent:

:se paste noai
0
sjas