是否可以将svn与vim结合使用以获得一系列包含每个文件差异的标签页?它将是一个更好的替代品svn diff | view -,但它不会使用vimdiff而是线性的差异列表.
在过去,我找到了一种方法来执行此操作并获取svn diff来为每个编辑的文件打开多个vims,但是能够返回并查看旧文件将非常有用.因此,给定一组文件S的元组,我需要一个vim shell命令,它将在不同标签页的S元组的第一个位置打开每个文件,并在元组的第二个位置与相应的文件区分开来在S.
您可以通过--diff-cmd命令行开关指定要在Subversion中使用的diff命令,或者在Subversion配置中指定它($HOME/.subversion/config用于Unix命令行客户端).
主要的是要了解传递给SVN diff命令的参数:
传递的第一个参数是切换到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建议的改进程序.我不得不做出一些改变.我的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)
这可以通过几个脚本并利用 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)
| 归档时间: |
|
| 查看次数: |
2849 次 |
| 最近记录: |