Toujours utiliser: définir la pâte, est-ce une bonne idée?

19

Dans un terminal vim, coller des données du presse-papiers gâche souvent le retrait du code. Je savais juste que si j'utilise :set pastele retrait n'est pas cassé. Cependant, après avoir collé des données, dois-je :set nopasterecommencer? Et si je ne le fais pas, quel est le problème?

Benjamin
la source
Et si vous essayiez par vous-même? Ou lire la documentation ?
romainl
1
Voir aussi "Mode Collé Bracketé" dans ma réponse à "Coller du code dans la fenêtre du terminal dans vim" stackoverflow.com/a/7053522/754997 . Si votre émulateur de terminal le prend en charge, vous pouvez lui demander d'indiquer à Vim de basculer automatiquement vers / depuis le mode de collage chaque fois que vous collez du texte dans le terminal.
Chris Page
1
@romainl Je trouve tout à fait plausible que les deux 1) essayent et attendent de voir s'il y a des conséquences négatives de toujours utiliser set paste (+ - nopaste), et 2) rtfm-ing (en tant qu'utilisateur de niveau inférieur ou intermédiaire comme l'OP) , sont moins utiles que de demander à ceux qui ont de l'expérience avec les options. Demander ici semble une approche plus intelligente, et documenter cela aidera les autres.
belacqua

Réponses:

5

Comme d'autres l'ont écrit, vous ne voulez pas laisser l'ensemble «coller». Je voulais juste souligner qu'avec un bon émulateur de terminal et un compilé et configuré correctement vim, vous ne devriez pas avoir besoin de changer 'coller'. Vous avez besoin d'un bon émulateur de terminal tel que xterm ou GNOME Terminal, vim avec la fonctionnalité X11 incluse et l'option «souris» réglée sur «a». Il vimsaura alors quand vous collerez avec la souris et définira et désactivera efficacement l'option «coller» pour vous.

Une façon d'obtenir un vimavec la fonctionnalité X11 consiste à exécuter gviml' -voption ou à créer un alias,

alias vim='gvim -v'

Mettez ensuite

set mouse=a

dans votre ~ / .vimrc.

garyjohn
la source
Lorsque je mets mouse = a, je ne peux pas copier de texte. "Copier" est grisé dans le menu contextuel et dans le menu de l'application.
Lee Daniel Crocker
@LeeDanielCrocker: Copysera grisé ou ne sera pas visible du tout sauf si du texte a été sélectionné. Comment sélectionnez-vous le texte à copier?
garyjohn
Juste avec la souris. Pour info, "y" fonctionne très bien ... tire le texte et le copie sur le clavier du système. Ce ne sont que les menus qui ne fonctionnent pas. Si la souris est réglée sur "r", les menus fonctionnent, mais la souris inclut les numéros de ligne. Donc, dans l'ensemble, je peux vivre avec mouse = a, je dois juste me rappeler de tirer au lieu de copier.
Lee Daniel Crocker
7

Ce message a ma réponse préférée, https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode

Fondamentalement, si vous démarrez en mode Insertion et utilisez Ctrl + Shift + V ou un clic droit coller avec votre souris, Vim détecte que cela vient d'un terminal et définit automatiquement le mode coller, puis le désactive une fois terminé, afin de ne pas perdre les clés remappées (qui ne peut pas fonctionner en mode coller car il écrit des données brutes) et vous êtes de retour à un état "sain" quand c'est fait.

Pour juste vim (mettez 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

Si vous utilisez vim sous Tmux (va toujours dans .vimrc)

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

let &t_SI .= WrapForTmux("\<Esc>[?2004h")
let &t_EI .= WrapForTmux("\<Esc>[?2004l")

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
dragon788
la source
Je suppose qu'une des let &t_SI .= "\<Esc>[?xxxxx"lignes détecte le raccourci de collage du clavier? Est-ce que cela fonctionne aussi pour Mac étant donné les différents raccourcis?
doub1ejack
@ doub1ejack Ceux-ci détectent en fait les séquences d'échappement Xterm, pas la façon dont elles ont été appelées (c'est-à-dire que 2004h est un début de collage), tant que votre terminal prend en charge les codes clés Xterm et les transmet à Vim, cela devrait fonctionner correctement sur Mac.
dragon788
OMG. tu es mon héros. J'ai tapé ainsi: définissez nopaste tant de fois.
maxwell
3

Comme l'a suggéré romainl, la documentation explique que la définition de l' 'paste'option désactive plusieurs autres options, et vous constaterez certainement que plus tôt que tard, cela vous posera des problèmes. Pour cette raison, il y a l' 'pastetoggle'option. Voir:

:help 'paste'
:help 'pastetoggle'
Heptite
la source
1

Si quelque chose existe, il doit avoir sa signification. Vous devriez jeter un œil à la documentation de vim qui est très utile.

  :help 'paste'
  :help 'pastetoggle'

Une fois que vous aurez lu, vous voudrez peut-être ceci:

" Toggle paste mode
"   (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>

J'espère que vous trouverez cet article utile :)

Dzung Nguyen
la source
1

IIRC lorsque vous collez dans vim, il pense essentiellement que vous avez tapé tous ces caractères vous-même. Donc, si le retrait automatique est activé, il mettra en retrait des éléments pour vous, mais le texte collé contient généralement déjà un retrait, de sorte que le retrait est effectivement "foiré". Le passage en mode collage désactive des éléments tels que le retrait automatique.

Si vous aimez le retrait automatique au fur et à mesure que vous tapez, vous devez le réactiver sur nopaste une fois le collage terminé. Essayez-le et notez comment vous devez effectuer toutes les indentations manuellement en mode collage.

Sumudu Fernando
la source