Bagaimana cara menjaga vim agar tidak menyorot pertandingan setelah diganti?


13

Saya miliki set hlsearchdi ~/.vimrc. Ini biasanya sangat berguna, tetapi menjengkelkan harus dilakukan :nohsetelah saya mengganti seperti '<,'>s/$/',/(yang menyoroti akhir setiap baris setelah saya menjalankannya). Bagaimana saya bisa vimtidak menyorot setelah mengganti seperti ini?

Saya di Ubuntu 9.04 dengan vim7.2. Saya memiliki masalah yang sama pada OS X 10.6 (juga vim7.2). Sesuatu yang akan bekerja pada keduanya akan diinginkan.

UPDATE: Semua jawaban yang saya terima hanya menambahkan pemetaan kunci yang harus dilakukan :noh(atau yang setara). Saya benar-benar mencoba untuk menghindari perilaku kunci kustom yang benar-benar akan saya gunakan, tetapi kemudian membuat saya gagal total tanpa mereka (misalnya di komputer teman, dll.). Saya ingin vimmelakukannya secara otomatis :nohsetelah melakukan penggantian. Artinya, saya hanya ingin hlsearchketika menggunakan /atau *(mungkin beberapa kasus lainnya), tetapi tidak kali lain.

Jawaban:


7

Jika Anda tidak ingin menonaktifkan secara permanen, Anda dapat mengikat kunci untuk beralih sorot seperti yang disarankan dalam jawaban ini untuk pertanyaan serupa tentang stackoverflow.

map  <F12> :set hls!<CR>
imap <F12> <ESC>:set hls!<CR>a
vmap <F12> <ESC>:set hls!<CR>gv

Jika Anda ingin menonaktifkan sorot secara permanen:

11.1. After I searched for a text with a pattern, all the matched text
      stays highlighted. How do I turn off the highlighting
      temporarily/permanently?

The 'hlsearch' option controls whether all the matches for the last
searched pattern are highlighted or not. By default, this option is not
enabled. If this option is set in a system-wide vimrc file, then you can
turn off the search highlighting by using the following command:

    :set nohlsearch

(dari FAQ VIM )


2
Saya mengetahui opsi ini. Masalahnya adalah saya biasanya tidak mencari apa yang ingin saya ganti, jadi tidak ada gunanya menyoroti dalam kebanyakan kasus yang saya ganti. Namun, itu sangat berguna ketika saya sedang mencari sesuatu, jadi saya tidak ingin pergi benar-benar pergi.
Benjamin Oakes

@Benjamin: Anda secara implisit mencarinya. Itulah yang: s. Mencari pola dan kemudian melakukan transformasi pada pertandingan. Menggunakan: nohl adalah solusi yang tepat karena mematikan sorotan dari pola pencarian saat ini sampai pencarian berikutnya dilakukan. Ia melakukan ini tanpa mengubah status opsi 'hlsearch' atau memengaruhi nilai tersimpan dari istilah pencarian sebelumnya.
jamessan

2
@ jamessan: Saya mengerti bahwa ini adalah pencarian dan ganti. Hanya saja saya tidak perlu disorot saat itu. Sebagian besar gangguan lebih dari segalanya.
Benjamin Oakes

Beberapa saat yang lalu, saya mulai mematikan penyorotan secara default dan menyalakannya ketika saya menginginkannya, seperti yang Anda sarankan. Masih belum sempurna, tapi lebih baik.
Benjamin Oakes

9

Saya punya dua solusi berbeda, keduanya cukup bagus, masing-masing dengan perilaku yang berbeda nuansa. Favorit saya adalah opsi 2:

  1. Saya memiliki 2 baris berikut di .vimrc saya:

    autocmd cursorhold * set nohlsearch
    autocmd cursormoved * set hlsearch
    

    Yang pertama menunggu batas waktu (tidak dapat dikonfigurasi) jika kursor tidak bergerak dan mematikan pencarian. Yang kedua menyalakannya kembali jika kursor bergerak lagi.

    Ini bukan solusi yang sempurna, tetapi bekerja untuk saya (dan akan mendekati sempurna ketika batas waktu dapat dikonfigurasi - untuk saat ini, batas waktu terikat ke timer bawaan untuk vim.)

  2. Atau Anda dapat mencoba baris ini:

    autocmd cursorhold * set nohlsearch
    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    

