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

Mik*_*ton 1 git vim vimdiff mergetool git-merge

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

  • 从以下缓冲区 $LOCAL、$BASE、$REMOTE 和 $MERGED 中拆分(水平) [完成]
  • 显示每个分割的行号 [ Todo ]
  • 显示这三个分割中的缓冲区变量的名称:$LOCAL、$BASE、$REMOTE。[去做]
  • $MERGED 拆分状态行应显示%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)
  • 在上面的配置中,应该为每个分割显示一个状态行子字符串,但我找不到构建正则表达式的正确方法来将状态行中的文件名减少到三个所需的缓冲区变量名称之一(即“BASE”) ”、“远程”或“本地”)。正则表达式不是必需的,但它似乎是一个有前途的选择。
  • 行号仅显示在一个拆分中,但我希望它们出现在所有四个拆分中。

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

我添加了现有拆分的屏幕截图git mergetool

vimdiff_4_panes

Pra*_*nna 5

为每个分割添加行号

在此命令中vim +"set number" ... -O $MERGED $BASE $REMOTE $LOCAL,看起来 vim 本质上首先创建分割,然后执行 set 选项。参考:vim -c 选项

有两种选择可以克服这个问题。

  1. 使用--cmd选项:如果我们使用,vim --cmd "set number" -O $MERGED $BASE $REMOTE $LOCAL,set number将在创建分割之前应用。事实上,它甚至在读取 .vimrc 文件之前就被应用了。(参考:vim --cmd 选项)。如果我们在 .vimrc 中有一个像 .vimrc 这样的重写配置,可能会引起关注set nonumber
  2. 手动创建拆分:-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)

git mergetool输出: git mergetool 输出


更新1

如果可以保留现有的状态行或对分割的缓冲区编号进行简单的追加,则-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 脚本来打印复杂的状态行。 git mergetool 输出(带源文件)