Coller en mode insertion?

385

Est-il possible de coller en mode insertion dans Vim?

Amir Rachum
la source

Réponses:

465

En mode insertion, appuyez sur CTRL-R {register}

Exemples:

  • CTRL-R * insérera dans le contenu du presse-papiers
  • CTRL-R " (le registre sans nom) insère la dernière suppression ou copie.

Pour trouver cela dans l'aide de vim, tapez :h i_ctrl-r

David
la source
13
Oui, je n'ai appris que récemment CTRL-R et c'est extrêmement utile.
Dan
16
CTRL-R *ne fonctionne que dans GVIM ou dans les versions compilées pour interagir avec x. Tapez vim --versionet recherchez +xterm_clipboard. Si vous ne l'avez pas, vous avez besoin d'une version différente de vim. ( vim.wikia.com/wiki/Accessing_the_system_clipboard )
Conrad.Dean
10
En fait +clipboard, vous n'avez besoin que de cela , mais si vous en avez, +xterm_clipboardvous devriez l'avoir quand même. Sur certains systèmes d'exploitation xterm_clipboardn'est pas applicable.
Andrew Marshall
1
Hmm, j'utilise C-r + pour coller à partir du presse-papiers du système sous Windows (en utilisant GVim portable)? Jamais entendu parler de * s'inscrire.
kitsu.eb
6
@ kitsu.eb Sur les systèmes X, le *registre est collable avec un clic du milieu avec +le copier / coller traditionnel. standards.freedesktop.org/clipboards-spec/clipboards-latest.txt
amc
235

Si vous ne voulez pas vim pour le formatage dans mangle entrant texte collé, vous pouvez également envisager d' utiliser: :set paste. Cela empêchera Vim de ré-tabuler votre code. Une fois le collage terminé,:set nopaste reviendra au comportement normal.

Il est également possible de basculer le mode avec une seule touche, en ajoutant quelque chose comme set pastetoggle=<F2>à votre .vimrc. Plus de détails sur le basculement du retrait automatique sont ici .

James Snyder
la source
47
:set nopastedésactivera le mode collage
James Snyder
24
@JamesSnyder Une meilleure façon de procéder est :set paste!probablement que le collage est très proche de votre historique de commandes, vous pouvez donc simplement appuyer sur ':', puis sur une flèche vers le haut et ajouter un '!'.
Rafael Barbosa
6
Juste curieux - ce qui est mieux ou différent à propos de :set paste! Merci :)
Michael Durrant
33
le !à la fin de la commande vimactive ou désactive la commande. De cette façon, vous n'avez pas à taper à la :set nopasteplace, vous pouvez faire défiler votre historique et exécuter à nouveau la même commande ( :set paste!).
에이 바
3
@blockloop Vous êtes censé l'activer lors du collage et le désactiver juste après.
NieDzejkob
125

Non pas directement. Cependant, vous pouvez quitter rapidement le mode insertion pour une seule opération en mode normal avecCtrl-O puis coller à partir de là, ce qui se terminera par vous remettre en mode d'insertion.

Combo clé: Ctrl-O p

EDIT: Intéressant. Il semble qu'il existe un moyen, comme plusieurs autres personnes l'ont indiqué.

JaredPar
la source
2
ctrl-r "ne fonctionne pas pour moi (os x, vi dans un terminal). ctrl-o p l'a fait.
Bob
4
C'est le moyen le plus rapide et le plus simple de se souvenir.
Pinpox
Et alors esc + p?
sitilge
2
Certainement plus rapide que esc + p + iet certainement plus facile à taper queCTRL-R + "
lucidbrot
En fait, cela se comporte parfois différemment de CTRL-R ". Par exemple, bien que les paramètres vimrc puissent changer cela, coller quelque chose dans une nouvelle ligne à l'aide de CTRL-O pson retrait disparaît.
noname
30

En mode insertion, vous pouvez utiliser Ctrl-R {register}, où le registre peut être:

  • + pour le presse-papiers,
  • * pour le presse-papiers X (dernier texte sélectionné en X),
  • " pour le registre sans nom (dernière suppression ou coup sec dans Vim),
  • ou plusieurs autres (voir :h registers).

Ctrl-R {register} insère le texte comme s'il avait été tapé.

Ctrl-R Ctrl-O {register} insère le texte avec le retrait d'origine.

Ctrl-R Ctrl-P {register} insère le texte et le met en retrait automatiquement.

Ctrl-Opeut être utilisé pour exécuter n'importe quelle commande en mode normal avant de revenir en mode insertion, il
Ctrl-O "+ppeut donc également être utilisé, par exemple.

Pour plus d'informations, consultez la documentation avec :h i_ctrl-r

Zaz
la source
4
Cette réponse semble être la plus complète. C'est très clair, et à mon avis, le plus utile. Il répond à la question du PO et à certaines, de manière concise.
Devvyn
26

Vous pouvez l'utiliser pour coller à partir du presse-papiers avec Ctrlv:

set pastetoggle=<F10>
inoremap <C-v> <F10><C-r>+<F10>

Et ce pour tirer la sélection visuelle dans le presse-papiers avec Ctrlc:

vnoremap <C-c> "+y

Si vous souhaitez également utiliser le presse-papiers par défaut pour le vim yanking / collage ( y/ p) classique en mode normal, voici une option de configuration qui le fait:

set clipboard=unnamedplus

Avec cette configuration, vous pouvez par exemple tirer d'abord en mode normal, puis coller avec Ctrlv en mode insertion. En outre, vous pouvez coller du texte à partir de différentes instances de vim et de différentes applications.

