Apakah ada objek teks untuk seluruh buffer?

28

Saya sering menemukan diri saya mengetik perintah seperti gg"+yGatau ggdGdan ingin cara yang lebih efisien untuk melakukan ini tanpa harus memindahkan kursor dua kali. Apakah ada perintah yang bisa saya gunakan misalnya y[movement]untuk menyalin seluruh buffer tanpa memindahkan kursor?

Random832
sumber

Jawaban:

36

Karena vim menggunakan tanda persen untuk referensi buffer saat ini, Anda dapat menggunakannya untuk mendapatkan semuanya dengan cepat.

:%yakan menarik seluruh buffer :%y+akan menariknya ke +register (dan mungkin clipboard, asalkan vim dikompilasi dengan opsi yang tepat).

:%ddan :%d+akan melakukan hal yang sama untuk penghapusan.

Dalam setiap kasus ini, kursor tetap di tempatnya.

SnoringFrog
sumber
Wow, selama ini saya menggunakan mmgg"+yG`mdan tidak pernah memikirkan hal ini. Terima kasih, ini benar di .vimrc.
Gagang pintu
@Doorknob alih-alih mengatur dan menggunakan tanda, Anda hanya dapat menggunakan C-odua kali untuk kembali.
Ruslan
10

Solusi lain adalah dengan menggunakan plugin yang disebut vim-textobj-whole . Secara default, plugin ini menyediakan objek teks aeuntuk seluruh buffer, ieuntuk seluruh buffer kecuali memimpin dan mengikuti baris kosong.

Plugin ini tergantung pada vim-textobj-user oleh penulis yang sama, yang memungkinkan pengguna mendefinisikan objek teks dengan nyaman. Ada banyak plugin yang memanfaatkan ini.

Yosh
sumber
8

Tidak ada objek teks untuk seluruh file secara default, tetapi dimungkinkan untuk membuatnya menggunakan omap. Dalam hal ini, akan terlihat seperti ini:

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

Berikut ini rincian cara kerjanya:

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

Catatan:

Ctrludapat digunakan dalam mode baris perintah untuk menghapus semuanya di sebelah kiri posisi kursor. Alasan mengapa ini dilakukan adalah karena jika Anda memasukkan baris perintah langsung dari mode visual, itu akan secara otomatis memasukkan '<,'>pada baris perintah, dan itu bukan yang kita inginkan. Saya juga menyarankan Anda menggunakan sesuatu selain f, karena fbiasanya digunakan untuk pindah ke karakter yang dicari berikutnya di telepon. Misalnya, fiakan menuju ke yang berikutnya ipada baris saat ini.

Topik bantuan yang relevan:

:help omap-info
:help :normal
:help c_CTRL-U
:help v_:
Pohon cemara
sumber
Apakah ada cara untuk melakukan ini sambil membiarkan kursor?
Random832
@ Random832 Menambahkan a ``ke ujung akan mengembalikan kursor ke lokasi sebelumnya.
SnoringFrog
Saya khawatir ini akan membuatnya tidak menerapkan seleksi pada perintah yank. Saya akan bereksperimen beberapa hari ini.
Acak 832
1
Saya menambahkan perintah marker ke pemetaan, seharusnya meninggalkan kursor di tempatnya sekarang.
EvergreenTree
2

Berikut adalah beberapa pemetaan cepat dan kotor untuk menyelesaikan tugas:

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

Sekarang Anda dapat menggunakan yYdan dDuntuk menarik / menghapus masing-masing. Ini tidak sebagus menggunakan objek teks penuh, tetapi kadang-kadang solusi paling sederhana adalah yang terbaik.

Untuk bantuan lebih lanjut lihat:

:h :y
:h :d
:h [range]
:h v:register
:h c_ctrl-r
:h @=
Peter Rincker
sumber