Có thể bắt đầu vimdiff cho git diffs trong tab của quy trình hiện tại không?
Giả sử tôi có một bộ đệm tệp đang mở và phần :terminal
tách mở trong 1 trang tab. Tôi muốn tạo một tab mới nơi tôi chạy vimdiff
nhưng có hiển thị khác biệt git của tôi. Tôi đang cố gắng git difftool HEAD~1
xuấ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 terminal
và 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
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:
:tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
- Trong tab mới mở,
:vert sb 1 | windo diffthis
Giải trình
- đầu tiên mở một tab mới với
tabnew
và tải nội dung củaHEAD^
phiên bản tệp trong bộ đệm 1 vào đó. - mở một phân tách dọc có chứa bộ đệm 1 với
vert sb 1
, sau đó cấp:diffthis
cho 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 show
nhu 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
để b
chứa của bạn .git
thư mục (tức b
là gốc rễ của repo của bạn), để git show
là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.ext
hoặc foo.ext
sẽ 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 vim
mở rộng đường dẫn để thêm tên của tệp (đó là foo.ext
). #1
yêu vim
cầ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à :t
trí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
và #1:t
bằ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.ext
thì #1
sẽ quay lại b/foo.ext
thay 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 đồ.