我希望能够在vim中运行一个打开git diff的命令,并为diff set中的每个文件添加一个选项卡。
因此,例如,如果我在工作树中更改了文件foo.txt和bar.txt,并且运行了命令,我会看到vim打开了两个选项卡。第一个选项卡将包含我工作树中foo.txt和存储库中foo.txt之间的并排差异,第二个选项卡将包含bar.txt的并排差异。
有人有任何想法吗?
答案 0 :(得分:7)
我会这样做的方式(虽然它不是一个命令)
打开包含新vim
标签更改的文件:
vim -p $(git diff --name-only)
对于每个缓冲区,使用vcscommand vim plugin
将diff传递给当前的HEAD:VCSVimDiff
这可以很好地了解差异,但不是补丁形式。
我还会坚持git diff
。
修改强>
如下面的Dave所述,可以使用
组合步骤1和2vim -p $(git diff --name-only) -c "tabdo VCSVimDiff"
答案 1 :(得分:4)
改编Benjamin Bannier + Dave Kirby对逃犯用户的回答。
因为我使用了fugitive.vim,所以我将上面的内容用于我最常用的用例,查看最后两次提交之间的差异:
vim -p $(git diff --name-only HEAD~1 HEAD) -c "tabdo :Gdiff HEAD~1"
将所有更改加载到标签页比使用git difftool
按顺序排列它们要好得多。
答案 2 :(得分:1)
虽然它不能完全满足您的需求,但git difftool可能是您最好的选择。 'git difftool --tool = vimdiff --no-prompt HEAD'的开箱即用行为是按顺序为工作目录中的每个文件启动vimdiff并进行更改。
答案 3 :(得分:1)
我想出了以下脚本来实现 git difftoll + vimdiff 提供的行为,但使用选项卡:
example_texts = ['سلام دنیا']
chars = tf.strings.unicode_split(example_texts, input_encoding='UTF-8')
print(chars)
<tf.RaggedTensor [[b'\xd8\xb3', b'\xd9\x84', b'\xd8\xa7', b'\xd9\x85', b' ', b'\xd8\xaf',
b'\xd9\x86', b'\xdb\x8c', b'\xd8\xa7']]>
这样称呼它:
#!/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"
答案 4 :(得分:0)
这个简单的插件对我有用:TabMultiDiff。它基本上为传递给vim的每对文件创建了一个diff选项卡。该选项卡以每对中的第二个文件命名。
请注意,它不是plugin manager compatible,因此您需要通过将tab-multi-diff.vim
复制到.vim/plugin
来手动安装。
以下是比较两对简单文件(aaa / aab和aac / aad)的屏幕截图。请注意,我还使用vim-scripts/diffchar.vim这就是突出显示单个字符的原因。