2015-01-05 3 views
9

추가 또는 삭제 된 줄을 식별하지 않고 vimdiff가 항상 한 줄씩 두 파일을 비교하도록하려면 어떻게해야합니까?vimdiff : 줄 바꿈 비교 (누락 된 줄/추가 줄 무시)

두 파일 간의 diff가 크지 만 우연히 파일의 두 줄이 일치하면 vimdiff는이 줄이 동일하다고 생각하고 나머지를 추가 또는 삭제 된 줄로 처리하므로 결과는 diff는 완전히 사용할 수 없습니다. 필자의 경우 file1의 i 줄은 file2의 줄 i와 항상 일치하므로 vimdiff는 추가되거나 삭제 된 행을 찾지 않습니다.

다음은 두 변수의 값이 각각 세 번 포함 된 두 개의 파일이있는 작은 예입니다. Vimdiff는 file1/line1을 file2/line3과 잘못 일치시키고 그 주변의 일부 줄이 추가 또는 삭제되었다고 생각합니다. 은 diff (마이너스 색상)은 다음과 같습니다

   | 1 foo 8.1047 < del/new 
       | 2 bar 6.2343 < del/new 
1 foo 0.0000 | 3 foo 0.0000 < match 
2 bar 5.3124 | 4 bar 1.4452 < wrong 
3 foo 4.5621 |    < new/del 
4 bar 6.3914 |    < new/del 
5 foo 1.0000 | 5 foo 1.0000 < match 
6 bar 6.3212 | 6 bar 7.2321 < wrong 

내가 원하는 것은, 그러나, 다음은 모든 라인이 일치하는 라인 5를 제외하고 같은 잘못된 표시로이다 :

1 foo 0.0000 | 1 foo 8.1047 < wrong 
2 bar 5.3124 | 2 bar 6.2343 < wrong 
3 foo 4.5621 | 3 foo 0.0000 < wrong 
4 bar 6.3914 | 4 bar 1.4452 < wrong 
5 foo 1.0000 | 5 foo 1.0000 < match 
6 bar 6.3212 | 6 bar 7.2321 < wrong 
+0

vimdiff 대신 "sdiff file1 file2"를 사용 하시겠습니까? –

+0

@OlivierDulac : 아니요.이 경우 비교할 파일이 훨씬 길어서 스크롤해야하므로 vimdiff가 좋습니다. 나는'sdiff'에 대해 몰랐지만 짧은 파일을 비교하는 데는 매우 편리합니다. – flotzilla

답변

2

diffchar.vim 플러그인 사용은 어떻습니까? 비 차이 모드에서 라인별로 비교합니다. 2 개의 창에서 2 개의 파일을 연 다음 F7을 누르십시오. 기본적으로 줄의 문자로 차이점을 찾으려고 시도하지만 차이 단위, 단어 또는 다른 것을 변경할 수 있습니다.

+0

와우,이 플러그인은 훌륭합니다! 실제로 비 diff 모드에서 실행한다는 사실은 내가 정확히 무엇을 찾고 있었는지 (이는 내가 당신의 대답을 제외하고있는 이유입니다), diff 차이를 실제 차이점으로 줄임으로써 vimdiff를 전반적으로 크게 향상시킵니다! 한 줄에 두 개의 diff가있는 경우 실제 차이뿐 아니라이 diff 사이의 전체 영역이 강조 표시됩니다. 이름이 바뀐 변수 또는 그 라인을 따라 무언가로 두 코드의 diff를 스캔하는 것을 매우 복잡하게 만듭니다.이 플러그인은이 문제를 완전히 해결합니다. 고마워요! – flotzilla

+0

@RickHowe, 너의 플러그인이 꼭 있어야 해! –

4

I로 시도해보기 위해이 예제를 복사하는 중이 었는데, 각 라인과 연관된 회선 번호가 있다면 vimdiff이 원하는대로 처리 할 것입니다.

따라서 행 번호 다음은 diff를 추가 할 cat을 사용할 수 있습니다 : 당신은 (쉽게 복사 할 diff로 표시 여기에) 원하는대로

cat -n file1 > file1_with_line_no 
    cat -n file2 > file2_with_line_no 

    vimdiff file1_with_line_no file2_with_line_no 

출력은 다음과 같습니다

diff file1_with_line_no file2_with_line_no --side-by-side 
1 foo 0.0000           |  1 foo 8.1047 
2 bar 5.3124           |  2 bar 6.2343 
3 foo 4.5621           |  3 foo 0.0000 
4 bar 6.3914           |  4 bar 1.4452 
5 foo 1.0000             5 foo 1.0000 
6 bar 6.3212           |  6 bar 7.2321 
+0

제안 해 주셔서 감사합니다. 실제로 vimdiff에 그러한 기능이없는 경우에는 필자의 특정 사례 (필자는 파일을 편집 할 필요가 없음)에 대한 적절한 해결책을 제공합니다. 나는 diffed 파일을 편집하자마자이 해결 방법이 깨지기 때문에 후자를 기대하고있다. – flotzilla

+0

그래,'man diff'를 봤는데 그런 옵션이없는 것 같아.최소한 샷을 주었던 유일한 것은'-d' ('--minimal'은 똑같이하는 것처럼 보입니다.)로 diff를 최소화하는 좀 더 정교한 알고리즘을 사용하고있는 것입니다 (더 자세한 것은 없습니다.),하지만 적어도 질문에 대한 나의 예를 들어 그것은 아무것도 바뀌지 않았다. – flotzilla

2

Vim은 외부 파일 diff을 사용하여 두 파일을 분석하므로 다른 알고리즘을 사용하는 다른 도구를 통해 결과에 영향을 줄 수 있습니다. 'diffexpr' 옵션을 통해 구성 할 수 있습니다. 도구의 출력은 "ed"스타일이어야합니다. Cp. :help diff-diffexpr.

이것은 추가/변경/삭제 된 행에만 영향을줍니다. 변경된 행 자체에 문자 차이를 표시하기 위해 Vim이 자체적으로 그렇게합니다.

불행히도 이러한 출력을 제공 할 수있는 대체 diff 도구를 알지 못하지만 다른 사람들은이를 채울 수 있습니다.

+0

diffexpr에 대한 포인터를 보내 주셔서 감사합니다. 나는 이미 vimdiff가 diff 파일을 사용하고 있다는 것을 이미 확신했지만, 이제는 어디에서 찾아야 할지를 알고있다. 이 기능이 존재하지 않는다는 것을 충분히 확신 할 수있을 정도로'diff'를 잘 알고 있습니까? (아니면 지금 알고 있을까요?) (나는'man diff'에 headfirst를 뛰어 가야한다고 생각합니다 ...) – flotzilla