Sorot semua kemunculan kata yang dipilih?


159

Bagaimana saya bisa menyorot semua kemunculan kata yang dipilih di GVim, seperti di Notepad ++?

Jawaban:


202

Dalam mode Normal:

:set hlsearch

Kemudian cari pola dengan perintah /dalam mode Normal, atau <Ctrl>odiikuti oleh /dalam mode Sisipkan. *dalam mode Normal akan mencari kemunculan kata berikutnya di bawah kursor. The hlsearchpilihan akan menyoroti semua dari mereka jika ditetapkan. #akan mencari kemunculan kata sebelumnya.

Untuk menghapus highlight dari pencarian sebelumnya:

:nohlsearch

Anda mungkin ingin memetakan :nohlsearch<CR>ke beberapa tombol yang mudah.


34
Jika Anda berencana untuk Toggling hlsearchbanyak Anda mungkin ingin untuk memetakan :set hlsearch!bukan :set nohlsearch. Ini mengubah pengaturan daripada selalu mematikannya.
David Winslow

1
Perlu diketahui juga bahwa kursor akan pindah ke kemunculan kata sebelumnya (#) atau berikutnya (*)
Juan Campa

1
Tapi Anda bisa kembali ke posisi di mana Anda menekan *atau #oleh <Ctrl>odalam mode normal.
Ruslan

8
Alih-alih :nohlsearch, Anda bisa menggunakan:noh
crisron

Set in .vimrc: noremap <F4> :set hlsearch! hlsearch?<CR>untuk beralih di antara highlight dan menghapus highlight oleh <F4>.
Chalist

124

The *key akan menyoroti semua kejadian dari kata yang berada di bawah kursor.


31
Hanya jika &hlsearchaktif.
wilhelmtell

10
Ini juga akan melompat ke kemunculan kata berikutnya di bawah kursor. Jika Anda ingin melompat ke kejadian sebelumnya, gunakan #.
Vinicius Pinto

7
Bisakah saya membuatnya tetap pada posisi saat ini?
nn0p

@ nn0p Ya Anda bisa - dalam hal ini ikuti jawaban yang diterima stackoverflow.com/a/3431203/363688 . Ini hanya tindakan alternatif yang juga akan menyoroti semua kejadian.
sleepynate

1
apakah ada cara untuk menggunakan fungsi ini tetapi dengan satu kata yang disorot atau lebih?
Sung Cho

22

Saya tahu daripada pertanyaan yang sangat lama, tetapi jika seseorang tertarik pada fitur ini, dapat memeriksa kode ini http://vim.wikia.com/wiki/Auto_highlight_current_word_when_idle

" Highlight all instances of word under cursor, when idle.
" Useful when studying strange source code.
" Type z/ to toggle highlighting on/off.
nnoremap z/ :if AutoHighlightToggle()<Bar>set hls<Bar>endif<CR>
function! AutoHighlightToggle()
   let @/ = ''
   if exists('#auto_highlight')
     au! auto_highlight
     augroup! auto_highlight
     setl updatetime=4000
     echo 'Highlight current word: off'
     return 0
  else
    augroup auto_highlight
    au!
    au CursorHold * let @/ = '\V\<'.escape(expand('<cword>'), '\').'\>'
    augroup end
    setl updatetime=500
    echo 'Highlight current word: ON'
  return 1
 endif
endfunction

1
Apakah mungkin untuk memodifikasi skrip ini sedemikian rupa sehingga teks di bawah kursor yang awalnya disorot ketika z / ditekan tetap disorot bahkan ketika kursor dipindahkan ke kata lain? Itu akan berguna ketika menggulir kode sumber mencari kata awal.
stensootla

18

cara paling sederhana, ketik mode normal *

Saya juga punya pemetaan ini untuk mengaktifkan dan menonaktifkan

"highligh search enabled by default
set hlsearch
"now you can toggle it
nnoremap <S-F11> <ESC>:set hls! hls?<cr>
inoremap <S-F11> <C-o>:set hls! hls?<cr>
vnoremap <S-F11> <ESC>:set hls! hls?<cr> <bar> gv

Pilih kata dengan mengkliknya

set mouse=a     "Enables mouse click
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>

Bonus: Fungsi CountWord

fun! CountWordFunction()
    try
        let l:win_view = winsaveview()
        let l:old_query = getreg('/')
        let var = expand("<cword>")
        exec "%s/" . var . "//gn"
    finally
        call winrestview(l:win_view)
        call setreg('/', l:old_query)
    endtry
endfun
" Bellow we set a command "CountWord" and a mapping to count word
" change as you like it
command! -nargs=0 CountWord :call CountWordFunction()
nnoremap <f3> :CountWord<CR>

Memilih kata dengan mouse dan menghitung kejadian sekaligus: OBS: Perhatikan bahwa dalam versi ini kita memiliki perintah "CountWord" di akhir

nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>

Sekarang saya menggunakan nnoremap * *``cgndannnoremap # #``cgN
SergioAraujo

jadi setelah saya mengetik *, bagaimana cara mematikan penyorotan?
user5359531

Ini untuk menyoroti kata saat ini dalam dokumen
Chalist

@ user5359531 :nohatau:nohlsearch
dylnmc

@ user5359531 bagaimana dengan nnoremap <silent> * :execute "normal! *N"<cr>dan nnoremap <silent> # :execute "normal! #n"<cr>? Ini hanya menyoroti kata di bawah kursor tetapi tidak memindahkannya ke kejadian berikutnya.
dylnmc

10

Solusi berbasis pencarian ( *, /...) memindahkan kursor, yang mungkin disayangkan.

Alternatifnya adalah menggunakan plugin mark.vim yang disempurnakan , kemudian selesaikan Anda .vimrcuntuk membiarkan sorotan pemicu klik dua kali (saya tidak tahu bagaimana pilihan keyboard dapat memicu perintah):

"Use Mark plugin to highlight selected word  
map <2-leftmouse> \m   

Ini memungkinkan beberapa penyorotan, ketekunan, dll.

Untuk menghapus penyorotan, baik:

  • Klik dua kali lagi
  • :Mark (matikan hingga pilihan berikutnya)
  • :MarkClear

2
Solusi berbasis pencarian hanya memindahkan kursor jika pencarian incrememntal dihidupkan. Anda dapat mematikannya seperti ini: :set noincsearch. Menurut pendapat saya itu adalah salah satu fitur yang paling menyebalkan di Vim dan salah satu hal pertama yang saya nonaktifkan untuk pemasangan baru.
Jahroy

3
Saya pikir *akan memindahkan kursor tanpa syarat. Dan saya tidak bisa melihat bagaimana incsearchmungkin menjengkelkan, karena itu hanya 'melihat ke depan', melakukan pencarian saat ini tanpa benar-benar mengubah posisi Anda.
YvesgereY

3
Wow ... Kamu benar. Saya berasumsi bahwa mematikan incsearchakan mencegah gerakan, tetapi tes cepat mengkonfirmasi Anda benar. Permintaan maaf saya. Namun, itu super mudah untuk membuat pemetaan yang mencegah gerakan: :nnoremap * *N. Saya tidak percaya Anda tidak merasa terganggu karena kursor Anda melompati layar saat Anda melakukan pencarian. Tapi ... hal-hal ini sepenuhnya subjektif. Vive la différence ;-)
jahroy

3
Anda juga dapat melakukannya :let @/='hilight_this', dengan asumsi Anda telah hlsearchmengaktifkan. Ini menyoroti teks tanpa melompat, dan Anda tidak perlu mengubah pengaturan yang ada. Ini mengubah nilai yang saat ini disimpan dalam register pencarian.
Ben Davis

1
Ini harus menjadi jawaban yang diterima. <leader> m melakukan pekerjaan, tidak perlu memetakan klik dua kali.
Sassan

4

Pertama (atau di .vimrc Anda):

:set hlsearch

Lalu posisikan kursor Anda di atas kata yang ingin Anda sorot, dan tekan *.

hlsearchberarti menyorot semua kemunculan pencarian saat ini, dan *berarti mencari kata di bawah kursor.


3

Pertama pastikan bahwa hlsearch diaktifkan dengan mengeluarkan perintah berikut

:set hlsearch

Anda juga dapat menambahkan ini ke file .vimrc Anda sebagaimana diatur

set hlsearch

sekarang ketika Anda menggunakan mekanisme pencarian cepat dalam mode perintah atau perintah pencarian biasa, semua hasil akan disorot. Untuk bergerak maju di antara hasil, tekan 'n' untuk bergerak mundur tekan 'N'

Dalam mode normal, untuk melakukan pencarian cepat untuk kata di bawah kursor dan untuk beralih ke kejadian berikutnya dalam satu perintah tekan '*', Anda juga dapat mencari kata di bawah kursor dan pindah ke kejadian sebelumnya dengan menekan '# '

Dalam mode normal, pencarian cepat juga dapat dipanggil dengan

/searchterm<Enter>

untuk menghapus highlight pada penggunaan ocuurences, saya telah mengikat ini ke shortcut di .vimrc saya

:nohl

2

Aktifkan penyorotan pencarian:

:set hlsearch

Kemudian cari kata:

/word<Enter>


2

untuk menyorot kata tanpa memindahkan kursor, plop

" highlight reg. ex. in @/ register
set hlsearch
" remap `*`/`#` to search forwards/backwards (resp.)
" w/o moving cursor
nnoremap <silent> * :execute "normal! *N"<cr>
nnoremap <silent> # :execute "normal! #n"<cr>

ke dalam vimrc Anda.

Apa yang baik tentang ini g*dan g#masih akan bekerja seperti "normal" *dan #.


Untuk mengatur hlsearchoff, Anda dapat menggunakan "short-bentuk" (kecuali jika Anda memiliki fungsi lain yang dimulai dengan "noh" dalam mode perintah): :noh. Atau Anda dapat menggunakan versi panjang::nohlsearch

Untuk kenyamanan yang ekstrem (saya menemukan diri saya beralih hlsearchmungkin 20 kali per hari), Anda dapat memetakan sesuatu untuk beralih hlsearchseperti:

" search highlight toggle
nnoremap <silent> <leader>st :set hlsearch!<cr>

.:. jika Anda <leader>adalah \(secara default), Anda dapat menekan \st(cepat) dalam yang normal mode untuk beralih hlsearch.

Atau mungkin Anda hanya ingin :nohmemetakan:

" search clear
nnoremap <silent> <leader>sc :nohlsearch<cr>

Di atas hanya berjalan :nohlsearchbegitu (tidak seperti :set hlsearch!) itu masih akan menyorot kata lain kali Anda menekan *atau #dalam mode normal .

Bersulang



1

Menggunakan autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))

