É possível executar comandos de limpeza apenas para linhas editadas?

8

Referindo-se a tarefas de limpeza como (mas não limitadas a) as detalhadas nestas perguntas:

existe uma maneira de aplicar esses comandos apenas às linhas dos arquivos que foram realmente modificados? Isso é para manter a saída do diff focada na mudança real após a edição do código fonte (um revisor de código em potencial não ficaria confuso com as alterações envolvidas na limpeza de todo o arquivo), sem introduzir novos problemas de formatação.

guido
fonte
vim.wikia.com/wiki/... ... Pode ser um bom lugar para começar ... Sem tempo para escrever uma resposta completa agora ;-)
Martin Tournoij
@Carpetsmoker thx for the link
guido
Fiz mais algumas escavações e acho que isso não é possível. :changesnão funciona sem muita invasão; como parece que essas informações são armazenadas no arquivo viminfo, e não há como ver quais alterações você fez nesta sessão e qual a anterior ... A menos que você desative o arquivo viminfo, é claro, mas isso é bastante pesado ... gostaria de ser provado errado aqui, embora :-)
Martin Tournoij
@Carpetsmoker Não acho que a lista de alterações contenha informações suficientes para implementar esse recurso, mesmo que você possa isolar as alterações feitas em cada sessão. Ele contém uma única posição do cursor para cada alteração, portanto, você não pode dizer a extensão da edição que foi feita.
Rich
@ Rich Sim, cheguei à mesma conclusão ...
Martin Tournoij

Respostas:

4

Você pode usar o comando folddoopenpara executar um comando apenas nas linhas que não estão dentro de uma dobra fechada.

Por exemplo, você pode remover o espaço em branco do final de linhas com o comando:

:%s/\s\+$//

Para aplicar isso apenas às linhas que atualmente não estão dentro de uma dobra fechada, adicione folddopenassim:

:%folddoopen s/\s\+$//

folddoopentambém pode ser abreviado para foldd.

Se você estiver usando o Vim como a ferramenta diff do controle de origem, poderá usá-lo para aplicar edições apenas às linhas alteradas enquanto visualiza o diff.

Observe que, por padrão, o modo diff do Vim exibe algumas linhas antes e depois de cada seção alterada. Portanto, para não afetar as linhas imediatamente antes ou depois das linhas alteradas, é necessário primeiro definir context, diffoptpor 0exemplo:

:set diffopt=filler,context:0

Para edições manuais, você também pode achar a foldopenopção útil. Ele define quais tipos de comandos farão com que as dobras sejam abertas. Embora observe que isso não impede que a edição ocorra dentro das dobras da mesma maneira que o folddoopencomando.

(Se você quer dizer outra coisa com "as linhas dos arquivos que foram realmente modificadas", precisará encontrar uma maneira de dobrar as linhas inalteradas antes de executar o comando: a maneira mais fácil é manter uma cópia inalterada do arquivo e use o vimdiff manualmente.)

Rico
fonte
2
Esta é uma ideia muito criativa! Eu não sabia :folddoopen, parece um comando muito útil. Eu também queria oferecer que, se você estiver usando o fugitive.vim , poderá ver com mais facilidade a diferença do seu buffer atual com o :Gdiffcomando
Tommcdo
Este trabalho bem; Eu posso abrir um buffer temporário com a revisão anterior diferente da atual com :vsp new, then :read !git show HEAD~1:pathe finalmente :windo diffthis(e usando sua solução).
guido