Usa sempre: imposta incolla, è una buona idea?


19

In un terminale vim, incollare i dati degli appunti spesso incasina il rientro del codice. Sapevo solo se uso :set pasteil rientro non è rotto. Tuttavia, dopo aver incollato i dati, dovrei fare di :set nopastenuovo? E se non lo facessi, quale problema si presenta?


Che ne dici di provare per te stesso? O leggendo la documentazione ?
Romainl,

1
Vedi anche "Bracketed Paste Mode" nella mia risposta a "Incollare il codice nella finestra del terminale in vim" stackoverflow.com/a/7053522/754997 . Se l'emulatore di terminale lo supporta, è possibile disporre che indichi a Vim di passare automaticamente alla / dalla modalità incolla ogni volta che si incolla il testo nel terminale.
Chris Page

1
@romainl Trovo abbastanza plausibile che sia 1) cercando e aspettando di vedere se ci sono conseguenze negative dell'usare sempre set paste (+ - nopaste), sia 2) rtfm-ing (come utente di livello inferiore o intermedio come l'OP) , sono meno utili che chiedere a coloro che hanno esperienza con le opzioni. Chiedere qui sembra un approccio più intelligente e documentarlo aiuterà gli altri.
belacqua,

Risposte:


5

Come altri hanno scritto, non vuoi lasciare 'incolla' impostato. Volevo solo sottolineare che con un buon emulatore di terminale e un corretto compilato e configurato vim, non dovresti cambiare 'incolla'. È necessario un buon emulatore di terminale come xterm o GNOME Terminal, vim con la funzione X11 inclusa e l'opzione 'mouse' impostata su 'a'. Quindi vim"saprà" quando si incolla con il mouse e imposterà e disattiverà efficacemente l'opzione "incolla".

Un modo per ottenere un vimcon la funzione X11 è eseguire gvimcon l' -vopzione o creare un alias,

alias vim='gvim -v'

Poi mettere

set mouse=a

nel tuo ~ / .vimrc.


Quando imposto mouse = a, non riesco a copiare il testo. "Copia" è disattivato nel menu di scelta rapida e nel menu dell'app.
Lee Daniel Crocker,

@LeeDanielCrocker: Copyverrà visualizzato in grigio o non sarà visibile a meno che non sia stato selezionato del testo. Come stai selezionando il testo da copiare?
garyjohn,

Solo con il mouse. Cordiali saluti, "y" funziona bene ... strappa il testo e lo copia sulla tastiera di sistema. Sono solo i menu che non funzionano. Se il mouse è impostato su "r", i menu funzionano, ma il mouse include i numeri di riga. Quindi, tutto sommato, posso vivere con mouse = a, devo solo ricordare di strappare invece di copiare.
Lee Daniel Crocker,

7

Questo post ha la mia risposta preferita, https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode

Fondamentalmente se inizi in modalità Inserisci e usi Ctrl + Maiusc + V o fai clic con il tasto destro del mouse con il mouse, Vim rileva che questo proviene da un terminale e imposta automaticamente la modalità Incolla, quindi lo disinserisce una volta fatto, in modo da non perdere i tasti rimappati (che non può funzionare in modalità incolla perché sta scrivendo dati non elaborati) e al termine si torna in uno stato "sano".

Per solo vim (inserisci il tuo .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

Se usi vim sotto Tmux (va ancora in .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()

Presumo che una delle let &t_SI .= "\<Esc>[?xxxxx"righe rilevi la scorciatoia da tastiera incollata? Questo funziona anche per Mac, dato il diverso collegamento?
doub1ejack,

@ doub1ejack In realtà stanno rilevando le sequenze di escape di Xterm, non come sono state chiamate (ovvero 2004h è un inizio di incolla) quindi fintanto che il tuo terminale supporta i codici chiave Xterm e li passa a Vim dovrebbe funzionare bene su Mac.
dragon788,

Oh mio Dio. tu sei il mio eroe. Ho scritto così: imposta nopaste così tante volte.
maxwell,

3

Come suggerito da Romainl, la documentazione spiega che l'impostazione 'paste'dell'opzione disabilita diverse altre opzioni e sicuramente scoprirai che prima o poi ti causerà problemi. Per questo motivo, c'è l' 'pastetoggle'opzione. Vedere:

:help 'paste'
:help 'pastetoggle'

1

Se esiste qualcosa, deve avere il suo significato. Dovresti dare una buona occhiata alla documentazione di VIM che è molto utile.

  :help 'paste'
  :help 'pastetoggle'

Una volta letto, potresti voler questo:

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

Spero che questo post ti sia utile :)


1

IIRC quando incolli in vim, essenzialmente pensa che tu abbia digitato tutti quei personaggi da solo. Quindi, se il rientro automatico è attivato, indenterà roba per te, ma il testo incollato di solito contiene già rientro in modo che il rientro venga effettivamente "incasinato". Il passaggio alla modalità incolla disattiva elementi come il rientro automatico.

Se ti piace il rientro automatico mentre digiti, dovresti riportarlo su nopaste dopo aver incollato. Provalo e osserva come devi eseguire manualmente tutti i rientri in modalità incolla.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.