Як автоматично вимкнути "hlsearch" після того, як я закінчу пошук?


19

Мені подобається налаштування "hlsearch", але після того, як я закінчу пошук, мені здається, що це неприємно. Особливо, якщо я шукаю те, що має багато збігів. Я знаю, що можу це відключити

:set nohlsearch

Але це займає цілих 16 натискань клавіш, і що ще більше дратує, я повинен увімкнути його для наступного пошуку з

:set hlsearch    

Чи є спосіб, коли я можу автоматично ввімкнути hlsearch, коли я починаю пошук, і вимикати, коли я завершу пошук? Наприклад, якщо я перейшов у режим вставки або змінив текст, чи буде вимкнено hlsearch без додаткових натискань клавіш?


3
Визначити автоматично.
Антоній

@Antony Як і в тому випадку, якщо я вношу зміни або в режимі вставки, він вимкнеться, не потребуючи натискання будь-яких кнопок. Якби я почати пошук з /або ?, або , якщо натиснути nабо N, вийде без мене необхідності натискати які - небудь додаткові кнопки.
DJMcMayhem

1
О, і визначте "
готовий

1
:nno <BS> :set hls!\|set hls?<CR>- один рядок, одне натискання клавіш, зворотній зв'язок стану, і не намагаються друге відгадування, коли ви можете або не хочете виділити. Іноді мені хочеться, щоб під час редагування ліворуч було виділено на екрані. Іноді я цього не роблю, наприклад, використовую /як рух з оператором.
Антоній

nnoremap <M-\> :set hlsearch!<CR><Bar>:echo 'hlsearch: ' . ['Off', 'On'][&hlsearch]<CR>
Сато Кацура

Відповіді:


26

Є набагато зручніший спосіб. Замість використання

:set nohlsearch

що фактично вимикає налаштування hlsearch, використовуйте

:nohls

Це вимкне лише пошук hlsearch, поки ви знову не будете шукати. З:help nohls

                 *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
'hlsearch' 'hls'    boolean (default off)
            global
            {not in Vi}
            {not available when compiled without the
            |+extra_search| feature}

    ...

    When you get bored looking at the highlighted matches, you can turn it
    off with |:nohlsearch|.  This does **not change the option value**, as
    soon as you use a search command, the highlighting comes back.

Однак це рішення не є ідеальним, оскільки вам все одно доведеться набирати :nohlsбіль, яку потрібно робити після кожного пошуку. Ви можете обійти це за допомогою картографування, наприклад

nnoremap <esc><esc> :silent! nohls<cr>

Але є ще краще рішення! haya14busa / incsearch.vim . Це, принаймні, на мій погляд, істотний плагін vim. Основна особливість полягає в тому, що всі результати пошуку підсвічуються в режимі реального часу, коли ви вводите регекс. Наприклад:

введіть тут опис зображення

Однак додатковою функцією, яка також надається, є можливість негайно вмикати та вимикати hlsearch під час запуску / зупинки пошуку. Щоб увімкнути цю функцію, вам доведеться додати

set hlsearch
let g:incsearch#auto_nohlsearch = 1
map n  <Plug>(incsearch-nohl-n)
map N  <Plug>(incsearch-nohl-N)
map *  <Plug>(incsearch-nohl-*)
map #  <Plug>(incsearch-nohl-#)
map g* <Plug>(incsearch-nohl-g*)
map g# <Plug>(incsearch-nohl-g#)

до свого .vimrc.

Якщо у вас є інші nвідображення, їх доведеться вимкнути. Наприклад, я раніше

nnoremap n nzz
nnoremap N Nzz

Ці два відображення не сумісні з іншими!


Оскільки ви робите самостійну відповідь, я хотів би запропонувати вам також додати ще одну проблему set hlsearch. Якщо у вас це визначено, vimrcвін буде перезаписаний :nohкожен раз, коли ви джерело vimrc. Щоб розібратися в цьому, я маю if !&hlsearch | set hlsearch | endifв своєму vimrc. (І це ще одна проблема, яку плагін вирішує.)
grochmal

