2012-01-21 2 views
21

Trovo che la procedura per copiare e incollare in VIM è molto difficile:Come semplificare "copia e incolla" in Vim?

  • modo Visual
  • Y
  • p (o spostamento p)
  • modalità di inserimento

e se usi erroneamente la chiave "elimina", hai perso il contenuto (viene sostituito dal carattere che hai eliminato) e y devi ricopiarlo!

Sto lavorando su Vim da diversi mesi, mi piace, ma io odio la copia e incolla, c'è un modo per semplificarlo? o qualche alternativa?

ringraziamento

+0

Non c'è bisogno di andare in copia in modalità visiva. copia e incolla la riga corrente. –

+0

Conosco Rajendran, ma come ho detto, quando si modifica probabilmente si usa il pulsante 'cancella' e si perde il contenuto, quindi è necessario ricopiarlo (e comunque è necessario spostarsi in modalità comando per passato: Esc + y + p + i (per tornare alla modalità di inserimento)) –

+0

sì :) Ho sentito questo inconveniente numero di volte –

risposta

15

Vim gestisce un elenco delle ultime 9 eliminazioni effettuate nello numbered registers. Quindi, "0p incollerà la cosa più recente che hai strattonato, "1p incollerà la seconda cosa più recente che hai cancellato o modificato (nota che questo non include il testo che è stato semplicemente strattonato), e così via per i registri 2-9.

Se si desidera utilizzare più degli ultimi 9 elementi eliminati o se si desidera accedere in modo semplice agli yank precedenti, si consiglia il plug-in yankring che, tra le altre cose, consente di visualizzare gli ultimi 100 yankee e scegliere quale si desidera incollare con il comando :YRShow.

Infine, se si desidera incollare senza uscire dalla modalità di inserimento, è possibile utilizzare Ctrl-R per inserire il contenuto di qualsiasi registro. Quindi in modalità inserimento digitando <Ctrl-R>" si inserirebbe il contenuto del registro senza nome " (che è il punto in cui il testo strappato viene inserito quando non viene specificato alcun registro).

+2

Non intendi '" 0p', '" 1p', ecc.? –

+0

@HerbertSitz Sì, grazie –

+2

+1 Ho usato gVim per diversi anni, ma né i registri numerati né Ctrl-R mi erano familiari. – johnny

2

Quando io non voglio cambiare modalità, ho semplicemente utilizzare la clipboard di sistema per copiare e incollare.

Oppure io uso CTRL-Y, se sto solo copiando i caratteri dalla riga precedente.

Se si desidera copiare il contenuto di un'intera riga da un'altra posizione nel buffer, digitare i primi caratteri e utilizzare CTRL-XCTRL-L.

Per ulteriori informazioni, consultare:

11

anche se non esattamente "semplificata", si ha la possibilità di copiare il testo in un registro diverso da quello in cui cancellato il testo va per impostazione predefinita. Questo ti proteggerà dal perdere ciò che hai copiato cancellando accidentalmente qualcosa.

Per copiare registrarsi a (ad esempio) si dovrebbe effettuare le seguenti operazioni:

"uny[comando di movimento]

Poi per incollare il testo che si sarebbe do:

"ap

Un'altra cosa che puoi fare. Se si desidera incollare mentre si è in modalità di inserimento, è possibile premere ctrl + o e quindi immettere il comando incolla (ad esempio il comando incolla registro sopra descritto). Il comando ctrl + o o equivale a premere esc, ma per un singolo comando. Maggiori informazioni a riguardo here.

Infine, si ha sempre la possibilità di scrivere uno script vim per modificare il comportamento predefinito a proprio piacimento (o magari trovare un plug-in come yankring).


UPDATE

Sulla base di una conversazione nei commenti con kellogs, ho deciso di guardare in modo di utilizzare qualsiasi registro per copia/incolla, ma in modalità visiva per il comando di copia (più facile da vedere visivamente cosa stai afferrando). Si scopre che questo è possibile.

Per copiare registrare a, ma in modalità visiva:

v (passa in modalità visiva)

Poi si fanno lo stesso come sopra, ma fanno il comando di movimento prima:

[comando di movimento]"uny (highlig ht la tua selezione tramite il comando di movimento, quindi scodifica nel registro a).

L'incolla viene eseguita nel modo normale come elencato sopra UPDATE.

