Bagaimana cara saya menggunakan register vim?

926

Saya hanya tahu satu contoh menggunakan register adalah melalui CtrlR*mana saya menempelkan teks dari clipboard.

Apa kegunaan lain dari register? Bagaimana cara menggunakannya?

Segala sesuatu yang Anda ketahui tentang register VI (mari fokus pada vi 7.2) - bagikan dengan kami.

vehomzzz
sumber
22
Saya memberi jawaban panjang di sana tentang penggunaan register
Benoit

Jawaban:

1186

Register di Vim memungkinkan Anda menjalankan tindakan atau perintah pada teks yang tersimpan di dalamnya. Untuk mengakses register, Anda mengetik di "adepan perintah, di mana anama register. Jika Anda ingin menyalin baris saat ini ke register k, Anda bisa mengetik

"kyy

Atau Anda dapat menambahkan ke register dengan menggunakan huruf kapital

"Kyy

Anda kemudian dapat menelusuri dokumen dan menempelkannya di tempat lain menggunakan

"kp

Untuk menempel dari clipboard sistem di Linux

"+p

Untuk menempel dari clipboard sistem pada Windows (atau dari clipboard "highlight mouse" di Linux)

"*p

Untuk mengakses semua jenis register yang didefinisikan saat ini

:reg
FModa3
sumber
165
Dan "+merupakan register khusus yang mengacu pada sistem clipboard.
Aaron McDaid
17
Di Windows, Clipboard dapat diakses dengan "*; jadi perintah untuk menyalin sampai akhir file menjadi "*yG.
Aditya MP
44
Dalam X (Linux, mungkin juga OS-X), *adalah clipboard "highlight mouse", dan clipboard +Ctrl-XCV.
dotancohen
20
Apakah ada cara untuk menambahkan ke daftar clipboard (karena tidak ada modal +)?
naitsirhc
8
@dotancohen Secara teknis itu disebut seleksi PRIMARY, tapi kurasa "tikus higlight" lebih mudah bagi orang untuk mendapatkan :)
kyrias
783

Saya senang ketika saya menemukan 0register. Jika Anda menarik teks tanpa menugaskannya ke register tertentu, maka teks itu akan ditugaskan ke 0register, serta disimpan dalam "register default . Perbedaan antara 0dan "register adalah yang 0hanya diisi dengan teks yang ditarik, sedangkan register default juga diisi dengan teks yang dihapus menggunakan perintah d/ D/ x/ X/ c/ C/ s/ S.

Saya menemukan ini berguna ketika saya ingin menyalin beberapa teks, menghapus sesuatu dan menggantinya dengan teks yang disalin. Langkah-langkah berikut menggambarkan contoh:

  • Tarik teks yang ingin Anda salin y[motion]- teks ini disimpan "dan 0didaftarkan
  • Hapus teks yang ingin Anda ganti d[motion]- teks ini disimpan dalam "register
  • Rekatkan teks yang ditarik dengan "0p

di mana "perintah untuk menggunakan register untuk perintah selanjutnya.

Pada langkah terakhir, jika Anda menempel dari register default (dengan p), itu akan menggunakan teks yang baru saja Anda hapus (mungkin bukan yang Anda maksudkan).

Catat itu patau Ptempel dari register default. Setara lama akan ""p(atau ""P) dan "0memegang yank terakhir, "1memegang penghapusan atau perubahan terakhir.

Untuk info lebih lanjut, lihat :help registers.

