使用svn diff结合vimdiff来获取每个修改过的文件的选项卡差异页面

sol*_*ent 7 svn vim diff

是否可以将svn与vim结合使用以获得一系列包含每个文件差异的标签页?它将是一个更好的替代品svn diff | view -,但它不会使用vimdiff而是线性的差异列表.

在过去,我找到了一种方法来执行此操作并获取svn diff来为每个编辑的文件打开多个vims,但是能够返回并查看旧文件将非常有用.因此,给定一组文件S的元组,我需要一个vim shell命令,它将在不同标签页的S元组的第一个位置打开每个文件,并在元组的第二个位置与相应的文件区分开来在S.

Dav*_* W. 6

您可以通过--diff-cmd命令行开关指定要在Subversion中使用的diff命令,或者在Subversion配置中指定它($HOME/.subversion/config用于Unix命令行客户端).

主要的是要了解传递给SVN diff命令的参数:

  • 4 到最后一个参数 - 左侧的程序标题
  • 3 到最后一个参数-在右侧程序标题
  • 2 ,以最后一个参数-左侧临时文件
  • 最后一个参数 - 右侧的临时文件

传递的第一个参数是切换到Subversion diff命令.例如:

  • -u
  • -L

您可以使用此信息创建脚本以查看VIM中的文件.这是一个简单的Perl:

#! /usr/bin/env perl

use strict;
use warnings;

my $diff = "/usr/bin/vimdiff";

my $num_of_params = $#ARGV;

my $file1 = $ARGV[$num_of_params - 1];
my $file2 = $ARGV[$num_of_params];

my $title1 = $ARGV[$num_of_params - 4];
my $title2 = $ARGV[$num_of_params - 3];

my $title = "$title1 - $title2";
$title =~ s/\t/    /g;
$title =~ s/ /\\ /g;

system qq($diff -c "set titlestring=$title" "$file1" "$file2");
Run Code Online (Sandbox Code Playgroud)

您必须确保您的system命令(如vimdiff)保存命令行.我尝试mvim在我的Mac 上使用,但在mvim执行命令之前删除了临时文件.

现在,你可以这样做:

$ svn diff --diff-cmd mydiff -rPREV
Run Code Online (Sandbox Code Playgroud)

并且,如果您的脚本在PATH中并且是可执行的,那么它应该可以工作.


感谢ZyX

以下是ZyX建议的改进程序.我不得不做出一些改变.我的diff命令实际上是mvim在我的机器上,我需要传入两个参数(-d说它是一个差异,并-f说不要扔进mvim背景).这意味着通过$DIFFZyX建议将导致我的system命令认为这mvim -d -f是我的命令,我得到一个错误.为了解决这个问题,我将命令存储在一个数组中.当我在它的时候,我也让阵列保持不变.

这是下面的程序.更改DIFF为指向你的diff命令(可能是vimdiff,gvim -d -f或者vim -d.如果你在Windows上,并且完整路径不足C:/Program Files/Vim,你可以C:/Progr~1/Vim用来摆脱空间.否则,你需要做:

use constant DIFF => ('C:/Program Files/Vim/VIM73/gvim', '-f', '-d')
Run Code Online (Sandbox Code Playgroud)

因为你将无法使用qw.我们可以说谢谢微软在目录名称中放置一个空格来存放所有命令吗?我知道你可以.顺便说一句,如果您的编辑器所在的目录位于您的目录中,则PATH无需指定完整的目录名称.

#! /usr/bin/env perl

use strict;
use warnings;

use constant DIFF => qw(mvim -d -f);

my $parameters = $#ARGV;
my $file1 = $ARGV[$parameters - 1];
my $file2 = $ARGV[$parameters];
my $title1 = $ARGV[$parameters - 4];
my $title2 = $ARGV[$parameters - 2];

$ENV{TITLE} = "$title1  -   $title2";

system DIFF, '-c', 'let &titlestring=$TITLE', $file1, $file2;
Run Code Online (Sandbox Code Playgroud)


Sam*_*sen 3

这可以通过几个脚本并利用 vim 的“服务器”功能来完成。下面的脚本可以稍微改进一下,例如它假设您想在图形 Vim 中执行此操作,并且您不希望脚本退出,直到您退出此 Vim。此外,由于使用“diffsplit”,差异默认使用水平分割。

我使用以下两个脚本来完成此操作。在要运行 diff 的目录中执行 bash 脚本:

#!/bin/bash

export VIM_SERVERNAME="SVN-$RANDOM"

# Start up a vim, graphical, in the foreground, but backgrounded...
vim -g -f --servername "$VIM_SERVERNAME" &
# So we get can it's PID to wait on later
gvim_pid=$!

# Wait for the server to start up enough
sleep 0.5

# Use svn diff to get the right set of files to pass to vimdiff
svn diff --diff-cmd "vim_tab_diff_helper.py" >/dev/null

# Move to the start of the list; remove the first tab which will be the empty
# tab
vim --servername "$VIM_SERVERNAME" --remote-send ":tabfirst<Return>"
vim --servername "$VIM_SERVERNAME" --remote-send ":bd<Return>"

# Wait for the user to exit vim before returning
wait $gvim_pid
Run Code Online (Sandbox Code Playgroud)

帮助程序脚本“vim_tab_diff_helper.py”如下:

#!/usr/bin/python

import os
import subprocess
import sys

def vim_send(command):
  global vim_server
  subprocess.call(['vim', '--servername', vim_server, '--remote-send',
    command + '<Return>'])

vim_server = os.environ['VIM_SERVERNAME']
svn_orig_file = sys.argv[ len(sys.argv) - 2 ]
modified_file = sys.argv[ len(sys.argv) - 1 ]

vim_send(":tabnew")
vim_send(":e " + svn_orig_file)
vim_send(":diffsplit " + modified_file)
Run Code Online (Sandbox Code Playgroud)

  • 要查看它正在尝试比较的内容,请运行“svn diff --diff-cmd=echo”之类的命令;最后两个参数是我的脚本中使用的参数。 (2认同)