Apa perbedaan fungsional antara: nohlsearch dan: set nohlsearch?

13

Saya perhatikan bahwa ketika saya menggunakannya :nohlsearchtidak benar-benar melakukan hal yang sama :set nohlsearch.

Secara khusus, hlsearchpengaturan tidak benar-benar dimatikan (yang adalah apa :set hlsearch) selesai.

Untuk menunjukkan apa yang saya maksud:

:set hlsearch
:nohlsearch
:echo &hlsearch

Cetakan ini 1( hlsearch masih disetel! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

Ini mencetak 0karena kami mematikan hlsearch dengan menggunakan cara standar untuk mematikan pengaturan di vim.

Jadi saya agak bertanya-tanya karena harus ada alasan sebenarnya untuk :nohlsearchperintah ex ada.

Alasan mengapa saya peduli adalah bahwa sekarang saya memiliki kebutuhan dalam skrip vim saya untuk menguji apakah sorot pencarian aktif, dan karena saya menggunakan :nohlsearchalih-alih ": set nohlsearch" di skrip saya yang lain, &hlsearchpengujian saya selalu kembali 1. Jadi saya bertanya-tanya apa yang saya ubah dengan tidak lagi menggunakan nohlsearchperintah ex.

Steven Lu
sumber

Jawaban:

15

Dari :h :nohlsearch

                                                        : noh: nohlsearch
: noh [lsearch] Hentikan sorotan untuk opsi 'hlsearch'. Itu
                        secara otomatis dihidupkan kembali ketika menggunakan pencarian
                        perintah, atau pengaturan opsi 'hlsearch'.
                        Perintah ini tidak berfungsi dalam perintah otomatis, karena
                        negara yang disorot disimpan dan dipulihkan saat
                        mengeksekusi autocommands autocmd-searchpat.
                        Hal yang sama ketika menjalankan fungsi pengguna.

Poin kuncinya adalah bahwa sorot secara otomatis mengaktifkan kembali ketika Anda memulai pencarian baru. :set nohlsearchsebenarnya hlsearchmati, yang berarti lain kali Anda mencari sesuatu tidak ada penyorotan terjadi.

Contoh: Asumsikan hlsearchaktif, Jika Anda sedang mencari "halo" di buffer, semua "halo" akan disorot. Jika Anda :nohlsearchtidak menggunakan apa pun akan disorot. Tetapi jika Anda kemudian mencari "dunia", semua "dunia" akan disorot. Jika Anda menggunakan set nohlsearch"dunia", tidak akan disorot.


Perhatikan juga bahwa perintah ini pada dasarnya tidak melakukan apa pun di dalam fungsi pengguna. Sebagai contoh,

function! NoHlsearch()
    nohlsearch
endfunction

tidak memiliki efek yang terlihat saat dijalankan.


Untuk melihat apakah hlsearch benar-benar aktif, Anda ingin memeriksa variabel v:hlsearch. Saat v:hlsearch = 0sorotan mati, dan ketika v:hlsearch = 1sorotan aktif. Anda mungkin harus memastikan &hlsearch = 1sebelum memeriksa v:hlsearch.

Dari :h v:hlsearch

                                        v: hlsearch hlsearch-variable
v: hlsearch Variabel yang menentukan apakah sorotan pencarian aktif.
                Masuk akal hanya jika 'hlsearch' diaktifkan yang mengharuskan
                + extra_search. Mengatur variabel ini ke nol berfungsi seperti itu
                : perintah nohlsearch, mengaturnya menjadi satu tindakan seperti
                        let & hlsearch = & hlsearch
FDinoff
sumber
Bisakah Anda mengklarifikasi apa yang Anda maksud dengan "pada dasarnya tidak ada" dari dalam suatu fungsi? Itu memang melakukan hal standar (sementara ini berhenti menyoroti pencarian sampai pencarian berikutnya dipanggil).
Steven Lu
Saya juga agak berharap menemukan cara untuk mengakses bendera yang mengontrol apakah transien :nohlsearchberlaku atau tidak ... Saya pikir karena ketidakhadirannya, saya harus menggunakan pelacakan semua :nohlsearchpanggilan dengan variabel.
Steven Lu
@ SevenLu lihat suntingan.
FDinoff
Terima kasih. Sepertinya kode saya telah menggunakan peretasan di sekitar aspek "pada dasarnya tidak melakukan apa-apa" dengan melakukan ini: di nnoremap <silent> <expr> <boundkey> SearchHighlight()mana SearchHighlight()dapat mengembalikan sebuah string ":silent nohlsearch\<CR>". Juga terima kasih atas v:hlsearchtipnya, hanya apa yang saya butuhkan.
Steven Lu
1

Apakah skrip Anda mengharuskan kondisi penyorotan saat ini diketahui?

Untuk mematikan hlsearchhanya pencarian saat ini, saya menggunakan Ctrl-l, dengan ini di .vimrc saya:

nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>

Sorotan pencarian kembali dengan pencarian berikutnya ketika menggunakan perintah di atas. Ctrl-lnyaman karena penggunaan normal adalah untuk menghapus dan menggambar ulang layar.

Untuk mengubah status sorotan pencarian hidup atau mati secara terus-menerus, saya menggunakan F3 sebagai sakelar saya:

nnoremap <F3> :set hlsearch! hlsearch?<CR>
orang tua ini
sumber