Làm cách nào để sử dụng vim làm công cụ tìm khác biệt?


102

Tôi sử dụng vim là biên tập viên chính của tôi.

Tôi cũng muốn sử dụng vim để tìm các tệp khác và sửa đổi các tệp trong khi thực hiện tìm khác biệt để sửa các thay đổi dễ dàng (thay vì hầu hết các kỹ thuật khác là một chu kỳ của diff / fix / diff / fix).

Ngoài ra, có những cách dễ dàng để tích hợp vim vào các công cụ tìm khác được sử dụng bởi các công cụ / trang web kiểm soát nguồn (tôi đặc biệt nghĩ đến git nhưng tôi chắc chắn rằng những người khác sẽ quan tâm đến việc tích hợp với các công cụ / trang web kiểm soát nguồn khác).


1
bạn nên thử vim-fugitive, nó thêm các lệnh :Gdiff:Gvdiffcả hai lệnh cho phép bạn thấy khác biệt của bộ đệm hiện tại nếu bộ đệm hiện tại của bạn được quản lý bởi git. Nó cũng giúp bạn giải quyết xung đột trong bố cục ba cửa sổ khi bạn hợp nhất các xung đột trên một số tệp
rbernabe

Tôi có chức năng đơn giản này trong bashrc của mình vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }và tôi gọi nó bằng vd file1 file2. Nó sử dụng diffđể xác định xem các tập tin khác nhau và chỉ mở vimdiffnếu đó là như vậy. Nếu không, tôi ở trong vỏ. Tôi cũng tắt tính năng tô sáng cú pháp trong Vim vì tôi thấy nó mất tập trung khi khác. Chỉ hoạt động với hai tập tin.
Rolf

Câu trả lời:


122

vim có chức năng này được tích hợp (với cờ dòng lệnh chính xác).

vim -d <file1> <file2>

Điều này mở mỗi tệp trong một khung nhìn và làm nổi bật sự khác biệt.
Bất kỳ mã nào giống hệt nhau đều foldedở xa, do đó bạn không cần phải xem mã giống hệt hoặc cuộn qua các đoạn mã lớn giống hệt nhau.

Nhưng cũng có một ứng dụng trình bao bọc vimdiffgọi chính xác vim với các cờ chính xác.

vimdiff source1.cpp source2.cpp

Nếu bạn đang sử dụng git, bạn có thể thiết lập một công cụ tìm khác biệt bên ngoài. Vì vậy, thật dễ dàng để thiết lập vimdiff là công cụ tìm khác biệt cho git.

git config --global diff.tool vimdiff

Khi sử dụng vimdiff, bạn có thể chỉnh sửa một trong hai bên và làm nổi bật diff theo kịp để cho bạn thấy sự khác biệt.

Lưu ý: Khi chỉnh sửa từ một git diff. Nếu bạn thử và chỉnh sửa phiên bản lưu trữ của tệp lưu trữ, các thay đổi của bạn sẽ bị loại bỏ khi bạn thoát (git không tin tưởng bạn với bản gốc để bạn khác với bản sao tmp) nhưng bạn có thể chỉnh sửa bản sao cục bộ thành nội dung trái tim của bạn và lưu nó trên phiên bản hiện tại của bạn.

Một số lệnh cơ bản hữu ích trong vimdiff

dp             diffput: puts changes under the cursor into the other file
                        making them identical (thus removing the diff).
