Làm nổi bật tất cả sự xuất hiện của một từ được chọn?


159

Làm cách nào tôi có thể làm nổi bật tất cả sự xuất hiện của một từ đã chọn trong GVim, như trong Notepad ++?

Câu trả lời:


202

Ở chế độ Bình thường:

:set hlsearch

Sau đó tìm kiếm một mẫu bằng lệnh /ở chế độ Bình thường hoặc <Ctrl>otheo sau /trong chế độ Chèn. *trong chế độ Bình thường sẽ tìm kiếm sự xuất hiện tiếp theo của từ dưới con trỏ. Các hlsearchtùy chọn sẽ đánh dấu tất cả trong số họ nếu thiết lập.#sẽ tìm kiếm sự xuất hiện trước đó của từ này.

Để xóa phần tô sáng của tìm kiếm trước:

:nohlsearch

Bạn có thể muốn ánh xạ :nohlsearch<CR>tới một số phím thuận tiện.


34
Nếu bạn có kế hoạch chuyển đổi hlsearchnhiều, bạn có thể muốn lập bản đồ :set hlsearch!thay vì :set nohlsearch. Điều này bật tắt cài đặt thay vì luôn tắt nó.
David Winslow

1
Ngoài ra, hãy lưu ý rằng con trỏ sẽ di chuyển đến lần xuất hiện trước (#) hoặc tiếp theo (*) của từ
Juan Campa

1
Nhưng bạn có thể quay trở lại vị trí mà bạn ép *hoặc #bởi <Ctrl>otrong chế độ bình thường.
Ruslan

8
Thay vì :nohlsearch, bạn chỉ có thể sử dụng:noh
crisron

Đặt trong .vimrc: noremap <F4> :set hlsearch! hlsearch?<CR>để chuyển đổi giữa tô sáng và xóa tô sáng bằng <F4>.
Chalist

123

Các *chủ chốt sẽ làm nổi bật tất cả các lần xuất hiện của từ đó là dưới con trỏ.


31
Chỉ khi &hlsearchđược bật.
wilmustell

10
Nó cũng sẽ nhảy đến lần xuất hiện tiếp theo của từ dưới con trỏ. Nếu bạn muốn chuyển sang lần xuất hiện trước, hãy sử dụng #.
Vinicius Pinto

7
Tôi có thể làm cho nó chỉ ở vị trí hiện tại?
nn0p

@ nn0p Có, bạn có thể - trong trường hợp đó, hãy làm theo câu trả lời được chấp nhận stackoverflow.com/a 43231203/363688 . Đây chỉ là một hành động thay thế cũng sẽ làm nổi bật tất cả các lần xuất hiện.
ngủ

1
Có cách nào để sử dụng chức năng này nhưng với một hoặc nhiều từ được tô sáng?
Sung Cho

22

Tôi biết hơn đó là một câu hỏi thực sự cũ, nhưng nếu ai đó quan tâm đến tính năng này, có thể kiểm tra mã này http://vim.wikia.com/wiki/Auto_highlight_cản_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
Có thể sửa đổi tập lệnh này sao cho văn bản bên dưới con trỏ được tô sáng ban đầu khi nhấn z / vẫn được tô sáng ngay cả khi con trỏ được di chuyển sang các từ khác? Điều đó sẽ hữu ích khi cuộn qua mã nguồn tìm từ ban đầu.
stensootla

18

cách đơn giản nhất, gõ ở chế độ bình thường *

Tôi cũng có các ánh xạ này để bật và tắt

"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

Chọn từ bằng cách nhấp vào nó

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

Phần thưởng: CountWordFunction

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>

Chọn từ bằng chuột và đếm số lần xuất hiện cùng một lúc: OBS: Lưu ý rằng trong phiên bản này, chúng tôi có lệnh "CountWord" ở cuối

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

Bây giờ tôi sử dụng nnoremap * *``cgnnnoremap # #``cgN
SergioAraujo

Vì vậy, sau khi tôi gõ *, làm cách nào để tắt phần tô sáng?
dùng5359531

Đây là từ nổi bật trong tài liệu hiện tại
Chalist

@ user5359531 :nohhoặc:nohlsearch
dylnmc

@ user5359531 thì sao nnoremap <silent> * :execute "normal! *N"<cr>nnoremap <silent> # :execute "normal! #n"<cr>? Chúng chỉ làm nổi bật từ dưới con trỏ nhưng không chuyển từ này sang lần xuất hiện tiếp theo.
dylnmc

10

Tìm kiếm giải pháp dựa trên ( *,/ ...) di chuyển con trỏ, điều này có thể không may.

Một cách khác là sử dụng plugin mark.vim nâng cao , sau đó hoàn tất .vimrcđể cho phép nhấp đúp vào tô sáng kích hoạt (Tôi không biết cách lựa chọn bàn phím có thể kích hoạt lệnh):

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

Nó cho phép nhiều điểm nhấn, kiên trì, vv

Để xóa phần tô sáng, một trong hai:

  • Nhấp đúp lần nữa
  • :Mark (tắt cho đến khi lựa chọn tiếp theo)
  • :MarkClear

2
Các giải pháp dựa trên tìm kiếm chỉ di chuyển con trỏ nếu bật tìm kiếm gia tăng. Bạn có thể tắt nó như thế này : :set noincsearch. Theo tôi đó là một trong những tính năng khó chịu nhất trong Vim và là một trong những điều đầu tiên tôi vô hiệu hóa cho các bản cài đặt mới.
jahroy

3
Tôi nghĩ rằng *sẽ di chuyển con trỏ vô điều kiện. Và tôi không thể thấy làm thế nào incsearchcó thể gây phiền nhiễu, vì đó chỉ là một 'nhìn về phía trước', thực hiện tìm kiếm hiện tại mà không thực sự thay đổi vị trí của bạn.
YvesgereY

3
Wow ... Bạn nói đúng. Tôi cho rằng tắt incsearchsẽ ngăn chặn chuyển động, nhưng một bài kiểm tra nhanh xác nhận bạn đã đúng. Lời xin lỗi của tôi. Tuy nhiên, thật dễ dàng để tạo một bản đồ ngăn chặn sự di chuyển : :nnoremap * *N. Tôi không thể tin rằng bạn không thấy phiền khi con trỏ của bạn nhảy khắp màn hình khi bạn thực hiện tìm kiếm. Nhưng ... những điều này là hoàn toàn chủ quan. Vive la différence ;-)
jahroy

