Domanda

Con Vim mi capita spesso di voler sostituire un blocco di codice con un blocco che ho appena tirato.

Ma quando si elimina il blocco di codice che deve essere sostituito, che il blocco stesso va in registro e cancella il blocco ho appena tirato.Così ho preso l'abitudine di strattonare, quindi l'inserimento, l'eliminazione di ciò che non volevo, ma con grandi blocchi di codice questo si ottiene disordinato cercando di mantenere il blocco inserito e il blocco per eliminare separato.

Così che cosa è il più destro e più veloce modo per sostituire il testo in Vim?

  • c'è un modo per eliminare il testo senza metterlo nel registro?
  • c'è un modo per dire ad es."sostituire la parola successiva" o "sostituire il paragrafo successivo"
  • o è il modo migliore per in qualche modo utilizzare il multi-funzione di registrare?
È stato utile?

Soluzione

Per cancellare qualcosa senza salvarlo in un registro, è possibile utilizzare il "buco nero registrazione":

"_d

Naturalmente è anche possibile utilizzare qualsiasi degli altri registri che non contengono di tutto, si sono interessati.

Altri suggerimenti

Yep.È leggermente più complicata rispetto a eliminare il "vecchio" testo prima, ma:

Inizio con..

line1
line2
line3
line4

old1
old2
old3
old4

Io shift+v selezionare la linea 1, linea 2, 3 e 4, e cancellare con il d comando

Poi mi cancella il vecchio 1-4 linee allo stesso modo.

Quindi, fare

"2p

Che ti incolla al secondo-ultimo strappò linee (linea 1-4). "3p farà il terzo da ultimo, e così via..

Così alla fine l'ho

line1
line2
line3
line4

Riferimento: Vim documentazione sul registro numerato

VIM documenti: Numerate registro 0 contiene il testo da l'ultima copia di comando, a meno che il comando specificato un altro registro con ["x].

E. g.abbiamo yank "pippo" e " cancella "bar" - il registro di sistema 0 contiene ancora "pippo"!Quindi "pippo" può essere incollato utilizzando "0p

E ' comodo avere un facile mapping che consente di sostituire la selezione corrente con il buffer.

Per esempio quando si mettere questo nel .vimrc

vmap r "_dP       // it's a capital 'p' on the end

poi, dopo aver copiato qualcosa nel registro (es.con 'y'), si può semplicemente selezionare il testo che si desidera essere sostituito, e semplicemente premere " r " sulla tastiera.La selezione verrà sostituito con l'attuale registro.

Spiegazione:

vmap - mapping for visual mode
"_d - delete current selection into "black hole register"
P - paste

Ho messo i seguenti nel mio vimrc:

noremap  y "*y
noremap  Y "*Y
noremap  p "*p
noremap  P "*P
vnoremap y "*y
vnoremap Y "*Y
vnoremap p "*p
vnoremap P "*P

Ora ho yank e mettere da appunti, registrare, e non si cura di ciò che accade di default con il registro.Un beneficio aggiunto è che posso incolla da altre applicazioni con il minimo sforzo.Sto perdendo alcune funzionalità, lo so, ma ho appena non può tenere traccia di più di un registro/appunti comunque.

Per l'esempio specifico che ti ha dato, se ho capito bene la domanda, allora questo potrebbe funzionare:

*Highlight what you want to put somewhere else
*delete (d)
*Highlight the code that you want it to replace
*paste (p)

Tutti yank ed eliminare le operazioni di scrittura per l'innominato registro per impostazione predefinita.Tuttavia, l'ultima yank e più recenti eliminare sono sempre memorizzati (separatamente) nei registri di numerazione.Registro 0 tiene l'ultima copia.I registri 1-9 tenere premuto il 9 ultima elimina (con 1 il più recente).

In altre parole, elimina sovrascrive l'ultima copia in innominato registrare, ma è ancora lì in 0 registro. Blackhole-registro trucco ("_dd) citati nelle altre risposte opere, perché impedisce di sovrascrivere i senza nome di registrarsi, ma non è necessario.

Si fa riferimento a un registro usando i doppi apici, quindi incollare il più recente testo recuperato può essere come questo:

"0p

Questo è un ottimo riferimento:

A sottolineare la cosa EBGreen detto:

Se si incolla, mentre la selezione di testo, il testo selezionato viene sostituito con il testo incollato.

Se si desidera copiare il testo e incollarlo in più posizioni, utilizzare "0p per incollare.Numerate registro 0 contiene il testo da l'ultima copia di comando.


