Mik*_*ton 1 git vim vimdiff mergetool git-merge
我正在尝试设置git mergetool为使用vimdiff以下 split 生成(以及为每个 split 定制的配置):
%t[$MERGED 拆分已完成]中的文件名我在本地仓库中使用了这个 git 配置:
git config merge.tool vimdiff
git config mergetool.vimdiff.cmd 'vim +"set number" +"set statusline=%t" -d -c "wincmd J" -O $MERGED $BASE $REMOTE $LOCAL'
git config merge.conflictstyle diff3
git config mergetool.prompt false
Run Code Online (Sandbox Code Playgroud)
经过大量谷歌搜索和多次实验后,我仍然无法强制vimdiff显示我想要的状态行/数字...我没有使用 vim-powerline 等状态行插件。如何配置 git 选项以按照vimdiff我需要的方式生成?
我添加了现有拆分的屏幕截图git mergetool。
在此命令中vim +"set number" ... -O $MERGED $BASE $REMOTE $LOCAL,看起来 vim 本质上首先创建分割,然后执行 set 选项。参考:vim -c 选项。
有两种选择可以克服这个问题。
--cmd选项:如果我们使用,vim --cmd "set number" -O $MERGED $BASE $REMOTE $LOCAL,set number将在创建分割之前应用。事实上,它甚至在读取 .vimrc 文件之前就被应用了。(参考:vim --cmd 选项)。如果我们在 .vimrc 中有一个像 .vimrc 这样的重写配置,可能会引起关注set nonumber。-O我们可以手动创建拆分,而不是选项。这样,-c应用该选项后,就会创建分割。我们将以相反的顺序发送文件参数,如下所示:
vim +"set number" +"vs $LOCAL" +"vs $BASE" +"vs $MERGED" +"wincmd J" $REMOTE
Run Code Online (Sandbox Code Playgroud)
但现在我们需要另一个选项 ( diff this) 来在所有拆分中启用diff,因为-d仅适用于直接在命令行中传递的文件。
vim +"set number" +"vs $LOCAL" +"vs $BASE" +"vs $MERGED" +"wincmd J" +"windo
diffthis" $REMOTE
Run Code Online (Sandbox Code Playgroud)
与正则表达式相比,使用静态字符串看起来是更可靠的选择。我们可以利用 vimsetlocal选项来实现这一点。所以总的命令是
vim +"set number" +"setlocal statusline=REMOTE" +"vs $LOCAL" +"setlocal statusline=LOCAL" +"vs $BASE" +"setlocal statusline=BASE" +"vs $MERGED" +"wincmd J" +"windo diffthis" $REMOTE
Run Code Online (Sandbox Code Playgroud)
Git 合并工具配置:
git config merge.tool vimdiff
git config mergetool.vimdiff.cmd 'vim +"set number" +"setlocal statusline=REMOTE" +"vs $LOCAL" +"setlocal statusline=LOCAL" +"vs $BASE" +"setlocal statusline=BASE" +"vs $MERGED" +"wincmd J" +"windo diffthis" $REMOTE'
git config merge.conflictstyle diff3
git config mergetool.prompt false
Run Code Online (Sandbox Code Playgroud)
如果可以保留现有的状态行或对分割的缓冲区编号进行简单的追加,则-S可以使用 vim 选项来大大简化命令。
git config mergetool.vimdiff.cmd 'vim -d -S "~/.git_merge_vimrc" -O $MERGED $BASE $REMOTE $LOCAL
Run Code Online (Sandbox Code Playgroud)
.git_merge_vimrc内容:
set statusline=%t-Split#%n
wincmd J
windo set number
Run Code Online (Sandbox Code Playgroud)
注意:如果需要,可以在源文件中使用 vim 脚本来打印复杂的状态行。
