【发布时间】:2021-03-26 10:36:39
【问题描述】:
我希望能够运行一个在 vim 中打开 git diff 的命令,并为 diff 集中的每个文件提供一个选项卡。
因此,例如,如果我在工作树中更改了文件 foo.txt 和 bar.txt 并运行命令,我会看到 vim 打开有两个选项卡。第一个选项卡将包含我的工作树中的 foo.txt 和存储库中的 foo.txt 之间的并排差异,第二个选项卡将包含 bar.txt 的并排差异。
有人有什么想法吗?
【问题讨论】:
我希望能够运行一个在 vim 中打开 git diff 的命令,并为 diff 集中的每个文件提供一个选项卡。
因此,例如,如果我在工作树中更改了文件 foo.txt 和 bar.txt 并运行命令,我会看到 vim 打开有两个选项卡。第一个选项卡将包含我的工作树中的 foo.txt 和存储库中的 foo.txt 之间的并排差异,第二个选项卡将包含 bar.txt 的并排差异。
有人有什么想法吗?
【问题讨论】:
改编自 Benjamin Bannier + Dave Kirby 对于逃犯用户的上述回答。
因为我使用 fugitive.vim,所以我针对我最常见的用例调整了上述内容,查看了最后 2 次提交之间的差异:
vim -p $(git diff --name-only HEAD~1 HEAD) -c "tabdo :Gdiff HEAD~1"
将所有更改加载到选项卡中比使用git difftool 按顺序浏览它们要好得多。
【讨论】:
我会这样做的方式(虽然它不是一个命令)
在新的vim 选项卡中打开带有更改的文件:
vim -p $(git diff --name-only)
对于每个缓冲区,使用 vcscommand vim plugin 获取与当前 HEAD 的差异
:VCSVimDiff
这可以很好地看出差异,尽管不是补丁形式。
对于其他任何事情,我都会坚持git diff。
编辑
就像 Dave 在下面写的那样,步骤 1 和 2 可以通过使用结合起来
vim -p $(git diff --name-only) -c "tabdo VCSVimDiff"
【讨论】:
gvim -p <file list> -c "tabdo vert diffsplit ref.log"
虽然它不能完全满足您的需求,但 git difftool 可能是您最好的选择。 'git difftool --tool=vimdiff --no-prompt HEAD' 的开箱即用行为是为工作目录中的每个文件按顺序启动 vimdiff 并进行更改。
【讨论】:
我想出了以下脚本来实现 git difftoll + vimdiff 提供的行为,但使用制表符:
#!/bin/bash
commit1=$1
commit2=$2
files=`git diff ${commit1} ${commit2} --name-only`
cmd="set nosplitright | set nobackup | set noswapfile"
EXE="| silent exe"
for f in $files; do
if [ -z "$commit2" ]; then
cmd+="$EXE ':tabnew $f'"
else
cmd+="$EXE ':tabnew | f <${commit2}>/${f} | setlocal buftype=nofile | 0read ! git show ${commit2}:$f'"
fi
cmd+="$EXE ':0 | filetype detect'"
cmd+="$EXE ':vnew | f <${commit1}>/${f} | setlocal buftype=nofile | 0read ! git show ${commit1}:$f'"
cmd+="$EXE ':0 | filetype detect'"
cmd+="$EXE ':windo diffth'"
done
cmd+="$EXE 'bd 1 | tabfirst'"
vim -c "$cmd"
这样称呼它:
vimgd <commit1> <commit2>
【讨论】:
这个简单的插件对我有用:TabMultiDiff。它基本上为传递给 vim 的每对文件创建一个差异选项卡。该选项卡以每对中的第二个文件命名。
注意不是plugin manager compatible,所以需要手动安装,将tab-multi-diff.vim复制到.vim/plugin。
这是比较两对简单文件(aaa/aab 和 aac/aad)的屏幕截图。请注意,我也使用vim-scripts/diffchar.vim,这就是突出显示单个字符的原因。
【讨论】: