Vim e unified diffs

2

No meu trabalho diário, eu lido apenas com diffs unificados, então gostaria de definir o alias

alias diff='diff -puN'

no meu .zshrc .

Esse alias não é respeitado quando eu uso o shell no modo de linha de comando do vim, ou seja, quando eu digito :!diff file1 file2 . Eu acredito que isso é porque o vim não invoca um shell interativo.

Assim, mudei o alias de .zshrc para .zshenv , o que me permite obter diffs unificados antigos e simples de dentro do vim (eu geralmente prefiro essa saída acima de vimdiff 's).

Por outro lado, fazer isto quebra vimdiff , que aparentemente é incapaz de analisar diffs unificados (Gera Error E97 , mas nem a sua explicação em help E97 nem as referências parecem ser úteis para mim: ou elas parecem não relacionado (por exemplo, a opção shell ) ou acima da minha cabeça (a opção diffexpr ).

How should I go about having both vimdiff and my alias for diff work at the same time?

    
por Simon K. 22.04.2015 / 12:12

1 resposta

1

Mudar a semântica do comando diff de fato causa estragos no Vim (isso é explicado em :help diff-diffexpr : A saída de "diff" deve ser um estilo "ed" normal. NÃO use um contexto diff. ), e potencialmente outros programas também.

Um alias de shell puro com o mesmo nome é bom, já que isso é considerado apenas quando você digita comandos interativamente (ou em funções de shell, das quais você deve ter poucos). Se você precisar de um comando diff alterado para uso não interativo (por exemplo, no comando :! do Vim), defina melhor um script wrapper shell / função / alias do shell exportado em .zshenv sob um nome diferente . por exemplo diffu .

Se você realmente deseja se ater a um alias idêntico e exportado (apesar dos riscos de quebrar programas), é necessário reconfigurar o Vim para que não o use. Infelizmente, não existe uma opção simples para o executável do diff; você tem que escrever um inteiro personalizado 'diffexpr' . Felizmente, há um exemplo disso em :help diff-diffexpr que emula o padrão. Você só precisa de uma pequena alteração para evitar o alias de diferenças, por exemplo, por especificando o caminho completo para diferenciar .

set diffexpr=MyDiff()
function MyDiff()
   let opt = ""
   if &diffopt =~ "icase"
     let opt = opt . "-i "
   endif
   if &diffopt =~ "iwhite"
     let opt = opt . "-b "
   endif
   silent execute "!/usr/bin/diff -a --binary " . opt . v:fname_in . " " . v:fname_new .
    \  " > " . v:fname_out
endfunction
    
por 22.04.2015 / 12:49