do             diffget: (o => obtain). The change under the cursor is replaced
                        by the content of the other file making them identical.


]c             Jump to the next diff
[c             Jump to the previous diff

Các cài đặt vim khác tôi sử dụng để làm việc với highlites với vimdiff

if &diff
    highlight! link DiffText MatchParen
endif

Điều này sẽ tắt đánh dấu trên các bit của mã được thay đổi. Vì vậy, dòng được thay đổi được tô sáng để tôi có thể phát hiện ra các thay đổi, nhưng văn bản thực tế đã thay đổi nổi bật trên dòng (vì nó không được tô sáng).


Đồng thời xử lý tối đa 4 bộ đệm, làm cho nó tuyệt vời để so sánh các tệp cấu hình
Izkata

34
Bạn cũng có thể sử dụng :diffthislệnh để bắt đầu một diff khi Vim đang chạy.
Giàu

11
Và: diffoff để tắt nó. Tôi nghĩ rằng một liên kết đến tài liệu của vim sẽ có ích: vimdoc.sourceforge.net/htmldoc/diff.html
Thăm dò ý kiến ​​Cody

1
Đối với tôi ngay cả sau đó git config --global diff.tool vimdiff, git diffvẫn hiển thị mọi thứ như thể tôi không thay đổi gì.
Hi-Angel

2
thửgit difftool
Martin York

13

Nếu bạn đang chỉnh sửa một tệp đang mở và muốn so sánh nó với một tệp khác mà không đóng tệp hiện tại:

Mở tệp mới trong màn hình chia nhỏ:

Đối với phân chia dọc:

:vs otherFile

hoặc chia ngang:

:split otherFile

Chuyển con trỏ sang màn hình chia khác nhau:

ctrl+w ctrl+w

Gọi "chế độ khác" trong tệp:

:diffthis

Chuyển sang tập tin khác và gọi "chế độ khác":

:diffthis

Để tắt "chế độ khác":

:diffoff

5
Để tránh chuyển đổi giữa các bộ đệm bạn có thể sử dụng :windo diffthisquá
statox

4

Bạn có thể đặt cài đặt được đề cập bên dưới trong .gitconfigtệp được tìm thấy trong thư mục %homepath%(hoặc %userprofile%) của người dùng hiện đang đăng nhập:

[diff]
    tool = vimdiff

Điều này sẽ cho phép công cụ git bash bắt đầu sử dụng vimdiff làm công cụ tìm khác biệt bên ngoài.



2

Tôi chỉ có thể thấy ba tình huống để sử dụng vim như một Difftool. Chúng được mô tả ngắn gọn dưới đây:

  • Đối với git Difftool, đặt phần sau vào ~/.gitconfig:

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • Để mở vim dưới dạng công cụ tìm khác biệt cho hai tệp, bạn có thể làm như sau:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • Để có chế độ xem khác nhau cho các bộ đệm hiện đang hoạt động, tức là tất cả các bộ đệm có cửa sổ được gán cho chúng trong tab hiện đang hoạt động, bạn có thể làm như sau:

    :windo diffthis                " to get diff view
    :windo diffoff                 " to remove diff view
    

Để biết thêm thông tin, xem :h diff


1

đây là những gì tôi làm:

  • mở một cửa sổ với tệp đầu tiên (hoặc nội dung văn bản nếu bạn đang dán dữ liệu)
  • mở tệp / cửa sổ tiếp theo bằng cách sử dụng :vnew(để có cả hai cửa sổ cạnh nhau) hoặc :new(để có cửa sổ trên cùng và dưới cùng). nếu bạn có một tệp cụ thể để mở trong cửa sổ thứ hai, bạn có thể bao gồm đường dẫn như thế này::vnew /path/to/secondfile.txt
  • sử dụng F8 để chuyển đổi chức năng tùy chỉnh bật và tắt chế độ khác

đây là chức năng tùy chỉnh trong tôi ~/.vimrc:

nmap <silent> <F8> :call ToggleDiff()<CR>
imap <silent> <F8> <C-O>:call ToggleDiff()<CR>
function ToggleDiff ()
    if (&diff)
        set nodiff noscrollbind
    else
        " enable diff options in both windows; balance the sizes, too
        wincmd =
        set diff scrollbind nowrap number
        wincmd w
        set diff scrollbind nowrap number
        wincmd w
    endif
endfunction

bạn có thể sử dụng lệnh :diffthisdiffoff!do đó bạn không phải tự mình thiết lập tất cả các tùy chọn khác nhau (ví dụ: con trỏ cũng được đặt bằng diffmode)
Christian Brabandt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.