Bagaimana cara mematikan "hlsearch" secara otomatis setelah saya selesai mencari?

19

Saya suka pengaturan "hlsearch", tetapi setelah saya selesai mencari, saya merasa menjengkelkan. Apalagi jika saya mencari sesuatu yang memiliki banyak kecocokan. Saya tahu bahwa saya dapat mematikan ini

:set nohlsearch

Tapi ini membutuhkan 16 kali penekanan tombol, dan bahkan lebih menjengkelkan, saya harus mengaktifkannya kembali untuk pencarian berikutnya dengan

:set hlsearch    

Apakah ada cara agar hlsearch aktif secara otomatis ketika saya mulai mencari, dan mati ketika saya selesai mencari? Misalnya, jika saya memasukkan mode penyisipan, atau memodifikasi teks, sudahkah hlsearch mematikan tanpa penekanan tombol tambahan?

DJMcMayhem
sumber
3
Tentukan secara otomatis.
Antony
@Antony Seperti dalam, jika saya melakukan pengeditan, atau dalam mode penyisipan, itu akan mati tanpa saya perlu menekan tombol apa pun. Jika saya mulai mencari dengan /atau ?, atau jika saya menekan natau N, itu akan menyala tanpa saya perlu menekan tombol lagi.
DJMcMayhem
1
Oh dan tentukan pencarian "selesai"
Christian Brabandt
1
:nno <BS> :set hls!\|set hls?<CR>- satu baris, satu penekanan tombol, umpan balik negara, dan tidak mencoba menebak-nebak saat Anda mungkin ingin atau tidak ingin disorot. Terkadang saya ingin menyorot kiri pada layar saat mengedit. Kadang-kadang saya tidak melakukannya, misalnya menggunakan /gerakan dengan operator.
Antony
nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Sato Katsura

Jawaban:

26

Ada cara yang jauh lebih nyaman. Daripada menggunakan

:set nohlsearch

yang benar-benar mematikan pengaturan hlsearch, gunakan

:nohls

Ini hanya akan mematikan hlsearch sampai Anda mencari lagi. Dari:help nohls

                 *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
'hlsearch' 'hls'    boolean (default off)
            global
            {not in Vi}
            {not available when compiled without the
            |+extra_search| feature}

    ...

    When you get bored looking at the highlighted matches, you can turn it
    off with |:nohlsearch|.  This does **not change the option value**, as
    soon as you use a search command, the highlighting comes back.

Namun, solusi ini tidak sempurna, karena Anda masih harus mengetik :nohlsyang mana rasa sakit yang harus dilakukan setelah setiap pencarian. Anda dapat menyiasatinya dengan pemetaan, misalnya

nnoremap <esc><esc> :silent! nohls<cr>

Tetapi ada solusi yang lebih baik lagi ! haya14busa / incsearch.vim . Ini, setidaknya menurut saya, sebuah plugin vim yang penting . Fitur utamanya adalah semua kecocokan pencarian disorot dalam waktu nyata, saat Anda mengetik regex Anda. Sebagai contoh:

masukkan deskripsi gambar di sini

Namun, fitur sekunder yang juga disediakan adalah opsi untuk segera mengaktifkan dan mematikan hlsearch saat Anda memulai / menghentikan pencarian. Untuk mengaktifkan fitur ini, Anda harus menambahkan

set hlsearch
let g:incsearch#auto_nohlsearch = 1
map n  <Plug>(incsearch-nohl-n)
map N  <Plug>(incsearch-nohl-N)
map *  <Plug>(incsearch-nohl-*)
map #  <Plug>(incsearch-nohl-#)
map g* <Plug>(incsearch-nohl-g*)
map g# <Plug>(incsearch-nohl-g#)

untuk Anda .vimrc.

Jika Anda memiliki npemetaan lain , Anda harus mematikannya. Sebagai contoh, saya dulu pernah punya

nnoremap n nzz
nnoremap N Nzz

Kedua pemetaan ini tidak kompatibel dengan satu sama lain!

DJMcMayhem
sumber
Karena Anda melakukan jawaban sendiri, saya ingin menyarankan agar Anda juga menambahkan masalah set hlsearch. Jika Anda mendefinisikannya di vimrcdalamnya akan menimpa :nohsetiap kali Anda sumber vimrc. Untuk menyelesaikan ini saya miliki if !&hlsearch | set hlsearch | endifdi vimrc. (Dan ini adalah masalah lain yang diselesaikan plugin.)
grochmal
Entahlah, sepertinya seluruh tumpukan kode dan konfigurasi untuk tidak banyak keuntungan bagi saya. Bahkan itu membuat target pencarian tambahan Anda lebih sulit dikenali, membuatnya kurang berguna untuk navigasi cepat.
Antony
+1 untuk pertanyaan menjawab plugin yang bagus dan melakukan lebih banyak lagi!
RichVel
7