Pastikan Anda telah IncSearchmenetapkan sesuatu. mis call s:Attr('IncSearch', 'reverse'). Atau Anda dapat menggunakan grup sorotan lain sebagai gantinya.

Ini akan menyoroti semua kemunculan kata di bawah kursor Anda tanpa penundaan. Saya menemukan bahwa penundaan memperlambat saya ketika saya memeriksa kode. Warna highlight akan cocok dengan warna kata, sehingga tetap konsisten dengan skema Anda.


0

Mengapa tidak adil: z /

Itu akan menyoroti kata saat ini di bawah kursor dan kejadian lainnya. Dan Anda tidak harus memberikan perintah terpisah untuk setiap item yang Anda cari. Mungkin itu tidak tersedia di gvim yang tidak suci? Secara default vim sudah dalam vim.

* hanya baik jika Anda ingin kursor pindah ke kejadian berikutnya. Saat membandingkan dua hal secara visual, Anda seringkali tidak ingin kursor bergerak, dan sangat menjengkelkan untuk menekan tombol * setiap kali.


Vim dan gvim biasanya memiliki set perintah yang sama. Tidak ada referensi dalam dokumen bantuan untuk perintah "z /".
wds

Ini tidak tersedia tidak hanya di gvim, tetapi juga di vim. Hanya memeriksanya - jelas tidak bekerja.
Ruslan