3
Bạn cũng có thể làm :let @/='hilight_this', giả sử bạn đã hlsearchkích hoạt. Nó làm nổi bật văn bản mà không cần nhảy và bạn không phải thay đổi cài đặt hiện có. Điều này thay đổi giá trị hiện được lưu trữ trong sổ đăng ký tìm kiếm.
Ben Davis

1
Đây phải là câu trả lời được chấp nhận. <Leader> m thực hiện công việc, không cần lập bản đồ nhấp đúp.
Sassan

4

Đầu tiên (hoặc trong .vimrc của bạn):

:set hlsearch

Sau đó định vị con trỏ của bạn trên từ bạn muốn tô sáng và nhấn *.

hlsearchcó nghĩa là làm nổi bật tất cả các lần xuất hiện của tìm kiếm hiện tại và *có nghĩa là tìm kiếm từ dưới con trỏ.


3

Trước tiên hãy đảm bảo rằng hlsearch được bật bằng cách ban hành lệnh sau

:set hlsearch

Bạn cũng có thể thêm tệp này vào tệp .vimrc của mình như đã đặt

set hlsearch

bây giờ khi bạn sử dụng cơ chế tìm kiếm nhanh trong chế độ lệnh hoặc lệnh tìm kiếm thông thường, tất cả các kết quả sẽ được tô sáng. Để di chuyển về phía trước giữa các kết quả, nhấn 'n' để di chuyển về phía sau nhấn 'N'

Ở chế độ bình thường, để thực hiện tìm kiếm nhanh từ dưới con trỏ và chuyển sang lần xuất hiện tiếp theo trong một lệnh nhấn '*', bạn cũng có thể tìm kiếm từ dưới con trỏ và di chuyển đến lần xuất hiện trước bằng cách nhấn '# '

Trong chế độ bình thường, tìm kiếm nhanh cũng có thể được gọi với

/searchterm<Enter>

để loại bỏ các điểm nổi bật trong việc sử dụng ocuurences, tôi đã ràng buộc điều này với một phím tắt trong .vimrc của tôi

:nohl

2

Cho phép đánh dấu tìm kiếm:

:set hlsearch

Sau đó tìm kiếm từ:

