使用特定的状态行/行号配置 vimdiff 拆分

Configuring vimdiff splits with specific statusline / line-numbers

我正在尝试设置 git mergetool 以使用以下拆分生成 vimdiff(以及 为每个拆分定制的配置 ):

我在本地存储库中使用了这个 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

经过多次谷歌搜索和多次实验,我仍然无法强制 vimdiff 显示我想要的状态行/数字...我没有使用状态行插件,例如 vim-电源线。如何配置我的 git 选项以按我需要的方式生成 vimdiff

我附上了现有 git mergetool 拆分的屏幕截图。

为每个拆分添加行号

在这个命令中,vim +"set number" ... -O $MERGED $BASE $REMOTE $LOCAL,看起来像 vim 内部首先创建拆分,然后执行设置选项。参考:vim -c option.

有 2 个选项可以解决这个问题。

  1. 使用--cmd选项:如果我们使用,vim --cmd "set number" -O $MERGED $BASE $REMOTE $LOCALset number在创建拆分之前应用。事实上,它甚至在读取 .vimrc 文件之前就已应用。 (参考:vim --cmd option)。如果我们在 .vimrc 中有像 set nonumber.
  2. 这样的覆盖配置,可能会引起关注
  3. 手动创建拆分: 我们可以手动创建拆分而不是 -O 选项。这样,在应用 -c 选项后,将创建拆分。我们将以相反的顺序发送文件参数,如下所示:
    vim +"set number" +"vs $LOCAL" +"vs $BASE" +"vs $MERGED" +"wincmd J" $REMOTE
    
    但是现在我们需要另一个选项 (diff this) 来在所有拆分中启用 diff,因为 -d 仅适用于直接在命令行中传递的文件。
    vim +"set number" +"vs $LOCAL" +"vs $BASE" +"vs $MERGED" +"wincmd J" +"windo 
    diffthis" $REMOTE
    

修改状态行

与正则表达式相比,使用静态字符串看起来是更可靠的选择。我们可以利用 vim setlocal 选项来实现这一点。所以总命令将是

vim +"set number" +"setlocal statusline=REMOTE" +"vs $LOCAL" +"setlocal statusline=LOCAL" +"vs $BASE" +"setlocal statusline=BASE" +"vs $MERGED" +"wincmd J" +"windo diffthis" $REMOTE

Git mergetool 配置:

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

git mergetool 输出:


更新 1

如果可以保留现有的状态行或对拆分的缓冲区编号进行简单的追加,则可以使用 -S vim 选项来大大简化命令。

git config mergetool.vimdiff.cmd 'vim -d -S "~/.git_merge_vimrc" -O $MERGED $BASE $REMOTE $LOCAL

.git_merge_vimrc内容:

set statusline=%t-Split#%n
wincmd J
windo set number

注意: vim 脚本可以在源文件中使用来打印复杂的状态行,如果需要的话。