online - vim tutorial italiano




In Vim c'è un modo per cancellare senza inserire del testo nel registro? (14)

Usando Vim, spesso voglio sostituire un blocco di codice con un blocco che ho appena strappato.

Ma quando cancello il blocco di codice che deve essere sostituito, quel blocco stesso entra nel registro che cancella il blocco che ho appena tirato. Quindi ho preso l'abitudine di strappare, quindi inserire e cancellare ciò che non volevo, ma con grandi blocchi di codice questo diventa disordinato cercando di mantenere separato il blocco inserito e il blocco da eliminare.

Quindi qual è il modo più intelligente e veloce per sostituire il testo in Vim?

  • c'è un modo per cancellare il testo senza inserirlo nel registro?
  • c'è un modo per dire ad esempio "sostituire la parola successiva" o "sostituire fino al prossimo paragrafo"
  • o è il modo migliore per usare in qualche modo la funzionalità di registrazione multipla?

È comodo avere una mappatura semplice che ti permetta di sostituire la selezione corrente con il buffer.

Ad esempio quando lo metti nel tuo .vimrc

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

poi, dopo aver copiato qualcosa nel registro (cioè con 'y'), puoi semplicemente selezionare il testo che vuoi sostituire, e semplicemente premere 'r' sulla tastiera. La selezione verrà sostituita con il tuo registro corrente.

Spiegazione:

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

Bene, prima fai questo comando:

:h d

Quindi ti renderai conto che puoi cancellare in un registro specifico. In questo modo non cambierai ciò che è nel tuo registro predefinito.


Ho messo il seguente 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 mi avvicino al registro degli appunti e non mi interessa sapere cosa succede con il registro predefinito. Un ulteriore vantaggio è che posso incollare da altre app con problemi minimi. Sto perdendo qualche funzionalità, lo so, ma non riesco proprio a tenere traccia di più di un registro / blocco appunti.



Le due soluzioni che uso nei contesti giusti sono;

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

Lo uso principalmente per abitudine poiché ho trovato la seconda soluzione solo molto dopo, ad es

yiw   " yank the whole word
viwp  " replace any word with the default register
  • YankRing . Con questo plugin puoi usare la combinazione di tasti <ctrl>+<p> per sostituire il registro numerato precedente con quello appena incollato.

Fondamentalmente vai a incollare come faresti, ma quando ti rendi conto che da allora hai sovrascritto il registro di default perdendo ciò che volevi effettivamente incollare, puoi <CP> trovare e sostituire dalla cronologia di YankRing!

Uno di questi deve avere i plugin ...


Nella versione di Windows (probabilmente anche in Linux), puoi inserire il buffer di copia / incolla del sistema usando "*y (ovvero precedendo il comando di yank con virgolette e asterisco).

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


Per cancellare qualcosa senza salvarlo in un registro, puoi usare il "registro dei buchi neri":

"_d

Ovviamente potresti anche usare uno qualsiasi degli altri registri che non contengono nulla a cui sei interessato.


