Como procurar linhas correspondentes à linha atual no vim

11

Normalmente, procuro por palavras :/string, mas se tiver que pesquisar toda a linha atual, como fazer isso.

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

Por exemplo, se cursoré atualmente line 1como pesquisar da mesma forma que o :/texto que contém toda a linha atual. O cursor deve pular para a correspondência line 4e novamente paraline 7

manav mn
fonte

Respostas:

7

Aqui está como eu faria isso:

  1. Arranque a linha (no registro sem nome), sem incluir a nova linha no final: 0y$
  2. Inicie uma pesquisa muito nomagic :/\V
  3. Adicione a linha arrancada: <c-r>"
  4. Dispare a pesquisa: <cr>

Como o @EvergreenTree aponta em um comentário , é claro que você pode criar um mapeamento para executar todas as etapas de uma só vez:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

Tópicos de ajuda relevantes:

:help registers
:help /magic
:help c_CTRL-R

NB Se a linha que você está procurando contém barras invertidas, você ainda precisará passar por elas e escapar delas (adicionando outra barra invertida), mesmo com uma pesquisa muito nômade .

Rico
fonte
4
Claro, você também pode criar um mapeamento para isso: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree
9

Especialmente para fins de mapeamento, acho o uso getline()mais elegante do que fazer você mesmo o puxão. Chamar getline()com uma string '.'retorna a linha sob o cursor. Existem duas boas opções para usar isso:

:exec '/' . getline('.')

que analisa as strings '/'e o que é retornado getline()juntos e executa isso como um comando vim.

ou

/<C-r>=getline('.')<CR>

que usa o registro de expressão @=. A expressão a seguir =é avaliada após a primeira <CR>e colocada na linha de comando.

Sakari Cajanus
fonte
Agradável! Quando a linha contém caracteres como /ou 'não funciona muito bem. Enfim, eu aprendo algo hoje! Obrigado
Luc M
4

Pessoalmente, eu receberia um plugin visual star ( existem poucos por aí ). Existe um bom Vimcast sobre isso: pesquise o texto selecionado . Isso significa que você pode selecionar a linha visualmente e pressionar *.

Se um plug-in não é o que você gosta, você pode adicionar o seguinte mapeamento ao seu vimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

Nota: O bloco visual ( <c-v>) não é suportado para este mapeamento.

Peter Rincker
fonte
Adicionei os mapeamentos, mas na verdade ele está pulando para a primeira palavra correspondente e NÃO selecionando a linha inteira.
usar o seguinte comando
Se for uma palavra correspondente, presumo que você esteja usando *o modo normal ou não tenha o mapeamento instalado corretamente.
precisa saber é o seguinte
4

Todas as respostas existentes falharão se sua linha contiver determinados itens que são interpretados como parte de um padrão. O \Vponto chega na maior parte do caminho, mas ainda mexe com a barra invertida.

Tente fazer isso para escapar das barras invertidas ...

/\V<C-R>=escape(getline('.'), '\')

E então, se você o estiver usando em um mapeamento, precisará de um ou dois <Enter>s no final, dependendo de como deseja que ele funcione.

traço-tom-bang
fonte
Excelente resposta! Linhas geralmente contêm os dois tipos de barra que confundem as outras respostas. Esse último argumento de fuga deve incluir uma barra também:escape(…, '/\')
bobbogo 15/01/19
2

Com o vim-asterisk instalado, basta usar V$*(ou 0v$*) para selecionar a linha atual e procurar por ela.

No segundo comando, 0não é necessário se o cursor já estiver no início da linha.

adelarsq
fonte
1
Não *procura apenas a palavra sob o cursor, e não a seleção visual atual?
EvergreenTree
1
@ EververreenTree Eu esqueci de mencionar o plugin. Obrigado por notificar
adelarsq
2

Mais uma maneira de fazer isso é usar a janela da linha de comandos: yy/<Ctrl-F>p<Enter>

  • Arranque toda a linha que você precisa yy
  • Pressione /e, em seguida, pressione Ctrl-F para abrir a janela da linha de comando
  • Pressione ppara colar a linha
  • Pressione Enter para iniciar a pesquisa
Boris Serebrov
fonte
5
Você também pode usar q/para obter o mesmo efeito que/<c-f>
evilsoup
2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashes salienta que o registro de pesquisa pode ser definido diretamente, assim:

:let @/='/abc/def/ghi/'

Isso permite pesquisar na linha e funciona mesmo quando a linha inclui barras.

Então, para fazer, por exemplo, \*mapear para uma pesquisa de linha:

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
Bernard Ogden
fonte