Использование svn diff в сочетании с vimdiff, чтобы получить вкладку diff для каждого измененного файла - PullRequest
7 голосов
/ 31 января 2012

Можно ли использовать svn в сочетании с vim, чтобы получить серию вкладок, которые содержат diff каждого файла? Это была бы намного лучшая альтернатива svn diff | view -, но вместо линейного списка различий он использовал бы vimdiff.

В прошлом я нашел способ сделать это и заставить svn diff открывать несколько vims для каждого редактируемого файла, но возможность вернуться назад и просмотреть старые файлы была бы очень полезна. Поэтому, учитывая набор кортежей файлов S, мне нужна команда оболочки vim, которая откроет каждый файл в первой позиции кортежей S на другой вкладке и разнесет его с соответствующим файлом во второй позиции кортежей. в с.

Ответы [ 2 ]

6 голосов
/ 01 февраля 2012

Вы можете указать команду diff, которую вы хотите использовать в Subversion, с помощью переключателя командной строки --diff-cmd или указав ее в конфигурации Subversion (которая $HOME/.subversion/config для клиента командной строки Unix).

Главное, чтобы понять, какие параметры передаются вашей команде SVN diff:

  • 4 th до последнего параметра - Название программы слева
  • 3 rd до последнего параметра - название программы с правой стороны
  • 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");

Вы должны убедиться, что ваша команда system (например, vimdiff) содержит командную строку.Я пытался использовать mvim на моем Mac, но временные файлы были удалены до выполнения команды mvim.

Теперь вы можете сделать это:

$ svn diff --diff-cmd mydiff -rPREV

И,если ваш скрипт находится в вашем PATH и является исполняемым, он должен работать.


Благодаря ZyX

Вот улучшенная программа, в которой содержатся предложения ZyX.Я должен был сделать некоторые изменения.Моя команда diff на самом деле mvim на моей машине, и мне нужно передать два параметра (-d, чтобы сказать, что это diff, и -f, чтобы не бросать mvim в фон).Это означало, что пропуск $DIFF, как предложил ZyX, заставил бы мою команду 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')

, так как вы не сможете использовать qw. Можем ли мы сказать Спасибо Microsoft за установкупробел в имени каталога, где все команды хранятся без веской причины? Я знал, что вы могли бы. Кстати, если каталог, в котором находится ваш редактор, находится в вашем 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;
3 голосов
/ 03 февраля 2012

Это можно сделать с помощью пары сценариев и использования функциональности "сервера" vim. Приведенные ниже сценарии могут быть немного улучшены, например, предполагается, что вы хотите сделать это в графическом Vim, и что вы не хотите, чтобы сценарий выходил, пока вы не выйдете из этого Vim. Кроме того, в diffs по умолчанию используется горизонтальное разделение из-за использования diffsplit.

Я делаю это с помощью следующих двух сценариев. Запустите скрипт bash в каталоге, в котором вы хотите запустить diff:

#!/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

Вспомогательный скрипт "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)
...