Existe uma maneira de restringir os resultados da pesquisa a diferenças em um diff?

7

Quero poder pesquisar apenas nas DiffTextregiões de um arquivo que estou editando.

Pergunta relacionada: /programming/2683521/vim-search-in-cc-code-lines

A resposta aceita aqui parece funcionar muito bem para, digamos, Commentou Typegrupos de sintaxe, mas qualquer um dos grupos Diff não funciona. Suponho que tenha algo a ver com os grupos diff sendo aninhados dentro de outros grupos.

Meu cenário específico é que removi várias guias e espaços à direita de vários arquivos. Eu diferenciei os arquivos dos originais e quero garantir que nada, exceto as guias e os espaços finais, sejam diferentes.

PS: Não quero fazer uma substituição global de todas as guias, porque meu antecessor usou recuo inconsistente e preciso verificar manualmente tudo isso.

Tumbler41
fonte
2
:set diffopt+=iwhite, ou eu entendi errado?
Antony
Hmm, eu acho que iria trabalhar para o meu cenário específico. Obrigado! No entanto, eu ainda estaria interessado em saber se existe uma maneira de restringir os resultados da pesquisa para outros cenários possíveis.
precisa saber é o seguinte
Post relacionado: Pesquisa no grupo de sintaxe?
precisa saber é o seguinte
Essa publicação está vinculada ao QI publicado. : P
Tumbler41

Respostas:

7

Não nativamente (também escrevi um patch, que permitiria adicionar uma expressão de pular à função search (), mas isso ainda não foi incluído).

Mas você pode contornar isso escrevendo sua própria função que verifica se a correspondência está em uma região diff contida. Algo assim (abordagem muito básica):

function! Search(pat)
    while search(a:pat, 'w') > 0
        if diff_hlID(line('.'),col('.')) != 0
            break
        endif
    endwhile
endfunction

com! -nargs=1 Search :call Search(<q-args>)

Erro ao verificar e lidar com mais casos extremos (abortar depois que a pesquisa foi concluída, por exemplo.) Deixado como exercício para o usuário.

Christian Brabandt
fonte
Cara, o vim é enorme; nem sabia que diff_hlID existia. Obrigado!
Antony
11
Impressionante! Só que, a menos que eu entenda algo errado, acho que a sua declaração if deve ser. if... != 0Assim, ela interrompe a pesquisa quando cai em um diff. Isso é o que parecia funcionar para mim, pelo menos. (Eu sei que sua função não se destinava a ser completa, mas eu tenho certeza que isso é para trás.)
Tumbler41
@ Tumbler41 Acho que você está correto.
Christian Brabandt
@ChristianBrabandt Edição da mente para futuros leitores? :)
Tumbler41
3

Bem, a maneira mais simples de pesquisar as diferenças (todas as linhas diferentes, não apenas o DiffText, desculpe) seria rodar diffnos dois arquivos, colocar a saída em um buffer e pesquisar lá. Supondo que você esteja visualizando filea e fileb no vimdiff:

:new | r! diff -u0 filea fileb
/search-for-something

Os números de linha estarão na saída, em linhas como

@@ -9,3 +8,6 @@

para que você possa pular facilmente para a linha (9) no arquivo original:

?@@<CR>0/\d<CR>yw:q!:@"<CR>

Ele procura uma linha com número de linha para trás, coloca o número da linha em @ ", fecha o buffer de pesquisa temporário e salta para o número da linha. Você provavelmente desejará massagear isso para levar em conta o layout da janela etc., e talvez mapeie-o para uma chave.

Você também pode incluir linhas de contexto no diff, para facilitar a leitura, mas verifique se suas pesquisas estão alinhadas com alterações, ou seja, aquelas que começam com um espaço em branco:

/^\S.*\zssearch-for-something
Antony
fonte
2
Ah, uma abordagem de filtragem. Não é bem o que eu tinha em mente, mas posso ficar por trás disso. Ainda tentando entender completamente sua macro. Minhas linhas de cabeçalho são na forma de: @@ -292,2 +283,7 @@. Dito isto, não consigo entender para que 0/serve o seu padrão de pesquisa. Além disso yW, arrancará a PALAVRA, o que significa 292,2. Quando você executa :@"Isso leva você para a linha 2, em vez de 292. Eu acho que eu viria com algo como isto: ?@@.*+?e+1<CR>yw:q!<CR>:@"<CR>. Você pode mudar o primeiro +para -dependendo do arquivo que deseja ver. Pensamentos?
precisa saber é o seguinte
Opa, erro de digitação, desculpe. Editado.
Antony
11
Havia uma falta <CR>para encerrar o padrão de pesquisa, e yWdeveria ser ywcomo você disse!
Antony
2
Sim, essas parecem boas sugestões para mim. Você pode ter dois mapeamentos, dependendo do arquivo para o qual deseja pular, ou pode resolver isso automaticamente a partir do +ou -no início da linha e os nomes dos arquivos no cabeçalho.
Antony