Яка функціональна відмінність між: 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колишньої команди.

Причина, чому я хвилююсь, полягає в тому, що зараз у мене є необхідність у моєму сценарії 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, встановивши його на один, як
                        нехай & hlsearch = & hlsearch

Чи можете ви уточнити, що ви маєте на увазі під принципом "в основному нічого" зсередини функції? Це робиться стандартна річ (тимчасово припиняє виділяти пошук до наступного запуску пошуку).
Стівен Лу

Я також сподіваюся знайти спосіб отримати доступ до прапора, який контролює, чи є перехідний :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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.