Esiste un oggetto di testo per l'intero buffer?


28

Mi trovo spesso a digitare comandi come gg"+yGo ggdGe vorrei un modo più efficiente per farlo senza dover spostare il cursore due volte. Esiste un comando che posso usare ad esempio y[movement]per copiare l'intero buffer senza spostare il cursore?

Risposte:


36

Poiché vim utilizza il segno di percentuale per fare riferimento al buffer corrente, è possibile utilizzarlo per ottenere tutto rapidamente.

:%ytirerà l'intero buffer :%y+lo tirerà nel +registro (e presumibilmente negli appunti, a condizione che vim sia stato compilato con le opzioni appropriate).

:%de :%d+farà lo stesso per la cancellazione.

In ciascuno di questi casi, il cursore rimane in posizione.


Wow, per tutto questo tempo stavo usando mmgg"+yG`me non ci ho mai pensato. Grazie, questo sta andando proprio nel .vimrc.
Maniglia della porta

@Doorknob invece di impostare e usare i segni che potresti usare C-odue volte per tornare indietro.
Ruslan,

10

Un'altra soluzione è utilizzare un plugin chiamato vim-textobj-whole . Per impostazione predefinita, questo plugin fornisce l'oggetto di testo aeper l'intero buffer, ieper l'intero buffer tranne le righe vuote iniziali e finali.

Questo plugin dipende da vim-textobj-user dello stesso autore, che consente agli utenti di definire comodamente qualsiasi oggetto di testo. Ci sono molti plugin che fanno buon uso di questo.


8

Non esiste alcun oggetto di testo per l'intero file per impostazione predefinita, ma è possibile crearli utilizzando omap. In questo caso, sarebbe simile a questo:

onoremap f :<c-u>normal! mzggVG<cr>`z

Ecco una ripartizione di come funziona:

onoremap f " make 'f' the text object name
:<c-u> " use <c-u> to prevent vim from inserting visual selection marker at the beginning of the command automatically.
normal! " use normal to make key presses ignoring any user mappings
mzggVG<cr>`z " make a marker in register z, select the entire file in visual line mode and enter the normal command, and go back to the z marker

Gli appunti:

Ctrlupuò essere utilizzato in modalità riga di comando per eliminare tutto a sinistra della posizione del cursore. Il motivo per cui ciò viene fatto è perché se si immette la riga di comando direttamente dalla modalità visiva, questa verrà automaticamente inserita '<,'>nella riga di comando e non è quello che vogliamo. Vorrei anche suggerire di utilizzare qualcosa di diverso da f, perché fviene normalmente utilizzato per passare al successivo personaggio cercato sulla linea. Ad esempio, fipasserà al successivo isulla riga corrente.

Argomenti della guida pertinenti:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:

C'è un modo per farlo lasciando solo il cursore?
Casuale 832

@ Random832 L'aggiunta di ``a alla fine riporta il cursore nella posizione precedente.
SnoringFrog

Sono preoccupato che questo non farà applicare la selezione al comando yank. Ne proverò alcuni oggi.
Casuale 832

1
Ho aggiunto un comando marker alla mappatura, dovrebbe lasciare il cursore dove si trova ora.
EvergreenTree

2

Ecco alcune mappature veloci e sporche per eseguire l'attività:

nnoremap yY :%yank <c-r>=v:register<cr><cr>
nnoremap dD :%delete <c-r>=v:register<cr><cr>

Ora puoi usare yYe dDper tirare / cancellare rispettivamente. Non è bello come usare un oggetto di testo completo, ma a volte le soluzioni più semplici sono le migliori.

Per ulteriori informazioni, consultare:

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
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.