Inoltre, è possibile elencare il contenuto di tutti i registri:

:registers

Che comando rende più facile capire cosa registro che si desidera quando si fa qualcosa di simile dbr risposta.Potrai inoltre, vedere l' /,%,# registri.(Vedere anche :help registers)


E, infine, check-out cW e cW per modificare una parola, compreso e non compreso uno spazio finale.(Utilizzo di capitale W include la punteggiatura.)

Se stai usando Vim poi avrai la modalità visiva, che è come la selezione, ma con la separazione modalità di cosa che è alla base della vi/vim.

Quello che vuoi fare è utilizzare visual mode per selezionare la sorgente, quindi yank, quindi utilizzare visual mode per selezionare il campo di applicazione di destinazione, e quindi incollare il testo dal buffer predefinito.

Esempio:

In un file di testo con:

1| qwer
2| asdf
3| zxcv
4| poiu

con la seguente sequenza: ggVjyGVkp si concluderà con:

1| qwer
2| asdf
3| qewr
4| asdf

Ha spiegato:

  • gg:vai alla prima linea
  • V:avviare visual modalità con le linee
  • j:vai in basso di una riga (con la selezione inizia a righe precedenti questo cresce la selezione di una riga verso il basso)
  • y:yank per il buffer predefinito (le due linee selezionate, e si esce automaticamente da visual mode)
  • G:vai all'ultima riga
  • V:avviare visual mode (come prima)
  • k:vai in alto di una riga (come prima, con il visual modalità è abilitata, questo cresce la selezione di una riga in su)
  • p:incollare (con la selezione sulle ultime due righe, a sostituire quelle linee con quello che c'è nel buffer -- le prime 2 linee, in questo caso)

Questo è il piccolo inconveniente che mette l'ultimo blocco del buffer, in modo che, in qualche modo, non per ripetute pastings la stessa cosa, in modo che si desidera salvare il sorgente di un buffer con qualcosa di simile "ay (a un buffer chiamato "a") e pasta con qualcosa di simile "ap (ma poi se sei di programmazione, probabilmente non si desidera incollare più volte, ma per creare una funzione e richiamarla, giusto? A DESTRA?).

Se si utilizza solo vi, quindi sarà necessario utilizzare invisibile segna invece la modalità visiva, :he mark per ulteriori informazioni su questo, mi dispiace, ma io non sono molto bravo con questo invisibile marchi cosa, sono abbastanza contaminato con la modalità visiva.

Per 'sostituire la parola', provare cw in modalità normale.

Per "sostituire il comma", provate cap in modalità normale.

Un minimal invasive soluzione per i più pigri:

Registro 0 contiene sempre l'ultimo strattone (come Rafael, alex2k8 e idbrii già si è accennato).Purtroppo la selezione di registro 0 per tutto il tempo può essere molto fastidioso, quindi sarebbe bello se p utilizza "0 per impostazione predefinita.Ciò può essere ottenuto inserendo le seguenti righe nel tuo .vimrc:

noremap p "0p
noremap P "0P
for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    execute 'noremap "'.s:i.'p "'.s:i.'p'
    execute 'noremap "'.s:i.'P "'.s:i.'P'
endfor

La prima linea di mappe di ogni p corsa "0p.Tuttavia, questo impedisce p l'accesso a qualsiasi altri registri.Pertanto, tutti p pennellate con un esplicito registro selezionato vengono mappati l'equivalente della riga di comando di espressione all'interno del ciclo for.Lo stesso viene fatto per P.

In questo modo il comportamento standard è conservato, tranne che per l'implicita p e P ictus, che ora uso registro 0 per impostazione predefinita.

Suggerimento 1: Il comando cut è ora "0d invece di d.Ma visto che sono pigro, questo è troppo lungo per me ;) Quindi sto utilizzando la seguente mappatura:

noremap <LEADER>d "0d
noremap <LEADER>D "0D

La chiave di leader è \ per impostazione predefinita, in modo che si può facilmente tagliare il testo digitando \d o \D.

Suggerimento 2: Il tempo di timeout predefinito per il multi-key mapping è piuttosto breve.Si potrebbe desiderare di aumentare, per avere più tempo durante la selezione di un registro.Vedere :help timeoutlen per i dettagli, sto utilizzando:

set timeout timeoutlen=3000 ttimeoutlen=100

Beh, prima di eseguire questo comando:

:h d

Poi vi renderete conto che è possibile eliminare in un apposito registro.In questo modo non alterare quello che è di default nella tua registrazione.

Testo eliminato, mentre in modalità di inserimento, per non andare in default la registrazione.

Le due soluzioni io uso il diritto dei contesti;

  • evidenziare ciò che si desidera sostituire utilizzando Vims VISUAL modalità quindi incollare il registro.

Io la uso per lo più per abitudine ho trovato solo la seconda soluzione, molto più tardi, ad esempio,

yiw   " yank the whole word
viwp  " replace any word with the default register
  • YankRing.Con questo plugin è possibile utilizzare le scorciatoie <ctrl>+<p> per sostituire il precedente numerata registrare con quello che avete appena incollato.

Fondamentalmente si incolla, ma quando ti rendi conto di avere dato sovrascritto il valore predefinito registrare, quindi, di perdere quello che in realtà voleva incolla è possibile <C-P> per trovare e sostituire il YankRing storia!

Uno di quelli che deve avere i plugin...

Ho trovato molto utile la mappatura per il tuo scopo:

xnoremap p "_dP

Cancellato il testo è inserito nella "black hole registro", e il testo recuperato rimane.

Fonte: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text

Nella versione windows (probabilmente anche Linux), è possibile recuperare il sistema di copia e incolla di buffer utilizzando "*y (cioèantecedenti la data di yank comando con i doppi apici e l'asterisco).

È quindi possibile eliminare il sostituibile linee normalmente e incollare il testo copiato utilizzando "*p.

Mi capita spesso di fare un errore quando, a seguito dei comandi a 'y poi ank '"_d'elete in un buco nero, quindi 'p aste.Io preferisco 'y ank, quindi eliminare però mi piace, e poi la"0p' dal 0 registrati, che è l'ultimo testo copiato viene spinto.

La mia situazione:in Normal modalità, quando si elimina caratteri utilizzando il x la pressione di un tasto, la cancellazione sovrascrivere la mia ultima registrazione -- complicare le modifiche di cui voglio eliminare i caratteri utilizzando x e incolla di qualcosa che ho nella mia ultima registrazione (ad es.incollare lo stesso testo in due o più punti).

Ho provato il suggerimento accettato di rispondere ("_d), ma non ha funzionato.

Tuttavia, dal accettate risposte/commenti https://vi.stackexchange.com/questions/122/performing-certain-operations-without-clearing-register, Ho aggiunto alla mia ~/.vimrc, che funziona (potrebbe essere necessario riavviare Vim):

nnoremap x "_x

Che è, ora posso fare il mio normale yank (y), delete (d) e incollare (p comandi -- e personaggi eliminare utilizzando x non è più popolare più recenti registri.

Per Dvorak gli utenti, un metodo molto pratico è quello di eliminare inutili testo nel "1 registro, invece di "_ buco nero registrarsi, se non altro perché è possibile premere il tasto "+ 1 con lo stesso shift premere e swift pinky movimento a partire dal 1 è la chiave immediatamente al di sopra " di Dvorak (PLUS d è nell'altra mano, il che rende l'intero comando veloce come l'inferno).

Poi, ovviamente, il "1 registro, potrebbe essere utilizzato per altre cose, a causa della sua convenienza, ma a meno di non avere uno scopo più comune di quanto la sostituzione di testo, direi che è un buon uso del registro.

Per quelli di voi che sono di primaria interessati di non sovrascrivere l'innominato registrare quando si sostituisce un testo virtuale di selezione e incolla.

È possibile utilizzare la seguente soluzione che è facile e funziona meglio per me:

xnoremap <expr> p 'pgv"'.v:register.'y'

Si da le risposte (e i commenti) qui:Come incollare senza sovrascrivere registro

Ha passato la selezione per primo, poi la selezione con il nuovo testo è selezionato di nuovo (gv).Ora registro che è stato utilizzato per ultimo in modalità visiva (normalmente senza nome iscriversi, ma funziona anche senza alcun effetto collaterale se si utilizza un altro registro per incollare).E poi copia il nuovo valore al registro di nuovo.

PS:Se avete bisogno di una variante più semplice che funziona anche con intellj idea plugin vim-simulazione si può prendere questa (il rovescio della medaglia:sovrascrivere senza nome registro, anche se un altro registro è stato dato per incollare):

vnoremap p pgvy

Per emacs-male gli utenti, la funzione (evil-paste-pop) può essere attivato dopo aver incollato, e per scorrere tra le voci precedenti nel kill-ring.Supponendo che si è legato a <C-p> (di default in Spacemacs), si avrebbe colpito p seguito da molti <C-p> come necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top