Vim: Wie markieren Sie ein Suchmuster aus einem Skript?

698
Steve Vermeulen

Ich hätte nicht gedacht, dass dies schwer wäre, aber es funktioniert nicht. Was ich versuche, ist das Aktivieren des Suchhighlights aus einem Skript heraus. Ich habe folgendes versucht:

function! g:TestFunc() let @/ ="testtext" set hlsearch endfunction  nnoremap <space> :call g:TestFunc()<cr> 

Was nicht funktioniert Wenn Sie also vor einem Text mit "testtext" ein Leerzeichen setzen, wird der Text nicht hervorgehoben. Der Benutzer muss noch 'n' drücken.

Ich habe auch versucht exec 'normal! n', das Ende der Funktion hinzuzufügen, aber das hat auch nicht funktioniert. Sogar feedkeys('n')scheitert.

0

3 Antworten auf die Frage

4
Bradd Szonye

Die Funktion funktioniert wie erwartet, wenn sie hlsearchvor dem Aufruf nicht gesetzt ist. Es scheint, dass die Einstellung in der Funktion keine Auswirkungen hat, wenn sie bereits eingestellt ist. Sie können dies umgehen, indem Sie nohlsearchin Ihrem Mapping Folgendes festlegen:

nnoremap <space> :set nohlsearch\|:call g:TestFunc()<cr> 

Wenn Sie lediglich bestimmte Muster hervorheben hlsearchmöchten und Sie den Mechanismus nicht speziell verwenden müssen, sollten Sie matchstattdessen den Befehl verwenden. Es ist viel mehr dasselbe sauberer.

Der Match-Befehl ist genau das, wonach ich gesucht habe, Prost! Steve Vermeulen vor 11 Jahren 0
1
Ingo Karkat

Sie können das zuletzt verwendete Suchmuster und die Hervorhebung nicht innerhalb einer Funktion festlegen, siehe :help function-search-undo. Verschieben Sie stattdessen die :set hlsearchdirekt in Ihr Mapping.

0
Life
function! wordsubstitute#run() execute "normal! gv\"ay" let @/ = @a "set nohlsearch let s:search_cmd = "normal! /".@/."/\<CR>" execute s:search_cmd."N" "set hlsearch endfunction 

Statt zu verwenden normal! nN, schreiben Sie nNin den Mapping-Befehl:

vnoremap [g/ :<c-u>call wordsubstitute#run()<CR>nN