Question

Je fais l'effort d'apprendre Vim.

Quand je coller le code dans mon document du presse-papiers, je reçois des espaces supplémentaires au début de chaque nouvelle ligne:

line
  line
    line

Je sais que vous pouvez désactiver l'auto-indentation, mais je ne peux pas le faire travailler parce que j'ai d'autres paramètres contradictoires ou quelque chose (qui ont l'air assez évident dans mon .vimrc mais ne semblent pas à la matière quand je les sors ).

Comment puis-je désactiver automatiquement quand indenter je coller le code mais encore l'auto-indentation vim quand je suis en train d'écrire le code? Voici mon fichier .vimrc:

set expandtab  
set tabstop=2  
set shiftwidth=2  
set autoindent  
set smartindent  
set bg=dark  
set nowrap  
Était-ce utile?

La solution

Mise à jour: Meilleure réponse ici: https://stackoverflow.com/a/38258720/62202

Pour désactiver autoindent lorsque vous collez le code, il y a un mode spécial "coller".

Type

:set paste

Ensuite, collez votre code. Notez que le texte dans l'infobulle dit maintenant -- INSERT (paste) --.

Après avoir collé votre code, éteignez la pâte mode, de sorte que l'auto-indentation lorsque vous tapez fonctionne à nouveau correctement.

:set nopaste

Cependant, j'ai toujours trouvé que lourd. Voilà pourquoi je la carte <F3> de telle sorte qu'il peut basculer entre les modes pâte et nopaste lors de l'édition du texte! Je l'ajouter à .vimrc

set pastetoggle=<F3>

Autres conseils

Pour éviter les effets indésirables tout en collant, il y a une option qui doit être réglée:

set paste

Une commande utile d'avoir dans votre vimrc est set pastetoggle=<F10> ou un autre bouton, pour basculer facilement entre la pâte et nopaste.

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

Pas besoin d'activer et désactiver l'utilisation directe.

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

"+p

Ceci est une commande vim appropriée, donc pas besoin de se soucier d'entrer un mode d'insertion ou mise hors autoindent premier.

Bien sûr, si vous travaillez à distance (console via SSH, par exemple), alors cela ne fonctionnera pas et vous devriez aller le :set noai, en mode insertion, coller dans la console, laissez insertmode, route :set ai comme décrit par ailleurs.

Les utilisateurs de Mac peuvent éviter la mise en forme automatique en lisant directement à partir de la table de montage avec:

:r !pbpaste

Alors que le réglage du mode de pâte avec paste/nopaste/pastetoggle est parfaitement bien, 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, au-dessous est la meilleure solution que je l'ai trouvé à ce jour, ce qui permet de basculer automatiquement le mode coller lorsque vous collez.

  

Voici une petite astuce qui utilise le mode de pâte entre crochets du terminal   automatiquement réglé / unset mode de pâte de Vim lorsque vous collez. Mettez la suite   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 mode pâte tourner explicitement on / off - il est   traitées automatiquement pour vous.

Source: Coderwall

Remarque: Cette solution ne fonctionne pas dans WSL (Windows 10 sous-système pour Linux). Si quelqu'un a une solution pour WSL, s'il vous plaît mettre à jour cette réponse ou l'ajouter dans les commentaires.

Tmux Si vous utilisez tmux, puis les déclarations doivent être à double échappé. Le code pour cela est aussi dans

Voici un poste par une personne qui a compris comment remappez l'événement paste pour éteindre automatiquement le mode de pâte sur et puis hors tension. Fonctionne pour moi dans tmux / iTerm sur MacOSX.

Ajoutez ceci à votre ~/.vimrc et vous ne devez appuyer sur F2 avant et après le collage:

set pastetoggle=<F2>

Je viens de mettre set clipboard=unnamed dans mon .vimrc. Cela rend la carte tampon de pâte par défaut dans le presse papier 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 tirer sur des choses (par exemple dans vim YY à tirer sur le ligne courante dans le tampon) et le bouton du milieu dans une fenêtre à coller.

Chais. Je trouve super pratique.

Lorsque vous travaillez dans un terminal vim-coller placé entre crochets plug-in vim se chargera automatiquement pâtes sans avoir besoin de frappes avant ou après la pâte.

Il fonctionne en détectant mode de pâte entre crochets qui est une séquence d'échappement émis par « moderne » x -TERM terminaux compatibles comme iTerm2, gnome-terminal, et d'autres terminaux en utilisant libvte. En prime, il travaille aussi pour les sessions tmux. Je l'utilise avec succès iTerm2 sur un Mac connexion à un serveur linux et en utilisant tmux.

Tenez-vous dans votre ~ / .vimrc et être 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 beaucoup mieux car il est court, sémantique, et ne nécessite aucun vimrc personnalisé. Utilisez cette place!