vim-cool adalah plugin sederhana yang melakukan hal ini.

Vim-cool menonaktifkan pencarian sorot ketika Anda selesai mencari dan mengaktifkannya kembali ketika Anda mencari lagi.

Ini bekerja tanpa memetakan kembali dengan menggunakan perintah CursorMoveddan InsertEnterautocommand.

Jon Parise
sumber
Teknik ini (menggunakan perintah otomatis) jauh lebih baik daripada jawaban saya, dan saya tidak percaya saya tidak memikirkannya ketika saya menulis milik saya. Suara positif.
Kaya
5

Saya gunakan <Leader><Enter>sebagai jalan pintas ke :noh. (Pemimpin saya ,, jadi itu cukup dekat)

Ini akan mematikan highlight hingga pencarian Anda berikutnya.

Amit Gold
sumber
3

Seperti yang telah Anda catat dalam jawaban Anda sendiri , jauh lebih efisien untuk mematikan penyorotan dengan :nohlsearchperintah (yang dapat disingkat :noh) daripada mematikan seluruh fitur dan kemudian mengembalikannya pada saat Anda mencari di lain waktu.

Jika Anda ingin menonaktifkan penyorotan setiap kali Anda menggunakan iuntuk memasukkan mode penyisipan, Anda dapat membuat pemetaan sederhana untuk melakukannya:

:nnoremap i :noh<cr>i

Ini dibiarkan sebagai latihan bagi pembaca untuk membuat pemetaan serupa untuk perintah lain di mana mereka ingin menyoroti dimatikan.

Kaya
sumber
1

Mungkin terdengar bodoh atau naif, tetapi yang saya lakukan ketika saya ingin berhenti menyoroti adalah saya mencari string acak yang (hampir pasti) tidak ada dalam dokumen. Sesuatu seperti ini:

/skljdfhadhfs

Memang, memang diperlukan beberapa pukulan tombol, tetapi benar-benar acak, sehingga dapat diketik dalam waktu singkat.

Kostas
sumber
1
Tetapi ini membuat ndan Ntidak lagi berfungsi, dan juga hal-hal seperti :%s//somethingatau :g//something. Ini juga mengacaukan riwayat pencarian Anda
DJMcMayhem
Ya, tetapi asumsi saya (mungkin salah) adalah karena Anda tidak perlu lagi menyoroti, Anda juga tidak peduli dengan pencarian itu. Mengacaukan riwayat pencarian adalah masalah nyata, jika seseorang bergantung padanya.
Kostas
1

Saya telah menemukan itu lebih intuitif untuk memetakan kembali Ctrl- Lmengecat untuk memasukkan :nohls:

nnoremap <C-L> :nohls<cr><C-L>
DanG
sumber
Selamat datang di Vi dan Vim ! Terima kasih telah berbagi pengetahuan Anda tentang apa yang diakui sebagai pertanyaan lama. Jawaban berkualitas tinggi, seperti yang mungkin telah Anda perhatikan, umumnya disertai dengan beberapa penjelasan tentang apa yang dilakukan kode (ini sangat membantu bagi pemula yang baru yang mungkin mendarat di sini tanpa banyak pengetahuan). Ini juga bisa menjadi ide bagus untuk bagian yang relevan :help!
D. Ben Knoble
0

Saya menggunakan <Leader><Enter>sebagai jalan pintas ke :hlsdan memiliki pemimpin saya ditetapkan sebagai ruang.

let mapleader = "\<Space>"
nmap <silent> <leader><Esc> :set hls!<cr>

Setelah mencari item akan disorot, untuk mematikannya, tekan <Space><Esc>. Dan jika Anda memutuskan ingin menampilkan kembali hasil pencarian, tekan <Space><Esc>. Cara hls!memetakan ikatan ini untuk beralih pengaturan untuk hls(singkatan untuk hlsearch, yaitu menyoroti hasil pencarian) (sehingga toggle !pengaturan tepat sebelum itu).

James Affleck
sumber
-1

Tambahkan makro ini ke .vimrc Anda

map #h :set hls!<CR>

Ini akan memungkinkan Anda untuk beralih hilighting dengan #h

Darrel Lee
sumber
Ini tidak berbeda dengan jawaban James Affleck.
jamessan
Punyaku sepertinya lebih ringkas.
Darrel Lee
Mengapa keringkasan itu relevan? Posting lain memberikan informasi lebih lanjut tentang apa arti bagian-bagian dari perintah dan posting ini tidak memberikan konten tambahan.
jamessan