Une autre option est:

set clipboard=unnamed

Ensuite, vous pourrez simplement sélectionner quelque chose en faisant glisser la souris dans votre environnement X et le coller ensuite dans vim. Mais (pour une raison quelconque), vous ne pourrez pas tirer quelque chose ( y) dans Vim etshiftinsert ailleurs ailleurs, ce qui est probablement assez limitant.

Documents Vim à ce sujet: http://vim.wikia.com/wiki/Accessing_the_system_clipboard

Pour coller à partir de registres personnalisés, vous pouvez suivre les autres réponses :). Cette réponse concerne principalement l'intégration de Vim dans le presse-papiers de votre système.


Notez que pour set clipboard=unnamedpluset set clipboard=unnamedpour travailler, vous devez utiliser gvim ou vimx ( vim-X11): ceux-ci sont compilés avec +xterm_clipboard. Vous pouvez éventuellement mettre ceci dans votre .bashrcalias vimavec vimx:

if [ -e /usr/bin/vimx ]; then
    alias vim='/usr/bin/vimx'; # vim with +xterm_clipboard
fi

Vous pouvez savoir si votre vim a ou non +xterm_clipboardles informations fournies par vim --version.

climat
la source
7
Ceci est exactement ce que je cherchais. C'est aussi la seule réponse raisonnable ici. C'est ainsi que l'on s'attend à ce que les choses fonctionnent. Est-ce que quelqu'un sait pourquoi le comportement par défaut de :set pasteet le byzantin <leader><leader> * yest même souhaitable à distance? Pour ne pas avoir l'air trop engagé, je suis vraiment curieux de savoir quelle philosophie vim cela reflète, ou si ce n'est qu'un malheur historique.
Eschyle
Votre réponse m'a permis d'utiliser Shift + Insert dans Gvim également avec inoremap <S-Insert> <F12><C-r>+<F12>(j'utilise F12 comme pastetoggle). Merci.
sromero
20

Si vous définissez Vim pour utiliser le presse-papiers du système ( :set clipboard=unnamed), tout texte que vous copiez dans Vim peut être collé à l'aide de Shift+ Insert. Shift+ Insertest simplement une combinaison de touches de collage à l'échelle du système d'exploitation ( Ctrl+ Insertest la «copie» correspondante).

Volonté
la source
1
Je ne connaissais pas S-Insert :)
BandGap
Est-ce que cela fonctionne à l'envers? Va pcoller le texte dans le presse-papiers?
Zaz
Avant d'utiliser Shift + Insertpour coller le texte, nous devons être en mode insertion.
jdhao
18

Vous pouvez également utiliser le bouton central de la souris pour coller en mode insertion (Linux uniquement).

lcltj
la source
106
De quelle souris parles-tu?
Jim Mitchener
19
Quels sont ces OS non Linux dont vous parlez?
Bruno Bronosky
-1: Cette réponse dépend fortement du matériel et des paramètres du terminal. En fin de compte, les boutons de la souris envoient une chaîne prédéfinie au terminal, et le terminal analyse cette chaîne pour exécuter une certaine commande. Le problème est que cela peut varier considérablement en fonction des paramètres du terminal. Pour améliorer cette réponse, veuillez nous fournir au moins la version du terminal, le système d'exploitation et la version et le modèle de souris que vous utilisez.
melvynkim
La pâte du bouton du milieu de la souris est assez courante dans toutes les applications Linux, non limitée par les versions du terminal ou du système d'exploitation.
lcltj
Ne fonctionne pas dans Arch Linux + urxvt. Il ajoute seulement une nouvelle ligne.
zygimantus
5

Vous pouvez entrer en -- INSERT (past) --mode via:

  • Combo clavier: y p

ou

  • :set pasteet entrer en mode insertion ( :set nopastepour désactiver)

une fois dans -- INSERT (past) -- mode, utilisez simplement la fonction de collage de votre système (par exemple CtrlShiftvsous Linux, Cmdvsous Mac OS).

Cette stratégie est très utile lors de l'utilisation de vim sur ssh.

rudolph9
la source
4

Oui. Sous Windows Ctrl+V et Linux, appuyez sur les deux boutons de la souris presque simultanément.

Sous Windows, je pense que cette ligne dans mon _vimrc le fait probablement:

source $VIMRUNTIME/mswin.vim

Sous Linux, je ne me souviens pas comment je l'ai fait. Il semble que j'ai probablement supprimé une ligne du fichier .vimrc par défaut.

Programmeur Windows
la source
Puis-je voter plus d'une fois ?? Je veux seulement coller quand je viens d'une autre fenêtre - donc je suis toujours sur la souris. Brillant!
dave
Sous Linux, vous collez en appuyant sur le bouton central de la souris. Si vous avez une souris à deux boutons et appuyez sur les boutons gauche et droit, il faut alors "Emulate3Buttons" ou similaire pour fonctionner de cette façon.
Cougar
0

Coller en mode insertion

Une carte personnalisée semble appropriée dans ce cas. Voici ce que j'utilise pour coller des éléments tirés en mode insertion:

inoremap <Leader>p <ESC>pa

Ma Leaderclé ici est \; cela signifie que frapper \pen mode insertion collerait les éléments / lignes précédemment tirés.

Sheharyar
la source
0

Ajoutez simplement la carte:

" ~/.vimrc
inoremap <c-p> <c-r>*

redémarrez vim et lorsque vous appuyez sur Crtl+pen mode insertion, le texte copié sera collé

itsnikolay
la source