Vim Execute Nohlsearch не работает в функции - PullRequest
0 голосов
/ 08 мая 2018

:)
Мне нравится использовать подсветку поиска в Vim . Но через некоторое время это отстой, и я должен удалить его вручную (отображение определено). Поэтому я написал функцию для удаления выделения через некоторое время, привязанную к автокоманде. Время может быть проблемой, если вы просто играете главную роль в результате поиска, я связал эту функцию с событием CursorMoved и ввел счетчик до нуля. Если я переключаюсь между результатами или позже решаю перейти к элементу результатов поиска, это работает нормально, и все результаты снова подсвечиваются (проверяется вручную).

Я вставил много echo сообщений для отслеживания поведения. Это работает абсолютно нормально, пока счетчик не «истекает» (получает ноль). Затем подсветка и счетчик должны быть удалены. Оба работают как указано echo, но не визуально. Проверка после неустановленного выделения с помощью echom v:hlsearch подтверждает, что он сработал, но сразу после этого снова выделяется (задержка не отображается). Таким образом, цикл начинается снова, потому что счетчик истек, но обнаружена «новая» подсветка. Вызов той же команды, что и в функции, работает безупречно. Так что же происходит?

Так вот мой код в .vimrc:

" Function used if something is highlighted in the document.
" Is meant to be called several times by a autocommand.
" Sets a counter on the first call.
" Afterwards it decrease the counter each time get called, until zero.
" When the highlighting will be removed and the counter also.
" By this the time until remove highlighting depends on the frequency of
" function calls and that depend on the bounded auto command.
"
function! s:remove_highlight()
  echom 'Call'
  " Only makes sense when something is highlighted.
  if v:hlsearch
    echom 'In'
    " First call, so set the start time
    if !exists('g:highlight_counter')
      echom 'first call after new highlighting'
      let g:highlight_counter = 4

    else
      " Decrease highlight counter.
      let g:highlight_counter = g:highlight_counter - 1
      echom 'check ' . g:highlight_counter

      " Check if the counter is expired.
      if g:highlight_counter <= 0 
        " Unset counter and remove highlight.
        unlet g:highlight_counter
        execute 'nohlsearch'
        echom 'done? ' . !v:hlsearch
      else 
      endif
    endif

    echom 'out'
  endif

  echom 'End'
endfunction

Есть идеи, что здесь происходит? Понятия не имею ...

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Попробуйте это изнутри функции:

call feedkeys( ":nohlsearch\<CR>" )

Примечание: учтите двойные кавычки, они нужны для escape-последовательности. Это работает для меня даже изнутри функции (протестировано с vim 8). Я не эксперт по vimscript, но здесь может происходить то, что он добавляет ключи в очередь и обрабатывает их только после завершения функции.

0 голосов
/ 08 мая 2018

Во-первых, :nohlsearch - это команда ex, поэтому вам не нужно :execute.

Во-вторых, :help :nohlsearch говорит:

Эта команда не работает в автокоманде, потому что состояние выделения сохраняется и восстанавливается при выполнении автокоманд | autocmd-searchpat |. То же самое для вызова пользовательской функции.

Так что ... вы не можете использовать его в функции.

Отключение подсветки поиска после поиска не тривиально. Если вам нужна идея о том, как он задействован на самом деле , я бы посоветовал взглянуть на код vim-cool .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...