6

在我的.subversion/config文件中,我已设置diff-cmd为调用vimdiff以查看更改的脚本。

以下是我的问题:我正在查看两个 svn URL 之间的差异,它们修改了 10 个文件。该svn diff url1 url2命令将打开第一个文件的差异。在 vim 中发出 :qa 将显示第二个文件的差异。现在,有没有办法完全退出 vim,中止进一步查看差异(除了运行 :qa 剩余 8 次)?

更新:以下是我的脚本:

#!/bin/sh 

# use vimdiff to view diffs
DIFF="/usr/bin/vimdiff -o"


NUM=$#  # number of arguments
LEFT=${6} # old file
RIGHT=${7} # new file
L_TITLE=${3} # actual name and revision of old file
R_TITLE=${5} # actual name and revision of new file
ST="${L_TITLE}"

# get the file name
NAME=`echo $ST | tr -s ' ' '\n' | head -1` 
L_BRANCH=`echo $L_TITLE | tr -s ' ' '\n' | head -2 | tail -1`
R_BRANCH=`echo $R_TITLE | tr -s ' ' '\n' | head -2 | tail -1`

# get the old and new revision numbers
L_REV=`echo $L_TITLE | tr -s '(' '\n' | cut -d ')' -f1 | tail -1 | tr -s ' ' '_' `
R_REV=`echo $R_TITLE | tr -s '(' '\n' | cut -d ')' -f1 | tail -1 | tr -s ' ' '_' `

L_REV=`echo "${L_BRANCH}__${L_REV}"`
R_REV=`echo "${R_BRANCH}__${R_REV}"`

# invoke vim
$DIFF $LEFT $RIGHT -c "setl stl=$NAME%20{'$L_REV'} | wincmd W | setl stl=$NAME%20{'$R_REV'}"
4

3 回答 3

2

由于 Vim(diff) 是用成对的文件顺序调用的(通过 Subversion),Vim 的退出状态将是指示整个过程将被中止的好方法。该:cquit命令以错误代码退出。如果周围的可执行文件已经在出错时中止循环,那么你就完成了。否则,那将不得不修改。由于您似乎有一个额外的包装脚本vimdiff,所以不能吞下 Vim 的退出状态(看起来它没有)。

于 2013-10-09T06:22:09.053 回答
1

一个hack-job解决方案:Ctrl-Z暂停vim,然后jobsNkill %N是svn diff实例的工作。

不是最干净的解决方案,但其他解决方案不适用于我的特定 svn/vimdiff 设置,当我不小心 diff 75 更改文件时,我宁愿有一个备用的 .swp 文件来清理而不是输入 :qa 75 次!我想这是一种万无一失的方式,无论您的差异脚本如何。

于 2019-01-25T16:34:01.360 回答
1
  • Subversiondiff-cmd将任何不同于01视为致命错误的返回值。

  • 如果你用 关闭 vimdiff :cq,它会以状态码退出1

您可以在包装脚本中使用 vimdiff 的返回值来退出 Subversion “致命错误”,例如返回2.

如果在脚本末尾添加以下内容:

# if vimdiff returned 1, lets return a Subversion's fatal error code
if [ $? -eq 1 ]; then
    exit 2;
fi

exit 0

这样做,如果你用 关闭 vimdiff :cq,将不会显示任何剩余的差异,并且 Subversion 将显示错误消息,例如:

svn: E200012: '/path/to/your/svn-diff-wrapper.sh' returned 2
于 2017-10-19T16:12:11.740 回答