Vim

Vim 和統一差異

  • May 18, 2021

在我的日常工作中,我只處理統一的差異,所以我想定義別名

alias diff='diff -puN'

在我的.zshrc.

當我從 vim 命令行模式使用 shell 時,即當我輸入:!diff file1 file2. 我相信這是因為 vim 不呼叫互動式 shell。

因此,我將別名移至.zshrc允許.zshenv我從 vim 中獲取普通舊統一差異的別名(我通常更喜歡這個輸出而不是vimdiff‘s)。

另一方面,這樣做會破壞vimdiff顯然無法解析統一的差異(它會產生Error E97,但它的解釋help E97和參考對我來說似乎都沒有用:它們看起來不相關(例如shell選項)或者在我的頭上(diffexpr選項)。

我應該如何同時擁有兩個vimdiff和我的別名diff工作?

更改diff命令的語義確實會對 Vim 造成嚴重破壞(這在下面進行了解釋:help diff-diffexpr“diff”的輸出必須是正常的“ed”樣式差異。不要使用上下文差異。),以及可能的其他程序。

具有相同名稱的純 shell 別名很好,因為僅在您以互動方式鍵入命令時(或在 shell 函式中,您應該很少使用)才考慮使用該別名。如果您需要更改 diff 命令以用於非互動式使用(例如在 Vim 的命令中),最好以不同的名稱:!定義 shell 包裝腳本/導出的 shell 函式/別名,例如..zshenv diffu


如果你真的想堅持使用相同的、導出的別名(儘管有破壞程序的風險),你必須重新配置 Vim 使其不使用它。不幸的是,diff 執行檔沒有簡單的選項。你必須寫一個完整的 custom '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

引用自:https://unix.stackexchange.com/questions/197846