Có thể bắt đầu vimdiff cho git diffs trong tab của quy trình hiện tại không?

Jan 20 2021

Giả sử tôi có một bộ đệm tệp đang mở và phần :terminaltách mở trong 1 trang tab. Tôi muốn tạo một tab mới nơi tôi chạy vimdiffnhưng có hiển thị khác biệt git của tôi. Tôi đang cố gắng git difftool HEAD~1xuất hiện trong quy trình vim hiện tại của mình, chỉ trong một trang tab khác.

Điều này có thể thực hiện được trên Vim 8 mà không cần plugin không?

Tôi thường có ảo tưởng này khi tôi làm :tab terminalvà sau đó chạy git difftool HEAD~1. Tuy nhiên, điều này bắt đầu một quy trình phụ vim và tôi muốn tránh điều đó.

Đại loại như câu hỏi này: Làm cách nào để vào chế độ vimdiff khi hai phần tách đã được mở? nhưng đối với git diffs.

Trả lời

2 NikolasTapia Jan 20 2021 at 17:03

Mặc dù điều này chắc chắn có thể làm được trong vani vim, nhưng tôi khuyên bạn nên xem qua plugin tuyệt vời của tpopevim-fugitive . Sau đó, bạn chỉ cần làm :tab Gdiffđể đạt được những gì bạn muốn.

Nếu bạn thực sự không muốn cài đặt bất kỳ trình cắm nào, cách sau có thể hoạt động giả sử tệp hiện tại nằm trong bộ đệm số. 1:

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. Trong tab mới mở, :vert sb 1 | windo diffthis

Giải trình

  1. đầu tiên mở một tab mới với tabnewvà tải nội dung của HEAD^phiên bản tệp trong bộ đệm 1 vào đó.
  2. mở một phân tách dọc có chứa bộ đệm 1 với vert sb 1, sau đó cấp :diffthischo tất cả các bộ đệm trong tab để vào chế độ khác biệt.

Biên tập

OP hỏi đối với một số lời giải thích thêm về bước 1. git shownhu cầu một đầu vào có dạng <rev>:<path>nơi <path>có được tương đối so với thư mục gốc của cây lao động. Ví dụ, nếu đường dẫn tuyệt đối của tập tin trong bộ đệm 1 là /a/b/foo.extđể bchứa của bạn .gitthư mục (tức blà gốc rễ của repo của bạn), để git showlàm việc đúng cách bạn sẽ phải gọi nó với HEAD^:b/foo.e. Sử dụng một trong hai /a/b/foo.exthoặc foo.extsẽ không hoạt động. Vì vậy, tôi đã sử dụng git rev-parse --show-prefixđể lấy đường dẫn của thư mục hiện tại liên quan đến gốc git (sẽ là b/) trong ví dụ này.

Sau đó, tôi đã sử dụng vimmở rộng đường dẫn để thêm tên của tệp (đó là foo.ext). #1yêu vimcầu tìm nạp đường dẫn của bất kỳ tệp nào được tải trong bộ đệm 1 và :ttrích xuất "đuôi", là mọi thứ sau phần cuối cùng /trong đường dẫn được trả về #1. Trong một số trường hợp #1#1:tbằng nhau, nhưng điều này không phải luôn luôn như vậy. Ví dụ, nếu bạn đã chạy vim b/foo.extthì #1sẽ quay lại b/foo.extthay vì chỉ foo.ext. Kiểm tra :help expandđể biết thêm thông tin.

Tất nhiên, bạn chỉ có thể nhập đường dẫn theo cách thủ công, như trong :tabnew | r! git show HEAD^:b/foo.ext, và nó sẽ hoạt động. Nhưng phiên bản trên có thể tập lệnh hoặc bạn có thể gán cho một bản đồ.