Je veux avoir un moyen rapide de définir l' 'paste'
option Vim , d'insérer du texte et de revenir à la valeur précédente de 'paste'
.
Un cas d'utilisation typique insère littéralement le contenu du presse-papiers du système d'exploitation, quelle que soit la réécriture du mode d'insertion qui peut être active, comme l'indentation automatique, et sans changer l'état de Vim. Un autre cas d'utilisation serait de permettre à une fonction de macro du système d'exploitation d'injecter des touches dans Vim et de les faire interpréter comme du texte littéral.
Cela se généralise évidemment à d'autres options - l'idée générale est de définir certaines options mais uniquement pour la durée d'un trajet en mode insertion.
Fondamentalement, je veux lier une séquence de touches (disons _i
) à une macro qui fait cela
:set paste
i…<Esc>
:set nopaste
où i…<Esc>
je veux dire passer en mode insertion (comme avec la i
commande) et reprendre la macro au retour en mode commande, sauf que je veux finir avec le 'paste'
toujours actif s'il était actif auparavant. Comment puis-je faire ceci?
Remarque: Le contenu du presse-papiers du système d'exploitation est mappé sur le "*
registre . Lorsque cela fonctionne, l' 'paste'
option n'est pas très utile. Le scénario motivant pour cette question est pour les moments où les conditions de "*
prise en charge de l'enregistrement ne sont pas remplies - Vim n'est pas compilé avec la +xterm_clipboard
fonctionnalité, ou il s'exécute dans un terminal tel que Screen ou sur SSH qui l'isole du serveur X ambiant.
la source
+
ou de vous*
inscrire?Réponses:
Essayez ceci:
Il stocke votre état de collage actuel dans la variable inPaste et définit le collage s'il n'est pas déjà défini. Ensuite, il configure un autocmd lorsque vous quittez le mode d'insertion, puis vous met en mode d'insertion.
Lorsque vous quittez le mode d'insertion, il exécute l'autocmd, qui supprime d'abord l'autocmd (de sorte qu'il ne s'exécute pas lorsque vous quittez le mode d'insertion d'une autre manière), et définit enfin nopaste si vous n'étiez pas en mode collage à l'origine.
De plus, si vous utilisez vim dans un terminal, vous voudrez peut-être jeter un œil à vim-bracketed-paste , qui utilise la fonction de mode de collage entre crochets fournie par plusieurs émulateurs de terminal pour détecter si vous collez et définir le mode automatiquement.
Edit: correction du script
la source
_i
, l'paste
option est désactivée, même si elle était activée avant.'paste'
doit être actif aussi longtemps que possible. Il désactive de nombreuses fonctionnalités (y compris les cartes), car son seul but est d'éviter une mauvaise interprétation du texte collé. En tant que tel, je pense que l'exigence citée ne devrait pas vraiment être nécessaire.Cela étant dit, il est en fait assez facile de coller sans avoir besoin de définir
'paste'
. Si vous exécutez gvim ou avez+xterm_clipboard
dans la console vim, vous pouvez simplement utiliser"+p
pour coller à partir du presse-papiers du système d'exploitation.Le problème de l'indentation automatique lors du collage ne se produit vraiment que dans deux scénarios. Insérer le contenu d'un registre en mode insertion (
<C-r>+
) ou cliquer avec le bouton du milieu avec la souris.Au lieu d'insérer le contenu d'un registre en mode insertion, le collage à partir du registre en mode normal évitera le problème de reformatage.
Si vous souhaitez cliquer avec le bouton du milieu avec la souris, utilisez l'
'mouse'
option pour laisser Vim, au lieu du terminal, gérer le clic du milieu. Vim insérera alors le contenu littéralement au lieu d'interpréter le texte entrant comme étant tapé.la source
'paste'
n'est en effet pas actif au préalable, mais je ne veux pas avoir à y penser. Je travaille souvent dans un Vim qui n'a pas accès au presse-papiers ou à la souris X, soit parce que ma build Vim n'a pas laxterm_clipboard
fonctionnalité, soit parce que je travaille par exemple dans une session Screen qui est actuellement attachée à un Terminal X.i
, je ne demande pas comment paramétrer cela), et restaurer la valeur de l'option au retour du mode insertion."*p
ou"+p
coller à partir des presse-papiers, mais je ne veux pas utiliser les capacités de collage du système"), puis cette réponse est inutile. Ou vous ne le faites pas, et je pense que cette réponse a sa place ici.Personnellement, j'utilise le yoraccourci clavier de l'excellent plugin vim- unimpaired de Tim Pope pour exactement cette raison. D'après sa documentation:
Il peut être exagéré d'installer le plugin simplement pour votre question, mais je trouve qu'il fournit également une multitude d'autres raccourcis clavier utiles (plus d'informations dans le fichier README ).
la source
Avec Vim 8+ sur Linux ou Mac, vous pouvez maintenant simplement utiliser la pâte native du terminal (par exemple le bouton central de la souris,
ctrl+shift+V
dans Gnome,cmd+V
sur Mac) si le terminal prend en charge la pâte entre crochets. N'appuyez pasi
pour le mode d'insertion.Il collera le contenu de votre presse-papiers du système d'exploitation, en préservant les espaces et les tabulations sans ajouter d'indentation automatique. Il est équivalent à l'ancienne
:set paste
,i
,ctrl+shift+V
,esc
,:set nopaste
méthode.Vous n'avez même plus besoin d'installer les fonctionnalités
+clipboard
ou+xterm_clipboard
vim. Cette fonction est appelée "coller entre crochets". Pour plus de détails, voir /programming/2514445/turning-off-auto-indent-when-pasting-text-into-vim/56781763#56781763la source