Per gli utenti di Dvorak, un metodo molto conveniente è quello di eliminare il testo non necessario nel registro "1 invece del registro" _ buco nero, se non altro perché è possibile premere "+ 1 con lo stesso turno premere e un rapido movimento mignolo poiché 1 è la chiave immediatamente sopra "in Dvorak (PLUS d è nell'altra mano, che rende l'intero comando veloce come l'inferno).

Quindi, naturalmente, il "registro 1 potrebbe essere utilizzato per altre cose a causa della sua praticità, ma a meno che tu non abbia uno scopo più comune della sostituzione del testo, direi che è un buon uso del registro.


Per l'esempio specifico che hai fornito, se ho capito la domanda, questo potrebbe funzionare:

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

Per quelli di voi che sono interessati primariamente a non sovrascrivere il registro senza nome quando si sostituisce un testo tramite selezione e incolla virtuali.

Potresti usare la seguente soluzione che è facile e funziona meglio per me:

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

È dalle risposte (e commenti) qui: Come incollare sopra senza sovrascrivere il registro

Passa prima la selezione, quindi la selezione con il nuovo testo viene nuovamente selezionata (gv). Ora il registro che è stato utilizzato per l'ultima volta in modalità visuale (normalmente il registro senza nome ma funziona anche senza effetti collaterali se si utilizza un altro registro per incollare). E poi tira di nuovo il nuovo valore nel registro.

PS: Se hai bisogno di una variante più semplice che funziona anche con intellim idea plugin vim-simulation puoi prendere questo (lato negativo: sovrascrivi il registro senza nome anche se è stato fornito un altro registro per incollare):

vnoremap p pgvy


Sì. È leggermente più complicato dell'eliminazione del testo "vecchio", ma:

Inizio con ..

line1
line2
line3
line4

old1
old2
old3
old4

Sposto + v seleziona la riga 1, la linea 2, 3 e 4, e le cancella con il comando d

Quindi elimino le vecchie linee 1-4 allo stesso modo.

Quindi fa

"2p

Questo incollerà le ultime righe strappate (linea 1-4). "3p farà il terzo dall'ultimo, e così via ..

Quindi finisco con

line1
line2
line3
line4

Riferimento: documentazione di Vim sul registro numerato


Se stai usando Vim, avrai la modalità visiva, che è come selezionare, ma con la modalità di separazione che è la base di vi / vim.

Quello che vuoi fare è usare la modalità visuale per selezionare la fonte, quindi tirare indietro, quindi utilizzare nuovamente la modalità visiva per selezionare l'ambito della destinazione, 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 terminerai con:

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

Ha spiegato:

  • gg : vai alla prima riga
  • V : avvia la modalità visiva con intere linee
  • j : scendi di una riga (con la selezione avviata sulle righe precedenti questo aumenta la selezione di una riga in basso)
  • y : salta al buffer predefinito (le due linee selezionate e ti esce automaticamente dalla modalità visiva)
  • G : vai all'ultima riga
  • V : avvia la modalità visiva (come prima)
  • k : vai su una riga (come prima, con la modalità visiva abilitata, questa aumenta la selezione di una riga in alto)
  • p : incolla (con la selezione sulle ultime due righe, sostituirà quelle linee con qualunque cosa ci sia nel buffer - le 2 prime righe in questo caso)

Questo ha il piccolo inconveniente che mette l'ultimo blocco sul buffer, quindi in qualche modo non è desiderato per gli incassi ripetuti della stessa cosa, quindi vorrai salvare il codice sorgente in un buffer chiamato con qualcosa come "ay (in un buffer chiamato "a") e incollare con qualcosa come "ap (ma se si sta programmando, probabilmente non si vuole incollare più volte ma per creare una funzione e chiamarla, giusto? RIGHT ?).

Se stai usando solo vi, allora dovrai usare segni invisibili invece della modalità visiva,: :he mark di più su questo, mi dispiace ma non sono molto bravo con questa cosa dei segni invisibili, sono piuttosto contaminato da modalità visiva.


Tutte le operazioni di cancellazione e cancellazione scrivono per default al registro senza nome. Tuttavia, lo yank più recente e l'eliminazione più recente vengono sempre memorizzati (separatamente) nei registri numerati. Il registro 0 contiene lo yank più recente. I registri 1-9 contengono le 9 eliminazioni più recenti (con 1 è il più recente).

In altre parole, un'eliminazione sovrascrive lo yank più recente nel registro senza nome, ma è ancora presente nel registro 0 . Il trucco registro blackhole ( "_dd ) menzionato nelle altre risposte funziona perché impedisce di sovrascrivere il registro senza nome, ma non è necessario.

Fai riferimento a un registro usando le virgolette doppie, quindi incollare il testo strappato più di recente può essere fatto in questo modo:

"0p

Questo è un riferimento eccellente:


Una soluzione minimamente invasiva per i più pigri:

Il registro 0 contiene sempre l'ultimo strattone (come hanno già menzionato Rafael , alex2k8 e idbrii ). Sfortunatamente la selezione del registro 0 tutto il tempo può essere abbastanza fastidiosa, quindi sarebbe bello se p utilizzasse "0 di default. Questo 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 riga mappa ogni tratto di p su "0p . Tuttavia, questo impedisce a p di accedere ad altri registri, quindi tutti i tratti di p con un registro selezionato in modo esplicito vengono mappati all'espressione di riga di comando equivalente all'interno del ciclo for. .

In questo modo viene mantenuto il comportamento standard, ad eccezione dei tratti impliciti di P e P , che ora utilizzano il registro 0 per impostazione predefinita.

Suggerimento 1: Il comando di taglio ora è "0d invece di solo d . Ma dato che sono pigro, questo è troppo lungo per me;) Pertanto sto usando la seguente mappatura:

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

La chiave principale è \ di default, quindi puoi tagliare facilmente il testo digitando \d o \D

Suggerimento 2: il timeout predefinito per i mapping con più tasti è piuttosto breve. Potresti voler aumentarlo per avere più tempo quando selezioni un registro. Vedi :help timeoutlen per i dettagli, sto usando:

set timeout timeoutlen=3000 ttimeoutlen=100




vim-registers