Vim 和統一差異
在我的日常工作中,我只處理統一的差異,所以我想定義別名
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