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

Je fais l’effort d’apprendre Vim.

Lorsque je colle du code dans mon document depuis le presse-papier, 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 car j’ai d’autres parameters en conflit ou quelque chose (ce qui semble assez évident dans mon fichier .vimrc, mais cela n’a pas d’importance quand je les retire).

Comment puis-je désactiver l’indentation automatique lorsque je colle du code mais que Vim auto indent quand 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 

Pour désactiver l’auto-indexage lorsque vous collez du code, il existe un mode spécial “coller”.

Type

 :set paste 

Puis 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 Coller afin que le retrait automatique lors de la frappe fonctionne à nouveau correctement.

 :set nopaste 

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

 set pastetoggle= 

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

 set paste 

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

J’utilise habituellement :r! cat :r! cat puis collez ( shift + insert ) le contenu et CTRL+D

Pas besoin d’activer et de désactiver l’utilisation directe.

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

"+p

Ceci est une commande appropriée de vim, donc pas besoin de s’inquiéter d’entrer dans un mode d’insertion ou de désactiver d’abord l’auto-index.

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

Les utilisateurs de Mac peuvent éviter la mise en forme automatique en lisant directement depuis la table de assembly avec:

 :r !pbpaste 

Voici un article de quelqu’un qui a compris comment remapper l’événement coller pour activer automatiquement le mode de collage puis le désactiver. Fonctionne pour moi dans tmux / iTerm sur MacOSX.

Ajoutez ceci à votre ~/.vimrc et vous n’aurez qu’à appuyer sur F2 avant et après avoir collé:

 set pastetoggle= 

Bien que le réglage du mode paste/nopaste/pastetoggle avec paste/nopaste/pastetoggle soit parfait, vous devez toujours activer manuellement le mode Coller avant de coller et désactiver le mode Coller après le collage. Être la personne paresseuse que je suis, ci-dessous est la meilleure solution que j’ai trouvée jusqu’à présent, qui bascule automatiquement le mode de collage lorsque vous collez.

Voici un petit truc qui utilise le mode de collage entre crochets du terminal pour définir / désactiver automatiquement le mode de collage de Vim lorsque vous collez. Mettez la suite dans votre .vimrc:

 let &t_SI .= "\[?2004h" let &t_EI .= "\[?2004l" inoremap   [200~ XTermPasteBegin() function! XTermPasteBegin() set pastetoggle=[201~ set paste return "" endfunction 

Vous pouvez maintenant coller sans activer / désactiver explicitement le mode Pâte – il est géré automatiquement pour vous.

Source: Coderwall

Je mets juste set clipboard=unnamed dans mon .vimrc. Cela rend la carte tampon tampon par défaut dans le presse-papiers de X.

Donc, si je marque un bout de texte dans un terminal, je peux simplement appuyer sur p pour le coller dans vim. De la même façon, je peux ramasser les choses en vim (par exemple, YY pour retirer la ligne actuelle dans le tampon) et cliquer au milieu sur n’importe quelle fenêtre pour la coller.

Dunno Je trouve ça super pratique.

Lorsque vous travaillez dans un terminal, le plug-in vim-bracketed-paste vim gère automatiquement les pâtes sans avoir besoin de touches avant ou après le collage.

Il fonctionne en détectant le mode de collage entre crochets qui est une séquence d’échappement envoyée par des terminaux compatibles “x” modernes 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.

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 reflection,: :r !cat est une approche bien meilleure car elle est courte, sémantique et ne nécessite pas de vimrc personnalisé. Utilisez-le plutôt!

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

 imap   :set noai+:set ai 

Bien que :pastetoggle ou :paste and :nopaste devrait fonctionner :nopaste (si implémenté – ils ne sont pas toujours comme on peut le voir dans la discussion), je recommande fortement le collage en utilisant l’approche directe "+p ou "*p et lecture avec "+r ou "*r :

Vim a access à dix types de registres (registres d’ :help registers ) et l’intervenant s’intéresse à quotestar et à quoteplus de la section

  1. Les registres de sélection et de suppression "* , "+ 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 ne fonctionne pas, 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 clarifie davantage la différence entre * et + :

  quoteplus quote+ 

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

De ces trois, Vim utilise PRIMARY lors de la lecture et de l’écriture du registre “* (lorsque Vim définit les sélections X11, il définit une valeur par défaut pour” Presse-papiers “de” sélection automatique “) et CLIPBOARD lors de la lecture du 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 Visual dans Vim. Accédez à votre navigateur et cliquez sur le bouton central de la souris dans le champ de texte URL. Le texte sélectionné sera inséré (espérons-le!). Remarque: dans Firefox, vous pouvez définir la préférence middlemouse.contentLoadURL sur true dans about: config, puis l’URL sélectionnée sera utilisée en appuyant sur le bouton central de la souris dans la plupart des endroits de la fenêtre.

  • Sélectionnez du texte dans votre navigateur en faisant glisser avec la souris. Allez dans 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 de Vim. Notez que le texte dans le registre “+ rest disponible lors d’une sélection visuelle, ce qui rend un autre texte disponible dans le registre” *. Cela permet de remplacer le texte sélectionné.

Si vous êtes sur un mac, macvim semble bien le gérer sans avoir à faire un collage.

armser installer macvim –override-system-vim

Veuillez lire cet article: Activer l’indentation automatique pour le collage de code

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

 nnoremap  :set invpaste paste? set pastetoggle= set showmode 

Le moyen le plus rapide dont je suis au courant pour passer rapidement en mode d’insertion de pâte pour un simple-copier-coller est inaltéré, avec yo et yO , probablement des mnémoniques pour «vous ouvrez». Ils sont seulement documentés dans son vimdoc, comme:

Une bascule n’a pas été fournie pour «coller» car le cas d’utilisation typique de l’encapsulation 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 ‘paste’ déjà défini. Quitter le mode d’insertion définit automatiquement «nopaste».

Une autre façon de coller est via 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 de vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

Pour coller le contenu dans vim sans indentation automatique, utilisez * dans la plupart des systèmes Unix.

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

Malheureusement, j’ai trouvé que le plug-in vim mentionné ne fonctionnait pas avec iTerm2 3.0.15 (pour être honnête, je ne sais pas si cela a cassé sur les anciennes versions) – mais j’ai trouvé ce hack à la place.

Mapper la commande-p pour faire le collage et utiliser les clés iTerm2 vim. De toute évidence, cela ne fonctionne que pour iTerm2.

Comment ça marche. J’utilise “jk” pour entrer en mode d’échappement, vous aurez donc besoin de:

: inoremap jk

dans votre .vimrc.

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

entrer la description de l'image ici

De vim: ]p

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