nelstrom
sumber
17
patau Ppasta dari register default. Setara lama akan ""p(atau ""P).
nelstrom
186
Ngomong-ngomong, cara yang sama "0 menahan yank terakhir," 1 menahan penghapusan atau perubahan terakhir.
FireAphis
6
"adalah perintah untuk menggunakan register untuk perintah selanjutnya. Jadi ""pakan menggunakan "register untuk perintah tempel dan "0pakan menggunakan 0register.
Ramon Marco L. Navarro
5
0pberarti pergi ke karakter pertama dari baris saat ini dan rekatkan dari isi register default ( "). "pakan menjadi perintah yang tidak lengkap karena Anda perlu menentukan perintah apa untuk menggunakan register p.
Ramon Marco L. Navarro
15
Cara yang sama "1 memegang penghapusan terakhir," 2 memegang penghapusan terakhir kedua, "3 memegang yang terakhir terakhir, dll hingga" 9
James
330

Salah satu bagian favorit saya tentang register adalah menggunakannya sebagai makro!

Katakanlah Anda berurusan dengan file nilai yang dibatasi-tab seperti itu:

ID  Df  %Dev    Lambda
1   0   0.000000    0.313682
2   1   0.023113    0.304332
3   1   0.044869    0.295261
4   1   0.065347    0.286460
5   1   0.084623    0.277922
6   1   0.102767    0.269638
7   1   0.119845    0.261601

Sekarang Anda memutuskan bahwa Anda perlu menambahkan tanda persentase di akhir bidang% Dev (mulai dari baris ke-2). Kami akan membuat makro sederhana dalam mregister (dipilih secara sewenang-wenang) sebagai berikut:

  1. Tekan:: qmUntuk mulai merekam makro dalam mregister.

  2. EE: Pergi ke akhir kolom ke-3.

  3. a: Sisipkan mode untuk menambahkan ke akhir kolom ini.

  4. %: Ketikkan tanda persen yang ingin kita tambahkan.

  5. <ESC>: Kembali ke mode perintah.

  6. j0: Pergi ke awal baris berikutnya.

  7. q: Hentikan merekam makro

Kita sekarang bisa mengetik @muntuk menjalankan makro ini di baris saat ini. Selanjutnya, kita dapat mengetik @@untuk mengulang, atau 100@mmelakukan ini 100 kali! Hidup terlihat cukup bagus.

Pada titik ini Anda harus berkata, " TAPI TUNGGU, APA YANG HARUS DILAKUKAN DENGAN REGISTER ?"

Poin luar biasa. Mari selidiki apa yang ada di isi mregister dengan mengetik "mp. Kami kemudian mendapatkan yang berikut:

EEa%<ESC>j0

Pada awalnya ini sepertinya Anda secara tidak sengaja membuka file biner di notepad, tetapi pada pandangan kedua, ini adalah urutan karakter yang tepat di makro kami!

Anda adalah orang yang ingin tahu, jadi mari kita lakukan sesuatu yang menarik dan edit baris teks ini untuk menyisipkan yang !lama dan tidak membosankan %.

EEa!<ESC>j0

Lalu mari kita tarik ini ke dalam nregister dengan mengetik B"nyE. Kemudian, hanya untuk iseng, mari jalankan nmakro pada baris data kami menggunakan @n....

OMG, IT TAMBAH A !

Pada dasarnya, menjalankan makro seperti menekan urutan tombol yang tepat dalam register makro itu. Jika itu bukan trik daftar yang keren, saya akan memakan topiku.

Francisco
sumber
65
Ini benar-benar kuncinya. Saya belum memperhatikan sampai sekarang bahwa register sama dengan buffer makro. Ini berarti Anda bisa menyimpan semua makro Anda dalam teks, menariknya, dan menjalankannya. Cukup keren, dan sedikit aneh. Sangat Vim.
naught101
1
Ini adalah catatan editorial minor, tapi capslock itu dengan huruf tebal ... Itu bisa diperbaiki. Ini sangat menjengkelkan saat ini.
ashrasmun
1
Anda dapat menggunakan +alih-alih j0pergi ke karakter non kosong pertama pada baris berikutnya.
Gokul
100

Register berguna lainnya:

"*atau "+- isi clipboard sistem

"/ - perintah pencarian terakhir

": - perintah terakhir.

Catatan dengan vim macro, Anda dapat mengeditnya, karena mereka hanya daftar penekanan tombol yang digunakan saat merekam makro. Jadi, Anda dapat menulis ke file teks makro (gunakan "apuntuk menulis makro a ) dan mengeditnya, dan memuatnya ke dalam register "ay$. Cara yang baik untuk menyimpan macro yang bermanfaat.

Anthony Roy
sumber
6
Default vim pada OSX tidak termasuk "* integrasi. Anda dapat menginstal versi dari homebrew-alt yang berfungsi. Periksa dengan vim --version- -clipboardberarti Anda tidak memilikinya, +clipboardberarti Anda memilikinya.
Xavier Shay
15
Di X11, "*dan "+lebih keren lagi: "+menempelkan teks terakhir yang disalin ctrl+c(salin buffer), atau apa pun pintasan yang Anda gunakan (atau right-click>copy). "*menempelkan teks terakhir yang disorot dengan mouse (buffer pilihan). Jadi, jika Anda menyalin sesuatu dengan ctrl+c, dan kemudian menyoroti sesuatu yang lain dengan mouse, Anda dapat memilih yang mana yang akan ditempelkan. Ini tidak berfungsi di Windows, di mana kedua register ini sama.
naught101
1
Diberkatilah, saya telah mencari "*dan "+selama bertahun-tahun! Saya pikir hanya gvim yang memiliki akses ke clipboard sistem, tetapi tampaknya vim biasa juga!
Tarrasch
@ Tarrasch Jika Anda menggunakan konsol konsol bukannya gvim Anda akan menemukan banyak hal. Kupikir. kunjungi #vim di freenode juga!
trusktr
1
Cara mengaktifkan jika sudah -xterm_clipboardaktif vim --version. Ada paket sederhana untuk diinstal? (debian / apt-get). Terima kasih.
Dr Beco
77

The hitam lubang mendaftar _ adalah /dev/nullregister.

Saya menggunakannya di vimrc saya untuk mengizinkan penghapusan satu karakter tanpa memperbarui register default:

noremap x "_x

dan untuk menempel dalam mode visual tanpa memperbarui register default:

vnoremap p "_dP
mrucci
sumber
Pemetaan kedua juga sangat bermanfaat. Lihat penjelasan di sini: marcorucci.com/blog/#visualModePaste
mrucci
21
pemetaan untuk xmenjadi kurang nyaman untuk merefleksikan karakter.
skeept
Menekan x tidak menghapus hal terakhir yang Anda tarik, yang akan Anda temukan ada di register 0. Tekan x beberapa kali, lalu "0p untuk menempelkan barang yang Anda
tarik
2
Untuk memperluas komentar skeept di atas: dengan xpemetaan ini Anda tidak lagi dapat melakukan xp"perintah" untuk mengganti arus dengan karakter berikutnya. Cukup bermanfaat untuk perbaikan kesalahan ketik. Kita juga harus Xpmengganti arus dengan karakter sebelumnya.
Daniel Andersson
56

Jika Anda ingin menempelkan isi register dalam perintah mode-ex, tekan <C-r><registerletter>.

Mengapa Anda menggunakan ini? Saya ingin melakukan pencarian dan mengganti untuk string gondrong, jadi saya memilihnya dalam mode visual, mulai mengetik pencarian / ganti ekspresi :%s/[PASTE YANKED PHRASE]//gdan melanjutkan hari saya.

Jika Anda hanya ingin menempelkan satu kata dalam mode ex, dapat memastikan kursor ada di dalamnya sebelum memasuki mode ex, dan kemudian tekan <C-r><C-w>ketika dalam mode ex untuk menempelkan kata.

agscala
sumber
6
Menempelkan teks di :baris perintah adalah hal terbaik yang saya pelajari hari ini
Shahbaz
1
Anda juga dapat menggunakan <CR> <registerletter> dalam mode penyisipan
Floegipoky
1
Saya suka menulis temukan / ganti regex pertama dengan adil /[write out your regex]<cr>dan kemudian ganti saja s/<C-R>//replacement/. Dengan cara ini Anda mendapatkan manfaat dari umpan balik langsung di regex Anda sebelum menjalankan penggantian.
GabeIsman
44

Saya pikir register guru rahasia adalah ekspresi = daftar. Ini dapat digunakan untuk pemetaan kreatif.

:inoremap  \d The current date <c-r>=system("date")<cr>

Anda dapat menggunakannya bersamaan dengan sistem Anda seperti di atas atau mendapatkan tanggapan dari fungsi VimL khusus dll.

atau hanya hal-hal ad hoc suka

<c-r>=35+7<cr>
michael
sumber
3
Lihat [video tentang penggunaan register ekspresi Derek Wyatt] ( derekwyatt.org/vim/vim-tutorial-videos/… )
Jeromy Anglim
1
Tautan dari @JeromyAnglim sekarang ada di sini: derekwyatt.org/vim/tutorials/advanced/#expression-register
Djizeus
39

Trik kerennya adalah menggunakan "1p untuk menempelkan penghapusan / perubahan terakhir (, dan kemudian gunakan .untuk berulang kali menempelkan penghapusan berikutnya. Dengan kata lain, "1p...pada dasarnya setara dengan "1p"2p"3p"4p.

Anda dapat menggunakan ini untuk membalikkan urutan beberapa baris: dddddddddd"1p....

neless101
sumber
aha ini luar biasa. Apa yang sebenarnya saya inginkan adalah perilaku yang sama untuk yanks
RyanM
18

Dari halaman bantuan vim:

CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
        Insert the contents of a numbered or named register.  Between
        typing CTRL-R and the second character '"' will be displayed
        <...snip...>
        Special registers:
            '"' the unnamed register, containing the text of
                the last delete or yank
            '%' the current file name
            '#' the alternate file name
            '*' the clipboard contents (X11: primary selection)
            '+' the clipboard contents
            '/' the last search pattern
            ':' the last command-line
            '-' the last small (less than a line) delete
            '.' the last inserted text
                            *c_CTRL-R_=*
            '=' the expression register: you are prompted to
                enter an expression (see |expression|)
                (doesn't work at the expression prompt; some
                things such as changing the buffer or current
                window are not allowed to avoid side effects)
                When the result is a |List| the items are used
                as lines.  They can have line breaks inside
                too.
                When the result is a Float it's automatically
                converted to a String.
        See |registers| about registers.  {not in Vi}
        <...snip...>
Brian
sumber
17
  • q5 merekam pengeditan menjadi register 5 (q berikutnya berhenti merekam)
  • : reg tampilkan semua register dan konten apa pun di dalamnya
  • @ 5 jalankan register 5 makro (rekaman yang diedit)
fpmurphy
sumber
15
Saya tidak suka tombol @ untuk meluncurkan makro (tiga penekanan tombol). Jadi saya telah memetakan F2 untuk meluncurkan makro yang disimpan dalam register q: nmap <F2> @q Saya menggunakan register q, karena kemudian untuk menyimpan makro untuk F2 untuk diputar, saya tekan saja qq. simpan dan putar ulang makro cepat.
Andrej Panjkov
16

Saya menggunakan register default untuk menangkap teks di jendela vim saya tanpa harus meraih mouse.

  1. teks yank
  2. :!grep "<CTRL-R>0"<CR>
Matt Mendell
sumber
12

Gunakan register dalam perintah dengan @. Misalnya:

echo @a
echo @0
echo @+

Atur mereka dalam perintah:

let @a = 'abc'

Sekarang "apakan menempel abc.

Ciro Santilli
sumber
8

Sumber besar kebingungan adalah register default ". Penting untuk mengetahui cara kerjanya. Jauh lebih baik jika register default dihindari sebagian besar kali. Penjelasan dari dokumentasi Vim:

Vim fills this register with text deleted with the "d", "c", "s", "x" commands
or copied with the yank "y" command, regardless of whether or not a specific
register was used (e.g.  "xdd).  This is like the unnamed register is pointing
to the last used register.

Jadi register default sebenarnya adalah pointer ke register yang terakhir digunakan. Ketika Anda menghapus, atau menarik sesuatu register ini akan mengarah ke register lain. Anda dapat mengujinya dengan memeriksa register. Selalu ada register lain yang persis sama dengan register default: register yank ( "0), register delete pertama ( "1), register delete kecil ( "-) atau register lain apa pun yang digunakan untuk menghapus atau mencabut.

Satu-satunya pengecualian adalah register lubang hitam. Vim doc mengatakan:

An exception is the '_' register: "_dd does not store the deleted text in any
register.

Biasanya Anda akan jauh lebih baik dengan menggunakan secara langsung: "0, "-dan "1-"9register standar atau bernama register.

Catalin Ciurea
sumber
8

Satu register yang terlewatkan adalah '.' dot register yang berisi teks yang disisipkan terakhir tidak peduli bagaimana itu disisipkan misalnya ct] (ubah sampai]). Kemudian Anda menyadari bahwa Anda perlu memasukkannya di tempat lain tetapi tidak dapat menggunakan metode dot repeat.

 :reg .
 :%s/fred/<C-R>./
zzapper
sumber
7

Register favorit saya adalah ':'register. Menjalankan @:dalam mode Normal memungkinkan saya untuk mengulangi perintah ex yang sebelumnya dijalankan.

siu
sumber
4

Teman saya Brian menulis artikel yang komprehensif tentang ini. Saya pikir ini adalah pengantar yang bagus untuk menggunakan topik. https://www.brianstorti.com/vim-registers/

Madis Nõmme
sumber