使用特定的状态行/行号配置 vimdiff 拆分
Configuring vimdiff splits with specific statusline / line-numbers
我正在尝试设置 git mergetool
以使用以下拆分生成 vimdiff
(以及 为每个拆分定制的配置 ):
从以下缓冲区拆分 $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
- 在上面的配置中,每个拆分都应该显示一个状态行子字符串,但我找不到构建正则表达式以将状态行中的文件名减少到三个所需缓冲区变量之一的正确方法名称(即“BASE”、“REMOTE”或“LOCAL”)。正则表达式不是必需的,但它似乎是一个很有前途的选择。
- 行号只出现在一个拆分中,但我希望它们全部出现在四个拆分中。
经过多次谷歌搜索和多次实验,我仍然无法强制 vimdiff
显示我想要的状态行/数字...我没有使用状态行插件,例如 vim-电源线。如何配置我的 git 选项以按我需要的方式生成 vimdiff
?
我附上了现有 git mergetool
拆分的屏幕截图。
为每个拆分添加行号
在这个命令中,vim +"set number" ... -O $MERGED $BASE $REMOTE $LOCAL
,看起来像 vim 内部首先创建拆分,然后执行设置选项。参考:vim -c option.
有 2 个选项可以解决这个问题。
- 使用
--cmd
选项:如果我们使用,vim --cmd "set number" -O $MERGED $BASE $REMOTE $LOCAL
,set number
在创建拆分之前应用。事实上,它甚至在读取 .vimrc 文件之前就已应用。 (参考:vim --cmd option)。如果我们在 .vimrc 中有像 set nonumber
. 这样的覆盖配置,可能会引起关注
- 手动创建拆分: 我们可以手动创建拆分而不是
-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 脚本可以在源文件中使用来打印复杂的状态行,如果需要的话。
我正在尝试设置 git mergetool
以使用以下拆分生成 vimdiff
(以及 为每个拆分定制的配置 ):
从以下缓冲区拆分 $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
- 在上面的配置中,每个拆分都应该显示一个状态行子字符串,但我找不到构建正则表达式以将状态行中的文件名减少到三个所需缓冲区变量之一的正确方法名称(即“BASE”、“REMOTE”或“LOCAL”)。正则表达式不是必需的,但它似乎是一个很有前途的选择。
- 行号只出现在一个拆分中,但我希望它们全部出现在四个拆分中。
经过多次谷歌搜索和多次实验,我仍然无法强制 vimdiff
显示我想要的状态行/数字...我没有使用状态行插件,例如 vim-电源线。如何配置我的 git 选项以按我需要的方式生成 vimdiff
?
我附上了现有 git mergetool
拆分的屏幕截图。
为每个拆分添加行号
在这个命令中,vim +"set number" ... -O $MERGED $BASE $REMOTE $LOCAL
,看起来像 vim 内部首先创建拆分,然后执行设置选项。参考:vim -c option.
有 2 个选项可以解决这个问题。
- 使用
--cmd
选项:如果我们使用,vim --cmd "set number" -O $MERGED $BASE $REMOTE $LOCAL
,set number
在创建拆分之前应用。事实上,它甚至在读取 .vimrc 文件之前就已应用。 (参考:vim --cmd option)。如果我们在 .vimrc 中有像set nonumber
. 这样的覆盖配置,可能会引起关注
- 手动创建拆分: 我们可以手动创建拆分而不是
-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 脚本可以在源文件中使用来打印复杂的状态行,如果需要的话。