vim: diff duas seções em dois arquivos, mas não o arquivo inteiro?


14

Atualizei um sistema do Nagios 2 para o Nagios 3 e agora estou comparando algumas diferenças nos arquivos de configuração antigos e novos.

Existem alterações significativas nos arquivos de configuração, e eu não quero fazer uma diferença no arquivo inteiro porque o vimdiff está me mostrando muitas diferenças irrelevantes e tem problemas para lidar com #comentários no início das linhas, etc.

Posso usar o vim ou uma funcionalidade semelhante ao vimdiff para executar uma comparação em duas seções específicas em dois arquivos diferentes?

Por exemplo, eu quero diferenciar apenas as linhas que se parecem com isso:

# Define a service to check the load on the local machine. 

define service{
    use                             local-service         ; Name of service template to use
    host_name                       localhost
    service_description             Blah Blah
    check_command                   Blah Blah
    }

Respostas:


19

Parece que o boundiff.vim pode ser o que você deseja: “Realize uma comparação interativa em dois blocos de texto”.

Você especifica cada bloco (intervalo de linhas) com seu :Linediffcomando (por exemplo :4,10Linediff, ou faz uma seleção visual primeiro e depois digita :Linediff(que sai como :'<,'>LineDiff)). Os intervalos podem ser do mesmo arquivo / buffer ou diferentes. Depois de especificar dois intervalos, ele abre uma nova guia que possui dois novos buffers de modo diferencial (em uma divisão) para os intervalos especificados. Você pode editar e :wem qualquer um desses buffers para atualizar os intervalos originais. Quando terminar, :qsaia dos buffers diff e :LinediffResetse livre dos especificadores de intervalo dos buffers originais.

A resposta do Stackoverflow, onde eu aprendi sobre o boundiff.vim, também sugere alguns mapeamentos. Outras respostas sobre essa pergunta também mencionam uma solução personalizada e outro plug-in que podem solucionar esse mesmo problema.


6

Não encontrei uma maneira realmente direta de fazer isso, mas tive um sucesso muito bom com o plug-in NrrwRgn (região estreita), http://www.vim.org/scripts/script.php?script_id=3075 . Permite selecionar uma região de um buffer e abrir essa região em um novo buffer. Você pode editar esse novo buffer e, ao fechá-lo, o plug-in copia automaticamente o texto editado de volta para a região de origem no arquivo original. Você também pode copiar diferentes regiões de um ou mais arquivos para novos buffers e depois diferenciá-los. É assim que costumo usar o plugin - para verificar as diferenças entre funções semelhantes definidas em um arquivo.

No seu caso, você pode abrir os dois arquivos no Vim e, em seguida, usar Vpara selecionar a seção de interesse no primeiro arquivo e digitar \nrpara copiar essa seção para um novo buffer. Repita para a seção semelhante no outro arquivo. Em seguida, em cada um dos dois novos buffers, execute :diffthis.


Obrigado! O que vai \nrfazer?
precisa saber é o seguinte

1
O plugin mapeia <Leader>nr, onde o <Leader>padrão é `\`, para o comando plugin que copia a região selecionada para um novo buffer.
precisa saber é o seguinte

@garyjohn como você organiza as NrrrRgndivisões?
dev

1
@ Dev: Eu tenho as seguintes duas linhas de configuração NrrwRgn no meu ~ / .vimrc: let g:nrrw_rgn_vert = 1e let g:nrrw_rgn_protect = 'n'. Com o primeiro, o NrrwRgn se divide à esquerda da janela atual. Eu esqueci se eles se abrem imediatamente à esquerda ou à extrema esquerda. Dito isto, não uso mais o NrrwRgn para isso, tendo encontrado algo melhor: Linediff. Ele abre as novas regiões em uma nova guia, que eu acho mais limpa e conveniente. Você pode encontrar o LInediff em http://www.vim.org/scripts/script.php?script_id=3745ou https://github.com/AndrewRadev/linediff.vim.
precisa

Muito obrigado @garyjohn. NrrwRgnfaz a extremidade esquerda ou superior, o que torna as divisões praticamente incontroláveis. Eu até tentei as !variantes, mas elas se mostraram muito frágeis (erros de script + nenhuma maneira limpa de retornar ao arquivo original). Dará linediff.vimuma chance muito embora eu faço esperança NrrwRgnmelhora no futuro.
dev

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.