- Delta là công cụ bổ sung tính năng tô sáng cú pháp và trình xem phân trang cho đầu ra Git, diff, grep, giúp việc đọc diff hiệu quả hơn và dễ nhìn hơn
- Trên hầu hết các trình quản lý gói, tên gói là git-delta nhưng tệp thực thi là
delta, và có thể dùng làm Git pager bằng cách đặt core.pager = delta trong ~/.gitconfig
- Các tính năng chính gồm cùng chủ đề tô sáng cú pháp như bat, tô sáng diff theo từ dựa trên thuật toán suy luận chỉnh sửa Levenshtein, chế độ xem so sánh hai bên, số dòng, điều hướng bằng
n/N, và cải thiện hiển thị xung đột hợp nhất
- Công cụ cũng tô sáng cú pháp cho đầu ra
git blame, rg, git grep, grep, và với --hyperlinks có thể tạo hash commit theo định dạng liên kết của các nhà cung cấp lưu trữ như GitHub, GitLab, SourceHut, Codeberg
- Có thể giữ giao diện gần với đầu ra Git/diff mặc định hoặc thay đổi mạnh bố cục và phong cách, cho phép tinh chỉnh chi tiết môi trường rà soát diff ngay trong terminal
Delta làm gì
- Delta là trình xem phân trang có tô sáng cú pháp cho đầu ra Git, diff, grep
- Mục tiêu là giúp thời gian đọc diff trong môi trường mã nguồn thay đổi liên tục trở nên hiệu quả và dễ chịu hơn
- Có thể thay đổi rất rộng bố cục và phong cách của diff, hoặc nếu muốn vẫn giữ nó rất gần với đầu ra Git/diff mặc định
Cài đặt và cấu hình cơ bản
- Tài liệu cài đặt có tại Install it
- Trên hầu hết các trình quản lý gói, tên gói là git-delta, còn tên tệp thực thi là
delta
- Có thể thêm cấu hình sau vào
~/.gitconfig để dùng làm Git pager và bộ lọc diff tương tác
[core]
pager = delta
[interactive]
diffFilter = delta --color-only
[delta]
navigate = true # use n and N to move between diff sections
dark = true # or light = true, or omit for auto-detection
[merge]
conflictStyle = zdiff3
- Cũng có thể áp dụng cùng cấu hình bằng lệnh
git config --global
git config --global core.pager delta
git config --global interactive.diffFilter 'delta --color-only'
git config --global delta.navigate true
git config --global delta.dark true # or `delta.light true`, or omit for auto-detection
git config --global merge.conflictStyle zdiff3
- Có thể xem trợ giúp bằng
delta -h, xem toàn bộ hướng dẫn bằng delta --help, và xem tài liệu trực tuyến tại user manual
Tính năng đọc diff
- Tô sáng cú pháp sử dụng cùng các chủ đề tô sáng cú pháp như bat
- Tô sáng diff theo từ sử dụng thuật toán suy luận chỉnh sửa Levenshtein
- Hỗ trợ chế độ xem so sánh hai bên và xuống dòng
- Hỗ trợ hiển thị số dòng
- Có thể di chuyển giữa các tệp trong diff lớn, và giữa các diff trong chế độ xem
log -p, bằng phím n và N
- Tính năng này được bật bằng
--navigate
- Cũng xử lý đầu ra unified diff truyền thống cùng với đầu ra Git
- Có thể tự động phát hiện nền terminal sáng/tối
Cách hiển thị và chủ đề
- Chủ đề tô sáng cú pháp: mọi chủ đề do bat cung cấp đều có thể dùng trong Delta
delta --show-syntax-themes --dark
delta --show-syntax-themes --light
- Chế độ xem so sánh hai bên được mô tả trong Side-by-side view user manual
[delta]
side-by-side = true
- Mặc định của chế độ xem so sánh hai bên là bật số dòng và áp dụng tô sáng cú pháp ở cả bảng bên trái lẫn bên phải
- Chế độ xem so sánh hai bên sẽ tự động xuống dòng với các dòng dài
- Tính năng số dòng được mô tả trong Line numbers user manual
[delta]
line-numbers = true
Hỗ trợ theo từng tác vụ Git
- Hiển thị xung đột hợp nhất được cải thiện với định dạng tốt hơn, tài liệu liên quan có tại Merge conflicts user manual
- Đầu ra git blame hỗ trợ tô sáng cú pháp, và khi dùng
--hyperlinks có thể biến commit thành định dạng liên kết của nhà cung cấp lưu trữ
- Nhà cung cấp lưu trữ được hỗ trợ: GitHub, GitLab, SourceHut, Codeberg
- Tài liệu liên quan: Git blame user manual
- Đầu ra grep như
rg, git grep, grep cũng được tô sáng cú pháp
- Hỗ trợ tính năng
--color-moved của Git
Tạo kiểu và chế độ tương thích
- Có thể sao chép trực tiếp mã từ diff, và các dấu
-/+ mặc định sẽ bị loại bỏ
- Cung cấp chế độ mô phỏng
diff-highlight và diff-so-fancy
- Hash commit có thể được liên kết tới trang của nhà cung cấp lưu trữ bằng định dạng terminal hyperlinks
- Đường dẫn tệp cũng có thể được tạo thành định dạng liên kết mà hệ điều hành có thể mở
- Có thể tạo kiểu trang trí hộp/đường kẻ để thu hút chú ý vào các phần tiêu đề commit, tệp, hunk
- Hỗ trợ chuỗi style gồm màu chữ, màu nền, thuộc tính phông chữ cho hơn 20 thành phần có thể tạo kiểu
- Ngôn ngữ style sử dụng cùng ngôn ngữ màu/style như Git
1 bình luận
Ý kiến Hacker News
Delta là kiểu công cụ thiết lập một lần rồi quên luôn, đã khá lâu rồi tôi không còn nhìn đầu ra
git grep/diff/blame“thuần” nữaTôi cũng luôn dùng nó cho diff thông thường ngoài kho Git, và hôm nay mới biết có thể dùng cùng với
ripgrephttps://dandavison.github.io/delta/grep.html
bat cũng vậy, như đã được nhắc tới, cũng là kiểu công cụ thiết lập xong rồi quên; nên tôi đặt bí danh
catthànhbat, còn/usr/bin/cat“cat nguyên bản” thì để bí danh riêng làvcathttps://github.com/sharkdp/bat
\catCó một nhận xét hay tôi từng đọc trước đây mà vẫn nhớ mãi: syntax highlighting hiện nay đang nhấn mạnh sai đối tượng
Con người vốn đã phân biệt cú pháp tốt rồi, nên thay vì tô màu cú pháp thì nên nhấn mạnh symbol. Nếu mỗi tên biến và tên hàm khác nhau có một màu khác nhau, mục tiêu sẽ không phải là “đây là một symbol” mà là “phân biệt các symbol khác nhau nhanh hơn”
Tuy vậy, việc này khó hơn nhiều so với trang trí cú pháp, nên có vẻ các công cụ vẫn dừng ở chỗ dễ làm hơn là chỗ hữu ích hơn. Tô sáng cú pháp cũng khá hữu ích, nhưng tôi rất muốn thấy một bộ máy khớp symbol thực sự hoạt động tốt
Tôi không nhớ đã đọc nguyên văn ở đâu nên không thể dẫn nguồn cho chuẩn
Trong lúc tìm lại thì tôi thấy bài này: https://www.wilfred.me.uk/blog/2014/09/27/the-definitive-gui...
Có lẽ nó còn xuất hiện sớm hơn nữa, nhưng bài giải thích sớm nhất tôi tìm được là một bài từ năm 2009: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from...
https://difftastic.wilfred.me.uk/
https://github.com/Wilfred/difftastic
Cá nhân tôi dùng color-identifiers-mode trong Emacs
https://github.com/ankurdave/color-identifiers-mode
Tôi chưa bị thuyết phục hoàn toàn bởi lập luận đó, nhưng cũng thấy hơi tò mò
Thỉnh thoảng tôi tự tô sáng để lần theo một biến và kiểm tra xem có chỗ dùng nào bị bỏ sót không, nên tôi hoàn toàn hiểu giá trị của cách đó. Chỉ là tôi không chắc màu sắc và độ tương phản có đủ để theo dõi nhiều biến cùng lúc hay không, và màn hình có thể trở nên rối mắt
Một cách dung hòa có lẽ là chỉ tô màu thủ công tối đa khoảng 3 biến. Dù vậy, nếu cần đến kiểu trợ giúp đó thì có thể đó vốn đã là dấu hiệu cho thấy mã khó đọc. Tất nhiên, hỗ trợ xử lý các codebase lộn xộn vẫn là một mục đích hoàn toàn chính đáng
Không hào nhoáng gì, nhưng nếu bạn chỉ cần một word-level diff tạm ổn bằng
gittiêu chuẩn, thì cách này trong nhiều trường hợp là đủ dùnggit diff --color-words --word-diff-regex='\w+|.'.gitconfig?Delta làm rất tốt công việc của nó, nhưng tôi cứ vướng mãi ở chuyện nó cắt ngắn các dòng dài
Thấy bài này nên tôi kiểm tra xem tình hình đã thay đổi chưa, và đúng là có rồi. Giờ chỉ cần đặt
git config --global --replace-all delta.max-line-length 0là nó không còn cắt dòng nữaTôi không rõ vì sao đây lại không phải mặc định. Thảo luận về thay đổi này ở https://github.com/dandavison/delta/pull/290
Nếu tô sáng cú pháp cho các dòng cực dài, ví dụ file
.jsđã được minify, thì khi không cắt dòng nó có thể trở nên rất chậmNhân nói đến diff, có một điểm khó chịu trong đầu ra diff của Git là nó bắt đầu đường dẫn tệp bằng hai tên tệp theo kiểu diff Unix truyền thống
--- a/some/path/to/file.c+++ b/some/path/to/file.cTôi thường
cmd-click trong iTerm để mở tệp trong trình soạn thảo, nhưng ở đây lại không hoạt động vì tiền tốa/vàb/. Có cách nào để Git định dạng tên tệp tốt hơn không? Hai dòng đó cũng đâu nhất thiết phải cógit config --global diff.noprefix trueXem thêm các tùy chọn liên quan đến tiền tố trong tài liệu hướng dẫn
Tôi đang dùng kết hợp delta và difftastic, và cả hai đều rất tuyệt
Đặc biệt, difftastic rất mạnh ở cú pháp AST của tree-sitter; hơi chậm một chút, nhưng một công cụ diff hiểu AST thực sự rất đáng giá
Delta thì gọn gàng và rất nhanh
Đây là một mẹo hữu ích để bật/tắt tính năng side-by-side của Delta tùy theo kích thước cửa sổ. Ở đây dùng bash, còn shell khác thì tự điều chỉnh
function delta_sidebyside {if [[ COLUMNS -ge 120 ]]; thenDELTA_FEATURES='side-by-side'elseDELTA_FEATURES=''fi}trap delta_sidebyside WINCH$trướcCOLUMNS, và có lẽ cũng cầnexporttrước khi gánDELTA_FEATURESTôi dùng cả delta lẫn difftastic, và có khen bao nhiêu cũng không đủ
Nếu bạn có dùng terminal dù chỉ một chút thì rất nên cài
Cả hai đều được hỗ trợ trong Magit của Emacs, và Lazygit cũng hỗ trợ
tig cũng đáng để xem: https://jonas.github.io/tig/
Tôi vẫn dùng
git diffthường có màu, nên cũng muốn thích cái này, nhưng nó trông quá rốiNhân tiện, đó là dự án của tôi
git diffnguyên bản có vấn đề gì cả