Как переключить видимость поиска в Vim, не отключая его - PullRequest
20 голосов
/ 29 января 2012

То, что я хотел бы, это сопоставить один ключ, например, F4 , поэтому нажатие F4 переключит видимость основных моментов поиска, и , так что запуск нового поиска обеспечивает видимость независимо от текущей видимости.

Что я пробовал:

  1. Отображение F4 на :nohlsearch временно отключает видимость подсветки, не отключая параметр hlsearch, но не переключает видимость обратно.
  2. Отображение F4 на :set hlsearch! включает / выключает, но я не хочу отключать настройку hlsearch, только настройку видимости. Если hlsearch выключен, он не возвращается автоматически с новым поиском.

Кажется, что нет противоположной формы :nohlsearch, и у самой команды есть проблемы с вызовом из функции.

Я нашел похожие вопросы, но они не дают ответа.

Обновление:
Первый комментарий содержит именно то, о чем я просил, воспроизведенный ниже:

let hlstate=0
nnoremap <F4> :if (hlstate == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=1-hlstate<cr>

(N.B. Для всех, кто использует это - необходимо заполнить карту одной строкой вместо использования функции, поскольку вы не можете изменить подсветку внутри функции.)

Смежный вопрос для немного другой функциональности: https://stackoverflow.com/a/16750393/1176650

Ответы [ 10 ]

14 голосов
/ 22 октября 2014

Обратите внимание, что последние Vims (7.4.79) имеют переменную v:hlsearch.Это означает, что вы можете улучшить свое отображение до:

:nnoremap <silent><expr> <Leader>h (&hls && v:hlsearch ? ':nohls' : ':set hls')."\n"
13 голосов
/ 24 мая 2013
" ctrl+c to toggle highlight.
let hlstate=0
nnoremap <c-c> :if (hlstate%2 == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=hlstate+1<cr>

Теперь просто нажмите Ctrl + C, чтобы переключить подсветку. Единственное, что нужно, это нажать дважды после поиска, чтобы отключить подсветку, потому что поиск не увеличивает счетчик.

9 голосов
/ 01 февраля 2012

Мне нужно сопоставить одну клавишу, например, F4, чтобы нажатие клавиши F4 переключало видимость основных моментов поиска и чтобы запуск нового поиска включал видимость независимо от текущей видимости.

Только что попробовал это и, кажется, добился цели:

" switch higlight no matter the previous state
nmap <F4> :set hls! <cr>
" hit '/' highlights then enter search mode
nnoremap / :set hlsearch<cr>/
2 голосов
/ 22 октября 2014

В другом ответе нужно переключить поиск по подсветке, это не так хорошо.

На самом деле вам нужно только

let @/ = ''

Я пишу небольшую функцию для реализации этой функции и выделяю текущее слово (так же, как * звездочку), но не перехожу к следующему найденному слову и не трогаю список переходов.

function! HLtoggle()
    if (@/ == '')
        let @/ = expand("<cword>")
    else
        let @/ = ''
    endif
endfunc

это просто, но я не нахожу это в Google.

Веселись вместе с vim! :)

1 голос
/ 29 июля 2014

С Выделите все совпадения с шаблоном поиска , мы можем сопоставить клавишу для переключения состояний выделения. В отличие от ответа trusktr, здесь мы используем переменную для хранения состояния.

«Если вы хотите быстро включить / отключить подсветку, вы можете назначить ключ для переключения опции hlsearch»:

" Press F4 to toggle highlighting on/off, and show current value.
:noremap <F4> :set hlsearch! hlsearch?<CR>

«Или нажмите клавишу возврата, чтобы временно выйти из выделенного поиска»:

:nnoremap <CR> :nohlsearch<CR><CR>
1 голос
/ 30 января 2012

Ладно, попробуйте это:

:map <F12> :set nohls<CR>:let @/ = ""<CR>:set hls<CR>

Затем, если вы нажмете F12 , он поворачивает подсветку, затем устанавливает последнюю строку поиска на пустую (то есть: очищаетэто), и снова включается выделение.

Или, если вы хотите сохранить строку поиска, вы можете сделать что-то вроде:

:map <F12> :set nohls<CR>:let @s = @/<CR>:let @/ = ""<CR>:set hls<CR>
:map <SHIFT><F12> :let @/=@s<CR>

Теперь после нажатия SHIFT F12 исходная строка поиска будет возвращена назад и выделена.

Если это все еще не удовлетворяет вас, вы все равно можете сделать это следующим образом:

:map <F12> :highlight Search term=None ctermfg=None ctermbg=None guifg=None guibg=None<CR>
:map <SHIFT><F12> :highlight Search term=OV1 ctermfg=OV2 ctermbg=OV3 guifg=OV4 guibg=OV5<CR>

Где OVx - это исходные значения, которые вы можете записать при выдаче :highlight Search<CR>.Таким образом, его можно отключить, а затем снова включить, но с двумя сочетаниями клавиш.Если вы хотите его с одним, вы должны создать функцию для того, что переключает его, а затем создать отображение для этой функции.

0 голосов
/ 10 июня 2019

Для этого я добавил эту простую строку в мой .vimrc:

nmap <LEADER>h /xxxxx<CR>
0 голосов
/ 01 марта 2019

Вы можете переключаться с :set invhlsearch

0 голосов
/ 18 августа 2013

Я использую эту слегка улучшенную версию от trusktr.Обратите внимание, что Ctrl + C, используемый в примере из trusktr, по умолчанию уже сопоставлен с Escape, что очень удобно.

" Toggle highlight search
let hlstate=0
nnomap <Leader>b :if (hlstate%2 == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=hlstate+1<CR>:echo "toggled visibility for hlsearch"<CR>
inomap <Leader>b <ESC>:if (hlstate%2 == 0) \| nohlsearch \| else \| set hlsearch \| endif \| let hlstate=hlstate+1<CR>:echo "toggled visibility for hlsearch"<CR>a
0 голосов
/ 30 января 2012

Хм, а не :set hlsearch противоположность :nohlsearch?

Первый включает подсветку матчей, второй включает временную подсветку матчей.

Я не понимаю, что вы подразумеваете под "Я не хочу переключать сам параметр hlsearch, только настройку видимости."выделение ") поисковых совпадений, ничего больше.

Если вы хотите, чтобы совпадения подсвечивались при каждом поиске, просто добавьте :set hlsearch к вашему ~/.vimrc.

Если вы хотите отключить подсветку после поиска, просто сопоставьте F4 с :nohlsearch, подсветка вернется к следующему поиску.

...