/word<Enter>


2

để tô sáng từ mà không di chuyển con trỏ, hãy ngồi phịch

" 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>

vào vimrc của bạn.

Những gì tốt đẹp về điều này là g*g#vẫn sẽ hoạt động như "bình thường" *#.


Để hlsearchtắt, bạn có thể sử dụng "dạng ngắn" (trừ khi bạn có một chức năng khác bắt đầu bằng "noh" trong chế độ lệnh) : :noh. Hoặc bạn có thể sử dụng phiên bản dài::nohlsearch

Để thuận tiện hơn (tôi thấy mình hlsearchcó thể bật 20 lần mỗi ngày), bạn có thể lập bản đồ để chuyển đổi hlsearchnhư vậy:

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

.:. nếu <leader>\(theo mặc định), bạn có thể nhấn \st(nhanh chóng) ở chế độ bình thường để chuyển đổi hlsearch.

Hoặc có thể bạn chỉ muốn có :nohbản đồ:

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

Ở trên chỉ đơn giản là chạy :nohlsearchnhư vậy (không giống như :set hlsearch!) nó vẫn sẽ làm nổi bật từ khi bạn nhấn *hoặc #ở chế độ bình thường .

chúc mừng



1

Sử dụng autocmd CursorMoved * exe printf('match IncSearch /\V\<%s\>/', escape(expand('<cword>'), '/\'))

Hãy chắc chắn rằng bạn đã IncSearchthiết lập một cái gì đó. ví dụ call s:Attr('IncSearch', 'reverse'). Ngoài ra, bạn có thể sử dụng một nhóm nổi bật khác ở vị trí của nó.

Điều này sẽ làm nổi bật tất cả các lần xuất hiện của các từ dưới con trỏ của bạn mà không có độ trễ. Tôi thấy rằng một sự chậm trễ làm tôi chậm lại khi tôi lướt qua mã. Màu nổi bật sẽ phù hợp với màu của từ, vì vậy nó vẫn phù hợp với sơ đồ của bạn.


0

Tại sao không chỉ: z /

Điều đó sẽ làm nổi bật từ hiện tại dưới con trỏ và bất kỳ lần xuất hiện nào khác. Và bạn không phải đưa ra một lệnh riêng cho từng mục bạn đang tìm kiếm. Có lẽ đó là không có sẵn trong gvim u ám? Đó là trong vim theo mặc định.

* chỉ tốt nếu bạn muốn con trỏ di chuyển đến lần xuất hiện tiếp theo. Khi so sánh trực quan hai thứ, bạn thường không muốn con trỏ di chuyển và thật khó chịu khi nhấn phím * mỗi lần.


Vim và gvim thường có cùng một bộ lệnh. Không có tài liệu tham khảo trong các tài liệu trợ giúp cho lệnh "z /".
wds

Nó không chỉ có sẵn trong gvim, mà còn trong vim. Chỉ cần kiểm tra nó - rõ ràng là không hoạt động.
Ruslan

z / hoạt động khi tập lệnh này được đề cập trong câu trả lời trước đó được sử dụng.
fzzylogic

0
  1. Thêm những dòng đó trong ~/.vimrctập tin của bạn

" 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. Tải lại các cài đặt với :so%
  2. Trong mô hình bình thường đi qua từ.

  3. Nhấn * Nhấn F8 để tìm kiếm đệ quy dưới toàn bộ dự án của bạn qua từ


0

Ví dụ: plugIns này:

Chỉ cần tìm kiếm theo con trỏ trong vimawclaw.com

Chìa khóa, như clagccs đã đề cập, là điểm nổi bật KHÔNG xung đột với tìm kiếm của bạn : https://vim.fandom.com/wiki/Auto_highlight_cản_word_when_idle

Ảnh chụp màn hình về cách nó KHÔNG xung đột với tìm kiếm: nhập mô tả hình ảnh ở đây Ghi chú:

  • Theo mặc định, vim-illuminate nổi bật, trong ảnh chụp màn hình của tôi, tôi đã chuyển sang gạch chân
  • Theo mặc định, vim-illuminate làm nổi bật / gạch chân từ dưới con trỏ, trong ảnh chụp màn hình của tôi, tôi bỏ đặt nó
  • màu sắc của tôi rất xám-ish. Kiểm tra của bạn để tùy chỉnh nó quá.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.