Vim 和统一差异

Vim 和统一差异

在我的日常工作中,我只处理统一差异,所以我想定义别名

alias diff='diff -puN'

在我的.zshrc

当我从 vim 命令行模式使用 shell 时,即当我输入:!diff file1 file2.我相信这是因为 vim 不调用交互式 shell。

因此,我将别名从 移到 ,.zshrc.zshenv使我能够从 vim 内部获取普通的旧统一差异(我通常更喜欢这个输出vimdiff而不是)。

另一方面,这样做vimdiff显然无法解析统一的差异(它会产生Error E97,但它的解释help E97和参考文献似乎对我来说都没有用:它们要么看起来不相关(例如选项shell),要么在我的头顶上(选项diffexpr)。

我应该如何同时使用vimdiff我的工作别名?diff

答案1

改变命令的语义diff确实会对 Vim 造成严重破坏(这在下面解释:help diff-diffexpr“diff”的输出必须是普通的“ed”样式差异。不要使用上下文差异。),以及其他可能的程序。

具有相同名称的纯 shell 别名就可以了,因为只有当您以交互方式键入命令(或在 shell 函数中,您应该很少有这些函数)时才会考虑这一点。如果您需要更改 diff 命令以进行非交互式使用(例如在 Vim 的:!命令中),最好在中定义 shell 包装脚本/导出的 shell 函数/别名.zshenv 以不同的名字,例如diffu


如果您确实想坚持使用相同的导出别名(尽管存在破坏程序的风险),则必须重新配置 Vim 以使其不使用它。不幸的是,diff 可执行文件没有简单的选项;你必须写一个完整的自定义'diffexpr'。幸运的是,下面有一个:help diff-diffexpr模拟默认示例的示例。您只需要进行一点小小的更改即可避免您的 diff 别名,例如指定 diff 的完整路径

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

相关内容