Apa gunanya register lubang hitam ("_)?

15

Baru-baru ini saya membaca tentang register lubang hitam "_yang merupakan register tulis saja.

Dokumentasi Vim menggambarkannya seperti ini:

  1. Daftar lubang hitam "_

Saat menulis ke register ini, tidak ada yang terjadi. Ini dapat digunakan untuk menghapus teks tanpa mempengaruhi register normal. Saat membaca dari daftar ini, tidak ada yang dikembalikan.

Dalam semua artikel dan buku yang saya baca penulis selalu menggunakan contoh yang sama yaitu menggunakan register ini ketika kita perlu menghapus beberapa teks tanpa menghapus apa yang sebelumnya kita tarik.

Saya mengerti penggunaan ini tetapi saya terkejut dengan kenyataan bahwa saya tidak dapat menemukan kasus penggunaan lain dari register ini, yang membawa saya ke 2 pertanyaan:

  • Apakah register ini berguna dalam beberapa kasus penggunaan lainnya ? Jika ya, yang mana?

  • Jika satu-satunya tujuan register ini digunakan dalam use case yang saya kutip sebelumnya, mengapa pencipta Vim memutuskan untuk menyelesaikan masalah ini dengan register seperti itu ? Maksud saya jawaban ini menunjukkan solusi untuk masalah yang menyiratkan lebih sedikit penekanan tombol daripada menggunakan "_. Menggunakan "0juga dapat menghindari penggunaan register lubang hitam, jadi mengapa mereka membuatnya?

statox
sumber

Jawaban:

18

Register lubang hitam digunakan dalam situasi yang sama seperti /dev/null: ketika Anda melakukan suatu tindakan yang biasanya menghasilkan sesuatu tetapi Anda tidak menggunakan untuk output itu.

Perilaku default Vim adalah untuk "memotong", bukan "menghapus". Dalam kebanyakan kasus itu tidak masalah tetapi, kadang-kadang, pengguna mungkin benar-benar perlu "menghapus". Di situlah register lubang hitam menjadi berguna.

Apakah register ini berguna dalam beberapa kasus penggunaan lainnya?

Daftar lubang hitam ada di sini untuk membiarkan kami memotong barang tanpa merusak register yang tidak disebutkan namanya dan register bernomor.

Kasing yang mungkin digunakan banyak tetapi semuanya sangat mirip:

  • berikan "hapus" yang sebenarnya,
  • memiliki kontrol yang lebih baik atas register, terutama yang tidak disebutkan namanya,
  • menjaga register bernomor dalam keadaan stabil,
  • memotong sesuatu sambil mempertahankan kemampuan untuk menempatkan dari register yang tidak disebutkan namanya, memberi kita "put berulang",
  • letakkan sesuatu di atas sesuatu yang tidak Anda pedulikan,
  • mencegah efek samping dalam skrip ...

Satu dapat digunakan "0puntuk skenario "berulang menempatkan" (kasus penggunaan paling umum, maka di mana-mana dalam literatur Vim) tetapi register itu jauh dari berguna seperti "_skenario lainnya.

romainl
sumber
Saya melihat kasus penggunaan Anda lebih sebagai konsekuensi dari perilaku register ini, tetapi saya pikir jawaban Anda dengan jelas menggambarkan register ini dengan `Register black hole ada di sini untuk memungkinkan kami memotong barang tanpa merusak register yang tidak disebutkan namanya dan register bernomor.` Saya mengharapkan jawaban lain tetapi sepertinya itu satu-satunya penggunaan register ini. Terima kasih banyak atas jawaban Anda!
statox
5

Selain menghapus teks, Anda dapat menggunakan register lubang hitam untuk menghapus register lain. Contoh:

:let @a=@_

Ini adalah salah satu cara kliring register "a.

cbaumhardt
sumber
2
Kalau-kalau ada orang yang membaca ini berpikir, "Saya ingin tahu apakah ini pengganti yang lebih pendek, lebih jelas :call setreg('a', [])," seperti yang saya lakukan: sayangnya, jawabannya adalah tidak. Kerjanya seperti :call setreg('a', '')(meninggalkan "aoutput dari :registersperintah.
Rich
@ Kaya Apa pentingnya meninggalkan "aoutput :registersuntuk yang belum tahu?
Alexej Magura
@AlexejMagura Ya, jika tujuan Anda adalah untuk merapikan apa yang Anda lihat saat melihat konten register Anda, maka meninggalkan banyak register kosong mungkin tidak ideal. Saya tidak yakin apakah ada perbedaan praktis lain antara register yang dihapus dan yang sudah ada yang kebetulan kosong.
Kaya
1

Satu penggunaan praktis dalam satu fungsi. Dalam fungsi di bawah ini komentar python #ditambahkan dan dihapus tergantung pada hasil getline('.')[0]. Jika baris memiliki komentar, char #dihapus, tetapi dalam hal ini kami tidak ingin mengacaukan dengan register default kami.

function! ToggleComment()
    let l:win_view = winsaveview()
    if getline('.')[0] == "#"
        normal! 0"_x
    else
        normal! I#
    endif
    call winrestview(l:win_view)
endfunction
nnoremap <Leader>t :call ToggleComment()<CR>
vnoremap <Leader>t <C-o>:call ToggleComment()<CR>
SergioAraujo
sumber