69 votes

Collage de code dans la fenêtre du terminal dans vim sous Mac OS X

Lorsque je colle du code dans la fenêtre du terminal Mac OS X dans vim, il met en retrait chaque ligne. Pour chaque ligne, il ajoute un retrait afin que le texte ressemble à ceci ...

 "ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud        
   ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
        reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
             Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
                    deserunt mollit anim id est laborum."
 

Ma solution actuelle consiste à coller d'abord le texte dans l'éditeur de texte de textmate, qui conserve le formatage correct. Ensuite, je sauvegarde ce fichier et l’ouvre dans vim. Ensuite, j'utilise vim yank pour le coller.
Existe-t-il un paramètre dans mon fichier .vimrc qui pourrait changer ce comportement? Ou est-ce un problème terminal?

116voto

Chris Page Points 8523

Comme de Mac OS X Lion 10.7, Terminal supporte les "crochets à coller mode", qui permet à l'émulateur de terminal pour indiquer au programme relié à l'ats lorsque l'utilisateur colle du texte, de sorte que le programme ne sera pas l'interpréter comme des commandes d'édition. Des programmes qui prennent en charge l'envoyer au terminal une séquence d'échappement pour activer ce mode, dans lequel le terminal entoure le texte collé avec une paire de séquences d'échappement qui permettent d'identifier le début et la fin.

Pour activer cette fonction dans Vim, placez le code suivant dans votre ~/.fichiers vimrc:

if &term =~ "xterm.*"
    let &t_ti = &t_ti . "\e[?2004h"
    let &t_te = "\e[?2004l" . &t_te
    function XTermPasteBegin(ret)
        set pastetoggle=<Esc>[201~
        set paste
        return a:ret
    endfunction
    map <expr> <Esc>[200~ XTermPasteBegin("i")
    imap <expr> <Esc>[200~ XTermPasteBegin("")
    cmap <Esc>[200~ <nop>
    cmap <Esc>[201~ <nop>
endif

Ce qu'il fait en sorte que lorsque Vim commutateurs le terminal/de l'autre de l'écran† (t_ti, t_te) active/désactive les crochets à pâte mode (ESC [? 2004 h, ESC [? 2004 l). Lorsqu'il reçoit la séquence d'échappement indiquant le début d'une pâte (ESC [ 200 ~), il permet de Coller mode (set coller) et passe en mode Insertion, si nécessaire ("je"). Lorsqu'il reçoit la correspondance de fin de coller marqueur (ESC [ 201 ~) il désactive les Coller mode (pastetoggle) et reste en mode Insertion. L' cmap des commandes de prendre des dispositions pour le Vim ligne de commande pour ignorer les séquences d'échappement et d'accepter le texte collé.

Noter que cette fonction ne permet crochets à coller mode lorsque l' $valeur à long TERME commence par "xterm..."; si vous êtes paramètre $TERME à quelque chose d'autre, vous souhaiterez peut-être réviser le test d'inclure votre $valeur à long TERME. Ou, vous pouvez omettre le test tout à fait, car il n'est pas strictement nécessaire-il est juste d'essayer d'être prudent de ne pas faire quelque chose qui pourrait être incompatible avec un autre type de terminal.

Dans le Terminal, cela fonctionne avec tous les différents Coller des commandes, ainsi que de glisser-déposer.

† Le terminal dispose d'un écran principal et un "autre" de l'écran. Chaque écran dispose de son propre contenu et de l'état. Texte à l'autre de l'écran ne défile pas dans la scrollback journal. Il est généralement utilisé par des programmes qui prennent en charge le contrôle de la totalité de l'écran et sont donc appelés "plein écran". Cela comprend vim, emacs, et moins haut, par exemple.

86voto

William Pursell Points 56211

Dans vim:

 :set paste
 

Mettez Vim en mode Coller. Ceci est utile si vous voulez couper ou copier du texte d'une fenêtre et le coller dans Vim. Cela évitera des effets inattendus.

10voto

Aaron Jensen Points 2751

Une autre façon de faire cela, en supposant que votre presse-papiers système est correctement configuré, est de le faire.

 "+p
 

Cela va coller du presse-papiers du système.

9voto

dancavallaro Points 5639

En plus des autres réponses, si vous voulez un moyen rapide de basculer en mode coller, ajoutez

 set pastetoggle=<F2>
 

à votre .vimrc. Vous pouvez maintenant basculer en mode Coller en appuyant sur F2 (ou sur la touche de votre choix).

7voto

WenbinWu Points 76

En vim

: définir la pâte

quand vous voulez le désactiver

: set nopaste

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X