+0

"ay [comando di movimento] - non fa niente per me – kellogs

+0

Non so perché non lo fa t lavoro per te. Ho appena aperto un file di testo casuale, spostato su una riga arbitraria e inserito quanto segue: "ay 2 w' che ha tirato 2 parole dalla mia posizione attuale del cursore e le ho memorizzate nel registro A. Sono stato quindi in grado di incollare tramite" " ap' (provato in diverse posizioni, incluso lo stesso file, una nuova scheda, un file esistente diverso). –

+0

potrei voler riprovare. C'è qualche conferma visiva? – kellogs

1

Non c'è molto da semplificare, è così che funziona Vim. Bene, più o meno.

Tuttavia, per quanto riguarda il problema relativo all'eliminazione (quindi, la sostituzione del contenuto del registro), ad esempio è possibile utilizzare YankRing. Fornisce un po 'di "facilità d'uso" alle operazioni Yank/incolla di Vim.


Come funziona?

si va alla prima linea , e Yank esso ("copia" in termini di Windows). Poi vai alla riga secondo e fai anche tu.Poi alla linea settima riga e strattoni anche quella.

Poi vai ... ovunque e incolla (!). Ottieni l'ultima riga (settima). Premere un tasto di scelta rapida, e quell'ultima incolla viene sostituita con la barra verticale precedente (la riga seconda). Ancora ... la linea prima :)

Quindi, in questo modo, non devi davvero preoccuparti di perdere i tuoi contenuti strappati, che da quello che ho capito era il tuo problema principale.

0

La cosa, ecco che non si deve "tornare alla modalità di inserimento".

La modifica (annulla, elimina, sostituisce, ecc.) Viene eseguita in modalità normale, la modalità di inserimento è solo per la digitazione del testo.

Se si è in modalità di inserimento e si vuole riutilizzare un testo già presente altrove nel documento si può colpire:

  • <C-n> e <C-p> di inserire una parola che inizia con i caratteri a sinistra del cursore
  • <C-x><C-l> per inserire una riga che inizia con i caratteri a sinistra del cursore
5

Vim non buttare completamente il testo via strappato quando si elimina qualcosa, si tratta solo di ov errare " registrati. Ultima testo recuperato è sempre memorizzato nel registro 0, in tal modo è possibile sostituire p con "0p nel vostro flusso di lavoro o, meglio, mappare questo per ,p e usarlo:

nnoremap ,p "0p 
xnoremap ,p "0p 

Un altro modo è quello di gettare il testo via cancellato (cancellare registro a buco nero _): "_dd, "_x e così via. Io personalmente uso ,d mappatura per questo:

nnoremap ,d "_d 
xnoremap ,d "_d 

In questo caso Vim non avrà la precedenza su tutti i registri.

Terzo è l'utilizzo di registri di lettere, come suggerito da @Jason Down.

+0

Bella idea anche per completezza: nnoremap, D" _D xnoremap, D "_D ​​ nnoremap, x" _x xnoremap, x "_x – Magnus

1

Per me la soluzione più semplice era creare una combinazione di tasti combinata che abilitasse o disabilitasse questo effetto collaterale di eliminazione.

Con il mio script in posizione, digito "e sono in modalità" nessun effetto collaterale ", quindi l'eliminazione del testo non ha alcun effetto sul mio buffer di yank, quindi posso yank-delete-paste liberamente ed efficientemente tutto piace.

Quindi quando si digita, ancora una volta e vim torna al suo comportamento predefinito con gli effetti secondari delete-key.

Trovo che questa soluzione sia ideale perché non ho bisogno di pensare ai buffer ogni volta che voglio copiare incolla. Vedi qui per lo script:

vim toggling buffer overwrite behavior when deleting

0

Vi (e Vim) funziona in modo molto diverso rispetto a un normale editor di testo, come Gedit. Ha anche una curva di apprendimento piuttosto ripida. Se vuoi imparare alcuni comandi di base, inizia con questo tutorial interattivo.

Tuttavia, per rispondere alla domanda. È possibile accedere al contenuto degli Appunti di sistema tramite il registro più. Quindi, per incollare qualcosa dagli Appunti di sistema è possibile, dalla modalità Normale, premere: "+ p (Non contemporaneamente, ma uno dopo l'altro)