Данно, схоже, ціла купа коду та конфігурації для мене не дуже багато. Насправді це робить важко помітити ціль вашого додаткового пошуку, що робить його менш корисним для швидкої навігації.
Антоній

+1 за чудовий плагін, який відповідає на запитання та робить багато іншого!
RichVel

7

vim-cool - простий плагін, який робить саме це.

Vim-cool відключає підсвічування пошуку під час пошуку та повторно активує її при повторному пошуку.

Він працює без перепризначення шляху використанняCursorMoved і InsertEnterавтокомандами.


Ця методика (з використанням автокоманд) набагато краща за мою відповідь, і я не можу повірити, що не думав про це, коли писав моє. Оновлення
Багатий

5

Я використовую <Leader><Enter>як ярлик до :noh. (Мій керівник ,, тож він досить близький)

Це вимкне основні моменти до наступного пошуку.


3

Як ви вже відзначали у власній відповіді , набагато ефективніше вимкнути підсвічування за допомогою :nohlsearchкоманди (яку можна скоротити :noh), а не вимикати всю функцію та повертати її знову при наступному пошуку.

Якщо ви хочете вимикати підсвічування кожного разу, коли ви iвводите режим вставки, ви можете створити просте відображення для цього:

:nnoremap i :noh<cr>i

Читачеві залишається вправою створити подібні відображення для інших команд, де вони хочуть, щоб виділення було вимкнено.


2

Це може здатися дурним або наївним, але те, що я роблю, коли хочу зупинити виділення, - це пошук випадкової рядки, яка (практично напевно) відсутня в документі. Щось на зразок цього:

/skljdfhadhfs

Зрозуміло, це потребує декількох ключових штрихів, але вони справді випадкові, тому їх можна ввести за короткий час.


1
Але це змушує nі Nбільше не працювати, а також такі речі, як :%s//somethingабо :g//something. Це також захаращує вашу історію пошуку
DJMcMayhem

Так, але моє (напевно, неправильне) припущення полягає в тому, що оскільки вам більше не потрібно виділяти, вам не цікавий і конкретний пошук. Збивання історії пошуку - справжня проблема, якщо на неї покладатися.
Костас

1

Я виявив , що більш інтуїтивним перепризначити Ctrl- Lперефарбувати включати :nohls:

nnoremap <C-L> :nohls<cr><C-L>

Ласкаво просимо до Vi та Vim ! Дякую, що поділилися своїми знаннями з того, що, правда, давнє питання. Високоякісні відповіді, як ви могли помітити, зазвичай містять пояснення того, що робить код (це особливо корисно для нових виммерів, які можуть приземлитися тут без особливих знань). Це також може бути хорошою ідеєю у відповідних :helpрозділах!
D. Ben Knoble

0

Я використовую <Leader><Enter>як ярлик :hlsі мого лідера встановлено як простір.

let mapleader = "\<Space>"
nmap <silent> <leader><Esc> :set hls!<cr>

Після пошуку предмет буде виділено, щоб його вимкнути, натисніть <Space><Esc>. І якщо ви вирішили хотіти повторно відобразити результати пошуку, натисніть <Space><Esc>. Засіб hls!відображає цю прив'язку клавіш для переключення налаштувань hls(скорочення hlsearch, тобто підсвічування результату пошуку) (тому !перемикає налаштування прямо перед ним).


-1

Додайте цей макрос у свій .vimrc

map #h :set hls!<CR>

Це дозволить вам перемикати hilighting на #h


Це нічим не відрізняється від відповіді Джеймса Аффлека.
jamessan

Моє здається більш лаконічним.
Даррел Лі

Чому стислість доречна? Інший пост дає більше інформації про те, що означають частини команди, і ця публікація не містить додаткового вмісту.
Jamessan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.