3 điểm bởi GN⁺ 2024-11-09 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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 nN
    • 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-highlightdiff-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

 
GN⁺ 2024-11-09
Ý 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ữa
    Tô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 ripgrep
    https://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 cat thành bat, còn /usr/bin/cat “cat nguyên bản” thì để bí danh riêng là vcat
    https://github.com/sharkdp/bat

    • Nếu muốn ngăn mở rộng bí danh thì dùng \cat
  • Có 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...

    • Trong KDevelop, thứ này không được gọi là tô sáng cú pháp mà là semantic highlighting
      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...
    • Tác giả của bài đó cũng tạo ra difftastic, một dạng “diff có cấu trúc hiểu cú pháp” dùng treesitter
      https://difftastic.wilfred.me.uk/
      https://github.com/Wilfred/difftastic
    • Hoàn toàn đồng ý. Ban đầu trông hơi lạ, nhưng sau khi quen rồi thì tôi lại thích kiểu tô sáng này hơn
      Cá nhân tôi dùng color-identifiers-mode trong Emacs
      https://github.com/ankurdave/color-identifiers-mode
    • Tên biến cũng phân biệt được khá tốt. Đặc biệt là khi bản thân cú pháp đã được tô sáng thì bạn biết khá chính xác chỗ nào cần nhìn và chỗ nào không cần nhìn
      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 git tiêu chuẩn, thì cách này trong nhiều trường hợp là đủ dùng
    git diff --color-words --word-diff-regex='\w+|.'

    • Làm sao để bật cái này làm mặc định trong .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 0 là nó không còn cắt dòng nữa
    Tô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

    • Lý do nó không phải mặc định đã được ghi nguyên trong PR đó
      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ậm
  • Nhâ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.c
    Tô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/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 true
      Xem 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 deltadifftastic, 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 ]]; then
    DELTA_FEATURES='side-by-side'
    else
    DELTA_FEATURES=''
    fi
    }
    trap delta_sidebyside WINCH

    • Thiếu $ trước COLUMNS, và có lẽ cũng cần export trước khi gán DELTA_FEATURES
  • Tô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

    • Difftastic và Delta không chỉ hoạt động trong terminal thuần
      Cả hai đều được hỗ trợ trong Magit của Emacs, và Lazygit cũng hỗ trợ
    • Tôi đã dùng difftastic một thời gian rồi, và muốn biết nếu dùng cùng cả hai thì mọi người cấu hình thế nào
  • tig cũng đáng để xem: https://jonas.github.io/tig/

  • Tôi vẫn dùng git diff thường có màu, nên cũng muốn thích cái này, nhưng nó trông quá rối

    • Có thể bạn sẽ thích diffr: https://github.com/mookid/diffr
      Nhân tiện, đó là dự án của tôi
    • Tôi cũng có cảm giác như vậy. Tôi chưa từng thấy git diff nguyên bản có vấn đề gì cả