Sự khác biệt về chức năng giữa: nohlsearch và: set nohlsearch là gì?


13

Tôi nhận thấy rằng khi tôi sử dụng :nohlsearchnó không thực sự làm điều tương tự như :set nohlsearch.

Cụ thể, hlsearchcài đặt không thực sự bị tắt (đó là những gì :set hlsearch) hoàn thành.

Để chứng minh điều tôi muốn nói:

:set hlsearch
:nohlsearch
:echo &hlsearch

Bản in này 1( hlsearch vẫn được đặt! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

Điều này in 0vì chúng tôi đã tắt hlsearch bằng cách sử dụng cách tiêu chuẩn để tắt cài đặt trong vim.

Vì vậy, tôi tự hỏi vì phải có một số lý do thực tế để :nohlsearchlệnh ex tồn tại.

Lý do tại sao tôi quan tâm là bây giờ tôi có nhu cầu trong kịch bản vim của mình để kiểm tra xem phần tô sáng tìm kiếm có hoạt động hay không và vì tôi đang sử dụng :nohlsearchthay vì ": set nohlsearch" trong tập lệnh khác của mình, &hlsearchbài kiểm tra của tôi luôn trả về 1. Vì vậy, tôi tự hỏi những gì tôi đang thay đổi bằng cách không còn sử dụng nohlsearchlệnh ex.

Câu trả lời:


15

Từ :h :nohlsearch

                                                        : noh: không tìm kiếm
: noh [lsearch] Dừng tô sáng cho tùy chọn 'hlsearch'. Nó
                        được tự động bật lại khi sử dụng tìm kiếm
                        lệnh hoặc đặt tùy chọn 'hlsearch'.
                        Lệnh này không hoạt động trong chế độ tự động, bởi vì
                        trạng thái tô sáng được lưu và khôi phục khi
                        thực thi autocommands autocmd-searchpat.
                        Điều tương tự khi gọi một chức năng người dùng.

Điểm mấu chốt là nó tự động bật lại phần tô sáng khi bạn bắt đầu tìm kiếm mới. :set nohlsearchthực sự hlsearchtắt, có nghĩa là lần tiếp theo bạn tìm kiếm thứ gì đó không có điểm nhấn nào xảy ra.

Ví dụ: Giả sử hlsearchlà bật, Nếu bạn hiện đang tìm kiếm "xin chào" trong bộ đệm, tất cả "xin chào" sẽ được tô sáng. Nếu bạn sử dụng :nohlsearchkhông có gì sẽ được làm nổi bật. Nhưng nếu sau đó bạn tìm kiếm "thế giới", tất cả "thế giới" sẽ được tô sáng. Nếu bạn đã sử dụng set nohlsearchthay vì "thế giới" sẽ không được làm nổi bật.


Cũng lưu ý rằng lệnh này về cơ bản không có gì bên trong một chức năng người dùng. Ví dụ,

function! NoHlsearch()
    nohlsearch
endfunction

không có hiệu ứng rõ ràng khi chạy.


Để xem hlsearch có thực sự hoạt động hay không, bạn muốn kiểm tra biến v:hlsearch. Khi v:hlsearch = 0tô sáng được tắt, và khi v:hlsearch = 1tô sáng được bật. Bạn có thể nên chắc chắn &hlsearch = 1trước khi kiểm tra v:hlsearch.

Từ :h v:hlsearch

                                        v: hlsearch hlsearch-biến
v: hlsearch Biến xác định xem có bật sáng tìm kiếm hay không.
                Chỉ có ý nghĩa nếu 'hlsearch' được bật mà yêu cầu
                + nghiên cứu thêm. Đặt biến này thành 0 hoạt động tương tự
                : lệnh nohlsearch, đặt nó thành một hành động như
                        hãy & hlsearch = & hlsearch

Bạn có thể làm rõ những gì bạn có nghĩa là "về cơ bản không có gì" từ bên trong một chức năng? Nó thực hiện điều tiêu chuẩn (nó tạm thời dừng làm nổi bật tìm kiếm cho đến khi lần tìm kiếm tiếp theo được gọi).
Steven Lu

Tôi cũng hy vọng tìm được cách truy cập cờ kiểm soát xem tạm thời :nohlsearchcó hiệu lực hay không ... Tôi nghĩ rằng khi vắng mặt, tôi phải dùng đến việc theo dõi tất cả các :nohlsearchcuộc gọi bằng một biến.
Steven Lu

@StevenLu xem các chỉnh sửa.
FDinoff

Cảm ơn. Có vẻ như mã tôi đã sử dụng hack xung quanh khía cạnh "về cơ bản không làm gì" của nó bằng cách thực hiện điều này: nnoremap <silent> <expr> <boundkey> SearchHighlight()nơi SearchHighlight()có thể trả về một chuỗi ":silent nohlsearch\<CR>". Cũng cảm ơn bạn cho tiền v:hlsearchboa, chỉ những gì tôi cần.
Steven Lu

1

Có kịch bản của bạn yêu cầu rằng trạng thái nổi bật hiện tại phải được biết?

Để tắt hlsearchcho chỉ tìm kiếm hiện tại, tôi sử dụng Ctrl-l, với điều này trong .vimrc của tôi:

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

Tìm kiếm đánh dấu trả về với tìm kiếm tiếp theo khi sử dụng lệnh trên. Ctrl-lthuận tiện vì sử dụng bình thường là xóa và vẽ lại màn hình.

Để thay đổi trạng thái tô sáng tìm kiếm bật hoặc tắt liên tục, tôi sử dụng F3 làm chuyển đổi của mình:

nnoremap <F3> :set hlsearch! hlsearch?<CR>
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.