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

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 .


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.


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.


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.


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.


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

5
Você também pode usar q/para obter o mesmo efeito que/<c-f>
evilsoup

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.