Jaka jest funkcjonalna różnica między: nohlsearch a: set nohlsearch?

13

Zauważyłem, że kiedy go używam :nohlsearch, tak naprawdę nie robi tego samego :set nohlsearch.

W szczególności hlsearchustawienie nie jest faktycznie wyłączane (co jest :set hlsearch) osiągane.

Aby zademonstrować, co mam na myśli:

:set hlsearch
:nohlsearch
:echo &hlsearch

To drukuje 1( hlsearch jest nadal ustawiony! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

Drukuje 0ponieważ zmieniliśmy hlsearch wyłączyć za pomocą standardowego sposobu, aby przełączyć ustawienie się w vim.

Zastanawiam się, ponieważ musi istnieć jakiś rzeczywisty powód istnienia :nohlsearchpolecenia ex.

Powodem, dla którego dbam o to, jest to, że teraz potrzebuję skryptu vima, aby sprawdzić, czy wyróżnienie wyszukiwania jest aktywne, a ponieważ użyłem :nohlsearchzamiast „: set nohlsearch” w innym skrypcie, mój &hlsearchtest zawsze powraca 1. Zastanawiam się więc, co zmieniam, nie używając już nohlsearchpolecenia ex.

Steven Lu
źródło

Odpowiedzi:

15

Z :h :nohlsearch

                                                        : noh: nohlsearch
: noh [lsearch] Zatrzymaj podświetlanie dla opcji „hlsearch”. To
                        jest automatycznie włączany ponownie podczas korzystania z wyszukiwania
                        polecenie lub ustawienie opcji „hlsearch”.
                        To polecenie nie działa w poleceniu automatycznym, ponieważ
                        stan wyróżnienia jest zapisywany i przywracany, kiedy
                        wykonywanie autocommands autocmd-searchpat.
                        To samo dotyczy wywoływania funkcji użytkownika.

Kluczową kwestią jest to, że automatycznie włącza podświetlanie ponownie po rozpoczęciu nowego wyszukiwania. :set nohlsearchfaktycznie się hlsearchwyłącza, co oznacza, że ​​przy następnym wyszukiwaniu czegoś nie będzie podświetlania.

Przykład: Załóżmy, że hlsearchjest włączone, jeśli obecnie wyszukujesz hasło „cześć” w buforze, wszystkie „cześć” zostaną podświetlone. Jeśli używasz, :nohlsearchnic nie zostanie podświetlone. Ale jeśli następnie wyszukasz „świat”, wszystkie „świat” zostaną podświetlone. Gdybyś użył set nohlsearchzamiast tego, „świat” nie byłby podświetlony.


Zauważ też, że to polecenie w zasadzie nic nie działa w funkcji użytkownika. Na przykład,

function! NoHlsearch()
    nohlsearch
endfunction

nie ma widocznego efektu po uruchomieniu.


Aby sprawdzić, czy hlsearch jest rzeczywiście aktywny, chcesz sprawdzić zmienną v:hlsearch. Gdy v:hlsearch = 0podświetlanie jest wyłączone, a gdy v:hlsearch = 1podświetlanie jest włączone. Prawdopodobnie powinieneś się upewnić &hlsearch = 1przed sprawdzeniem v:hlsearch.

Z :h v:hlsearch

                                        v: hlsearch hlsearch-zmienna
v: hlsearch Zmienna określająca, czy podświetlanie wyszukiwania jest włączone.
                Ma sens tylko wtedy, gdy włączona jest funkcja „hlsearch”, która wymaga
                + extra_search. Ustawienie tej zmiennej na zero działa podobnie
                : polecenie nohlsearch, ustawienie na jeden zachowuje się jak
                        let & hlsearch = & hlsearch
FDinoff
źródło
Czy możesz wyjaśnić, co rozumiesz przez „zasadniczo nic” z wnętrza funkcji? Robi to w standardowy sposób (tymczasowo przestaje podświetlać wyszukiwanie, aż do następnego uruchomienia wyszukiwania).
Steven Lu
Mam również nadzieję, że znajdę sposób na uzyskanie dostępu do flagi, która kontroluje, czy stan przejściowy :nohlsearchjest aktywny, czy nie ... Myślę, że w przypadku jego braku muszę uciekać się do śledzenia wszystkich :nohlsearchpołączeń za pomocą zmiennej.
Steven Lu
@StevenLu zobacz zmiany.
FDinoff
Dzięki. Wygląda na to, że kod, którego używałem, włamuje się do aspektu „zasadniczo nic nie robię”, robiąc to: nnoremap <silent> <expr> <boundkey> SearchHighlight()gdzie SearchHighlight()może zwrócić ciąg znaków ":silent nohlsearch\<CR>". Dziękuję również za v:hlsearchwskazówkę, dokładnie to, czego potrzebowałem.
Steven Lu
1

Czy twój skrypt wymaga znajomości aktualnego stanu podświetlania?

Aby wyłączyć tylko hlsearchdla bieżącego wyszukiwania, używam Ctrl-lz tym w moim .vimrc:

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

Podświetlanie wyszukiwania powraca przy następnym wyszukiwaniu przy użyciu powyższego polecenia. Ctrl-ljest wygodny, ponieważ normalnym zastosowaniem jest czyszczenie i przerysowywanie ekranu.

Aby trwale zmienić lub wyłączyć stan podświetlania wyszukiwania, używam F3 jako mojego przełącznika:

nnoremap <F3> :set hlsearch! hlsearch?<CR>
ten stary
źródło