В чем функциональная разница между: nohlsearch и: set nohlsearch?

13

Я заметил, что когда я использую :nohlsearchэто, это на самом деле не делает то же самое, что и :set nohlsearch.

В частности, hlsearchнастройка фактически не отключается (что и происходит :set hlsearch).

Чтобы продемонстрировать, что я имею в виду:

:set hlsearch
:nohlsearch
:echo &hlsearch

Это печатает 1( hlsearch все еще установлен! )

:set hlsearch
:set nohlsearch
:echo &hlsearch

Это происходит 0потому, что мы отключили hlsearch стандартным способом, чтобы отключить настройку в vim.

Так что мне интересно, потому что должна быть какая-то реальная причина :nohlsearchсуществования команды ex.

Причина, по которой меня это волнует, заключается в том, что теперь у меня есть потребность в моих сценариях vim, чтобы проверить, активна ли подсветка поиска, и, поскольку я использовал :nohlsearchвместо «: set nohlsearch» в других моих сценариях, мой &hlsearchтест всегда возвращается 1. Поэтому мне интересно, что я изменяю, больше не используя команду nohlsearchex.

Стивен Лу
источник

Ответы:

15

Из :h :nohlsearch

                                                        : noh: nohlsearch
: noh [lsearch] Остановить выделение для опции 'hlsearch'. Это
                        автоматически включается при использовании поиска
                        команда или установка опции 'hlsearch'.
                        Эта команда не работает в автокоманде, потому что
                        состояние выделения сохраняется и восстанавливается при
                        выполнение автокоманд autocmd-searchpat.
                        То же самое для вызова пользовательской функции.

Ключевым моментом является то, что он автоматически включает подсветку при запуске нового поиска. :set nohlsearchна самом деле hlsearchотключается, что означает, что в следующий раз, когда вы ищете что-либо, подсветка не происходит.

Пример: Предположим, включен hlsearch, если вы в настоящее время ищете "привет" в буфере, все "привет" будут выделены. Если вы используете :nohlsearchничего не будет выделено. Но если вы будете искать «мир», все «миры» будут выделены. Если бы вы использовали set nohlsearchвместо этого «мир» не будет выделен.


Также обратите внимание, что эта команда в основном ничего не делает внутри пользовательской функции. Например,

function! NoHlsearch()
    nohlsearch
endfunction

не имеет видимого эффекта при запуске.


Чтобы увидеть, действительно ли hlsearch активен, вы хотите проверить переменную v:hlsearch. Когда v:hlsearch = 0подсветка выключена, а когда v:hlsearch = 1подсветка включена. Вы, вероятно, должны убедиться, что &hlsearch = 1перед проверкой v:hlsearch.

Из :h v:hlsearch

                                        v: hlsearch-переменная hlsearch
v: hlsearch Переменная, определяющая, включена ли подсветка поиска.
                Имеет смысл только в том случае, если включена функция hlsearch, для которой требуется
                + Extra_search. Установка этой переменной в ноль действует как
                : nohlsearch команда, установка ее на один действует как
                        let & hlsearch = & hlsearch
FDinoff
источник
Можете ли вы уточнить, что вы подразумеваете под «в основном ничем» внутри функции? Это делает стандартную вещь (она временно прекращает выделять поиск до следующего запуска поиска).
Стивен Лу
Я также как бы надеюсь найти способ получить доступ к флагу, который контролирует, действует ли переходный процесс :nohlsearchили нет ... Я думаю, что в его отсутствие мне приходится прибегать к отслеживанию всех :nohlsearchвызовов с помощью переменной.
Стивен Лу
@StevenLu см. Правки.
FDinoff
Благодарю. Похоже, что код, который я использую, помогает разобраться с его аспектом «в основном ничего не делать», делая так: nnoremap <silent> <expr> <boundkey> SearchHighlight()где SearchHighlight()может возвращать строку ":silent nohlsearch\<CR>". Также спасибо за v:hlsearchсовет, как раз то, что мне было нужно.
Стивен Лу
1

Ваш сценарий требует, чтобы текущее состояние выделения было известно?

Чтобы отключить hlsearchтолько текущий поиск, я использую Ctrl-lэто в моем .vimrc:

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

Подсветка поиска возвращается при следующем поиске при использовании вышеуказанной команды. Ctrl-lэто удобно, потому что это нормальное использование, чтобы очистить и перерисовать экран.

Чтобы постоянно включать или отключать состояние подсветки поиска, я использую F3 в качестве переключателя:

nnoremap <F3> :set hlsearch! hlsearch?<CR>
thisoldman
источник