2010-09-01 29 views
35

Có thể phân biệt hoặc thậm chí vimdiff hai chương trình con gần như giống nhau xảy ra trong cùng một tệp không? Nếu vậy, làm thế nào?(Vim) khác nhau hai chương trình con trong cùng một tệp

Tôi có thể nghĩ sao chép hai chương trình con trong hai tệp riêng biệt và sau đó phân biệt chúng, nhưng có cách nào để thực hiện trong tệp gốc không?

Cảm ơn!

Trả lời

22

Bạn không thể thực hiện việc này trong tệp gốc nhưng bạn có thể thực hiện việc này mà không cần sử dụng các tệp riêng biệt, chỉ có các bộ đệm riêng biệt. Điều này sẽ có tác dụng nếu bạn đã sao chép một chương trình con trong sổ đăng ký a (ví dụ, với "ay gõ vào chế độ trực quan) và chương trình con khác trong sổ đăng ký b:

enew | call setline(1, split(@a, "\n")) | diffthis | vnew | call setline(1, split(@b, "\n")) | diffthis 

Để tự động:

let g:diffed_buffers=[] 
function DiffText(a, b, diffed_buffers) 
    enew 
    setlocal buftype=nowrite 
    call add(a:diffed_buffers, bufnr('%')) 
    call setline(1, split(a:a, "\n")) 
    diffthis 
    vnew 
    setlocal buftype=nowrite 
    call add(a:diffed_buffers, bufnr('%')) 
    call setline(1, split(a:b, "\n")) 
    diffthis 
endfunction 
function WipeOutDiffs(diffed_buffers) 
    for buffer in a:diffed_buffers 
     execute 'bwipeout! '.buffer 
    endfor 
endfunction 
nnoremap <special> <F7> :call DiffText(@a, @b, g:diffed_buffers)<CR> 
nnoremap <special> <F8> :call WipeOutDiffs(g:diffed_buffers) | let g:diffed_buffers=[]<CR> 

Lưu ý rằng bạn có thể muốn đặt tùy chọn hidden nếu Vim từ chối từ bỏ tệp đã thay đổi (xem :h abandon).

+1

Điều này làm việc tuyệt vời nhưng tôi tiếp tục nhận được "Không có bộ đệm đã bị xóa sổ: bwitpeout! 2" (số thay đổi) khi tôi gọi WipeOutDiffs qua f8. Điều gì gây ra điều này? Cảm ơn!! –

1

bạn có thể thử Block diff vim plugin, nó sẽ tạo 2 bộ đệm mới trong tab mới để hiển thị sự khác biệt.

+0

Tôi thấy mã của nó: nó gần như chính xác những gì giải pháp của tôi ở trên không, nhưng nó không thể đóng mở bộ đệm bằng cách nhấn một phím. – ZyX

+0

Rất đẹp, nhưng nó chỉ hoạt động khi bạn có một GUI, mà không phải luôn luôn là trường hợp của tôi khi tôi làm việc trên một máy chủ từ xa. Vì vậy, tôi đã chọn chấp nhận câu trả lời của ZyX. Dù sao cũng cảm ơn bạn! – Nigu

+0

Thực ra nó hoạt động trên phiên bản không phải GUI của vim (sử dụng vim 7.3). Nó sử dụng việc thực hiện tab không phải GUI, có thể điều đó không có mặt khi plugin được viết nên giờ nó chỉ hoạt động? – lessthanideal

3

Tôi thực sự thích câu trả lời ZYX, nhưng cần thiết để thực hiện hai thay đổi cho nó để làm việc liên tục:

  1. Như thực hiện, <F7> thay thế đệm hoạt động với màn hình hiển thị khác chia theo chiều dọc. Sau đó, trong khi <F8> đóng khác biệt, nó không tải lại bộ đệm gốc. Để khắc phục điều này, tôi đã thay đổi enew trên dòng thứ ba thành execute 'tab split | enew'.

  2. Để giảm thiểu tác dụng phụ, tôi đã thêm call remove(a:diffed_buffers, 0, -1) ngay trước khi kết thúc WipeOutDiffs().

HTH, - Stu

40

Plugin linediff.vim : Perform an interactive diff on two blocks of text là tương tự như một chỉ ou bởi Vincent với một số tính năng bổ sung:

  • có một lệnh để đóng bộ đệm mở
  • dường để hoạt động mà không cần GUI
  • chèn một số dấu hiệu trực quan trên (các) tệp gốc bị khuếch tán.

Để sử dụng nó, bạn thực hiện lựa chọn trực quan trên khối đầu tiên khác, nhập lệnh :Linediff và lặp lại nó vào khối thứ hai. Để thoát khỏi, :LineDiffReset

Tôi đã tìm thấy sau bản đồ hữu ích:

noremap \ldt :Linediff<CR> 
noremap \ldo :LinediffReset<CR> 
+7

Plugin này hoạt động rất tốt. Nó được ghi lại và duy trì trong git. Nó làm nổi bật các khối đã chọn trong các tệp gốc. Nó không yêu cầu gvim. Tôi không thể thấy nó có thể được cải thiện như thế nào, và theo tôi thì đó là giải pháp tốt nhất. Hãy thử và bỏ phiếu. –

4

Bạn có thể viết những hai phần/chương trình con/phần để hai tập tin và sau đó sử dụng vimdiff để thấy sự khác biệt.

:1, 39 write part1   //any line range or marks can be used 
    :40, 79 write part2 
    :!vimdiff part1 part2 

Nếu bạn không cảm thấy thoải mái khi sử dụng số dòng, bạn có thể giữ con trỏ ở đầu phần, nhấn v và chọn cho đến cuối phần rồi nhấn:. nó sẽ hiển thị: '<,'>. Sau đó gõ viết và sau đó tên tập tin trong dòng lệnh chính nó. Bấm phím Enter. Similary, cũng làm thứ hai. Sau đó, bạn có thể thực hiện lệnh vimdiff như đã nêu ở trên.

(Lệnh viết lưu phần vào tệp mới.) Viết tệp mới có thể không phải là một ý tưởng hay, nhưng điều đó giúp tôi. Đặc biệt là khi chúng tôi phải trải qua quá trình so sánh nhiều lần.

Đây là một trong những cách đơn giản nhất mà không cần sử dụng plugin hoặc nếu bạn không quan tâm đến bộ nhớ.

2

Tôi đã sử dụng lệnh này:

vimdiff <(cat file.foo | sed -n 10,15p) <(cat file.foo | sed -n 20,25p) 

Trường hợp số thức ăn cho sed là số dòng Tôi muốn diff trong file. <(*) nghĩa là đánh giá và chuyển hướng làm đầu vào.

+0

đọc này sau một thời gian, vẫn tự hỏi tại sao tôi sử dụng 'cat' ... bỏ nó ra cũng nên hoạt động:' vimdiff <(sed -n 10,15p file.foo) <(sed -n 20,25p file.foo) ' – kuzyn

Các vấn đề liên quan