É possível obter a sequência correspondente depois de chamar: search ()

14

Em uma função vimscript, preciso atribuir uma string correspondente a uma variável l:matchedapós a chamada search()e estou me perguntando se existe uma maneira mais curta do que o que estou fazendo atualmente:

let l:pattern   = '\v^Foo: \zs.*'
let l:line      = search(l:pattern)
let l:line_text = getline(l:line)
let l:matched   = matchstr(l:line, l:pattern)

Idealmente, eu gostaria de algo como

let l:matched = search_text(l:pattern)

sem recorrer a getline(). Existe uma função do vim que pareço incapaz de encontrar?

René Nyffenegger
fonte
1
Infelizmente, a resposta é não.
Sato Katsura
1
protip: variáveis ​​locais são o padrão dentro das funções, portanto você provavelmente pode renunciar à l:declaração do espaço para nome.
Peter Rincker
1
em uma função você provavelmente pode fazer: :let @/="pattern" | norm! ygne ter o conteúdo do registro 0 disponível.
Christian Brabandt

Respostas:

7

Como o cursor está colocado na 1ª letra da partida, você provavelmente poderá fazer um :normal! y$após a pesquisa e obter o conteúdo do registro em sua variável local.

Outra abordagem, que eu acho que funcionaria muito bem aqui, seria usar :substitutecom a nflag (ou seja, sem uma substituição real ):

function! ActOn(match)
    " do something with the match
    echo a:match
    " [...]
endfunction

function! FindAndCall(regex, func_name)
    execute ':keeppatterns %s/' . a:regex . '/\=' . a:func_name. '(submatch(0))/gn'
endfunction

... e você chama assim:

:call FindAndCall('^Foo: \zs.*', 'ActOn')

Isso praticamente cria ActOnuma função de retorno de chamada - ela será avaliada para cada correspondência.

VanLaser
fonte
1
Nota: :scom uma nsubexposição -expressão e o sinalizador está disponível apenas desde o Vim 7.3.627+. Caso contrário, você precisará fazer uma substituição realmente (coxo, pois isso marcará o buffer como modificado). Você provavelmente também deseja salvar e restaurar o registro de pesquisa @/ou usar :keeppatterns.
Peter Rincker
1
Corrija o erro de digitação: keeppaterns-> keeppatterns. Está causando o E488: Trailing charactersque é bastante complicado rastrear de volta à causa. Obrigado!
Artemave 8/08/19