Ini mematikan hlsearch setelah batas waktu singkat tanpa pergerakan kursor dan menyalakannya kembali untuk perintah pencarian standar. Itu tidak mencakup semua kemungkinan untuk menghidupkan kembali hlsearch, tapi itu cukup pemula untuk pembuktian konsep.


Terima kasih atas pembaruan - tidak melihatnya sampai sekarang. (Sepertinya Anda baru saja menambahkannya juga? Lucu itu.) Ini adalah konsep yang keren; Saya harus bermain-main dengannya.
Benjamin Oakes

Peringatan 2. adalah membuat pencarian dengan mode visual Vtidak berfungsi
Bryce Guinta

Saya telah memodifikasi baris pertama pada opsi 1 dengan yang berikut autocmd cursorhold * set nohlsearch | let @/ = "" ini. Ini akan menghapus register pencarian dan juga menghapus highlight. Belum menghabiskan banyak waktu dengan pengaturan ini tetapi saya ingin meletakkannya di sana untuk mereka yang berakhir di sini.
Berkeley Martinez

2

Saya cukup mengetik "/ asdf" (dengan asumsi "asdf" tidak ada dalam file) untuk menyingkirkan penyorotan. Saya tahu ini sangat sederhana, tetapi itu bekerja untuk saya.


2
Itu ide yang sama :noh, tetapi tidak selalu berhasil. :) Lucu Anda sebutkan itu, meskipun: Saya dulu punya teman yang selalu mengetik namanya karena itu akan muncul lebih jarang daripada sesuatu seperti "asdf" dalam apa yang ditulisnya. (Agak lucu, saya pikir.)
Benjamin Oakes

Benar. Mungkin aku akan ingat: noh lain kali.
Greg Graham

1

Masukkan yang berikut ini di file .vimrc Anda:

nnoremap <silent> <F11> :exe ":silent! normal /$^\r"<CR>

Ini akan secara diam-diam menyembunyikan istilah pencarian yang disorot tetapi tidak menonaktifkan :set hlsearchfitur. Ini diaktifkan kembali pada pencarian berikutnya.


Lebih baik menggunakan perintah builtin yang dirancang untuk tujuan ini -: nohl. Maka Anda tidak menerbangkan isi register pencarian Anda, yang digunakan untuk hal-hal seperti melompat ke pertandingan berikutnya, nilai default dari pola ketika tidak di tentukan, dll
jamessan

Ya, tapi itu mengganggu saya bahwa pencarian saya berikutnya tidak disorot seperti yang seharusnya. Jadi saya datang dengan solusi cepat ini. Mungkin juga kotor tetapi berfungsi. Saya pikir untuk ini dapat diterima untuk vim - bahkan jika saya tidak akan menggunakan hal-hal "kotor" dalam kode sumber proyek nyata yang besar.
Gregor Müllegger

1

Kemungkinan lain adalah mengatur ulang @/register (yang sebenarnya merupakan register baca-tulis) setelah melakukan substitusi. Ini mengembalikan sorotan sebelumnya:

command! -nargs=* -range S
\ let atslash=@/|exe ':'.<line1>.','.<line2>.'s'.<q-args>|let @/=atslash

Namun, ini masih memiliki beberapa masalah:
- Alih-alih memodifikasi :s, ini mendefinisikan perintah baru. Meskipun dimungkinkan untuk menggunakan cabbrevuntuk memetakan :ske :S, saya tahu tidak ada cara untuk menangkap semua konstruksi seperti :<range>s.
- jika :nohlsebelumnya Anda menggunakan untuk menyembunyikan hanya satu pencarian, maka ini akan menyoroti kembali pencarian sebelumnya. Saya tahu tidak ada cara untuk menemukan jika :nohldipanggil sebelumnya. (Mungkin dimungkinkan untuk mengatasi hal ini dan juga menimpa :nohlperintah, tetapi ini juga akan membutuhkan mengesampingkan semua perintah pencarian, yang mungkin terlalu banyak ...).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.