Cela fonctionne pour moi (cas pour + registre, 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>

Bien que :pastetoggle ou :paste et :nopaste devrait être bon travail (si elles sont appliquées - ils ne sont pas toujours comme on peut le voir dans la discussion) Je recommendons fortement coller à l'aide de la "+p approche directe ou "*p et la lecture avec "+r ou "*r:

a acess à Vim dix types de registres (:help registers) et le questionneur est intéressé par quotestar et quoteplus de la section

  
      
  1. Sélection et baisse des registres "*, "+ et « ~
  2.   
     

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 ne sont pas disponibles ou non    travail, le registre sans nom est utilisé à la place. Pour les systèmes Unix, le presse-papiers    est disponible uniquement lorsque la fonction + de xterm_clipboard est présent. {Absent de Vi}

     

Notez qu'il n'y a qu'une distinction entre "* et" + pour les systèmes X11.

:help x11-selection précise en outre la différence de * et +:

                                                  quoteplus quote+
     

Il y a trois sélections X documentées: primaire (qui devrait    représenter la sélection visuelle actuelle - comme dans le mode visuel de VIM), SECONDAIRE    (Ce qui est mal définie) et presse-papiers (qui devrait être utilisé pour    coupe, les opérations copier et coller).

     

De ces trois, Vim utilise PRIMAIRE lors de la lecture et l'écriture du registre « *    (Par conséquent, lorsque les sélections X11 sont disponibles, Vim définit une valeur par défaut    « Presse-papiers » de « autoselect »), et lors de la lecture et CLIPBOARD écrit le « +    S'inscrire. Vim n'a pas accès à la sélection secondaire.

     

Exemples: (en supposant que les valeurs d'option par défaut)

     
      
  • Sélectionnez une URL en mode visuel 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é (je l'espère!). Remarque: dans Firefox vous pouvez définir la   middlemouse.contentLoadURL préférence à true dans about: config, le   URL sélectionnée sera utilisée lorsque vous appuyez sur le bouton de la souris moyenne dans la plupart des endroits dans la fenêtre.

  •   
  • Sélectionnez un texte dans votre navigateur en faisant glisser avec la souris. Aller à Vim   appuyez sur le bouton de la souris. Le texte sélectionné est inséré

  •   
  • Sélectionnez un texte dans vim et faire « + y. Allez dans votre navigateur, sélectionnez un texte dans   un champ de texte en faisant glisser la souris. Maintenant, utilisez le bouton droit de la souris et   sélectionnez « Coller » dans le menu contextuel. Le texte sélectionné est remplacé par le   texte de Vim.   Notez que le texte dans le « registre + reste disponible lors d'un visuel   sélection, ce qui rend tout autre texte disponible dans le « registre *. Cela permet   texte sélectionné écraser.
  •   

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

brew installer MacVim --override-système vim

pâte native / coller est placé entre crochets la meilleure et la plus simple depuis vim 8 (sorti en 2016). Il fonctionne même sur ssh! (Fonctionne coller sur Linux et entre crochets Mac, mais pas Windows Git Bash)

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

    vim --version | head -1

  2. Il suffit d'utiliser la commande native OS pâte (par exemple de ctrl+shift+V ou cmd+V) en mode normal. Ne pas appuyer sur i pour le mode Insertion.


test

  1. Copy (ctrl+shift+C ou cmd+C) la sortie de ce (2 lignes avec un retrait de patte) dans le presse papier système:

    echo -e '\ta\n\tb'

  2. Lancer une vim propre 8+ avec autoindent:

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

  3. Coller dans le presse-papiers du système (ou ctrl+shift+V cmd+V) en mode normal. Ne pas appuyer sur i pour le mode Insertion. Le a et b doivent être alignées avec un tiret de tabulation. Vous pouvez même le faire en ssh-ment à une machine distante (la machine distante aura besoin vim 8 +).

  4. Maintenant, essayez l'ancienne, qui autoindent la deuxième ligne avec un onglet supplémentaire: Appuyez sur i pour le mode Insertion. Ensuite, collez l'aide ctrl+shift+V ou cmd+V. Le a et b sont maintenant mal alignés.


Installation de Vim 8

S'il vous plaît lire cet article: bascule pour coller le code auto- indenter

  

Certaines personnes comme le retour visuel indiqué dans la ligne d'état par l'alternative suivante pour votre vimrc:

nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode

La façon la plus rapide je suis au courant d'aller rapidement en mode coller-insertion pour une pâte one-shot est de tpope intacte, qui présente yo et yO , probablement mnémoniques pour « vous ouvrez ». Ils sont seulement documentés dans son vimdoc, comme:

  

Une bascule n'a pas été prévu pour « coller » parce que le cas d'utilisation typique de   emballage d'une insertion solitaire est si inutile: Vous basculer deux fois, mais   vous coller une seule fois (yopo). Au lieu de cela, appuyez sur yo ou yO à invoquer o ou O avec   « Coller » déjà défini. Fin de la nopaste 'ensembles de mode d'insertion automatique.

De vim: ]p

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

Une autre façon de coller est par <CR> et laisser tomber le contenu du registre (ici le registre mondial). Voir: :h i_ctrl-r et h i_CTRL-R_CTRL-O.

De la documentation d'aide vim:
Insert the contents of a register literally and don't auto-indent. Does the same as pasting with the mouse<MiddleMouse>. Does not replace characters! The '.' register (last inserted text) is still inserted as typed.{not in Vi}

Donc, pour coller le contenu dans vim sans auto-indentation, utilisez <CR><CO>* dans la plupart des systèmes unix.

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

.

Malheureusement, j'ai trouvé le plugin vim mentionné ne pas travailler avec iTerm2 3.0.15 (pour être honnête, je ne sais pas si cela a éclaté sur les anciennes versions) - mais je trouve ce hack à la place

.

p-commande de la carte pour faire la pâte et l'aide des touches de vim iTerm2. Il est évident que cela ne fonctionne que pour iTerm2.

Comment ça marche. J'utilise « jk » pour passer en mode d'évacuation de sorte que vous aurez également besoin:

: inoremap jk

dans votre .vimrc.

Alors il appelle juste P pour entrer en mode coller, « + p pour coller à partir du presse-papiers, puis P pour désactiver le mode de pâte. HTH.

Une autre réponse que je ne vois pas jusqu'à présent:

:se paste noai
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top