z / berfungsi saat skrip ini disebutkan dalam jawaban sebelumnya sedang digunakan.
fzzylogic

0
  1. Tambahkan baris-baris itu di ~/.vimrcfile Anda

" highlight the searched items set hlsearch " F8 search for word under the cursor recursively , :copen , to close -> :ccl nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

  1. Muat ulang pengaturan dengan :so%
  2. Dalam model normal pergi ke kata.

  3. Tekan * Tekan F8 untuk mencari secara rekursif di bawah seluruh proyek Anda di atas kata


0

Misalnya plugIns ini:

Cukup cari di bawah kursor di vimawesome.com

Kuncinya, seperti yang disebutkan clagccs , adalah bahwa sorot TIDAK bertentangan dengan pencarian Anda : https://vim.fandom.com/wiki/Auto_highlight_current_word_when_idle

Tangkapan layar tentang bagaimana BUKAN bertentangan dengan pencarian: masukkan deskripsi gambar di sini Catatan:

  • vim-illuminate highlight secara default, di screen-shot saya saya beralih ke garis bawah
  • vim-illuminate highlight / menggarisbawahi kata di bawah kursor secara default, di screen-shot saya tidak disetel
  • tema warna saya sangat abu-abu. Periksa milik Anda untuk menyesuaikannya juga.
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.