3 पॉइंट द्वारा GN⁺ 2024-11-09 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Delta एक ऐसा tool है जो Git, diff, grep आउटपुट में syntax highlighting और pager viewer सुविधाएँ जोड़ता है, ताकि diff को अधिक प्रभावी और आकर्षक तरीके से पढ़ा जा सके
  • ज़्यादातर package managers में package का नाम git-delta है, लेकिन executable delta है, और इसे Git pager के रूप में इस्तेमाल करने के लिए ~/.gitconfig में core.pager = delta सेट किया जा सकता है
  • मुख्य features में bat जैसी syntax highlighting themes, Levenshtein edit inference पर आधारित word-level diff highlighting, side-by-side comparison view, line numbers, n/N navigation, और merge conflict display में सुधार शामिल हैं
  • यह git blame, rg, git grep, grep आउटपुट को भी syntax-highlight करता है, और --hyperlinks से GitHub, GitLab, SourceHut, Codeberg जैसे hosting providers के link format वाले commit hashes बना सकता है
  • इसे default Git/diff आउटपुट के करीब रखा जा सकता है या layout और style को काफी बदला जा सकता है, जिससे terminal के अंदर diff review environment को बारीकी से tune किया जा सकता है

Delta क्या करता है

  • Delta Git, diff, grep आउटपुट के लिए syntax highlighting pager viewer है
  • इसका लक्ष्य ऐसे environment में, जहाँ code लगातार बदलता रहता है, diff पढ़ने में लगने वाले समय को अधिक प्रभावी और सुखद बनाना है
  • diff के layout और style को व्यापक रूप से बदला जा सकता है, और चाहें तो इसे default Git/diff आउटपुट के बहुत करीब भी रखा जा सकता है

Installation और basic setup

  • Installation documentation Install it पर उपलब्ध है
  • ज़्यादातर package managers में package name git-delta है, और executable का नाम delta है
  • इसे Git pager और interactive diff filter के रूप में इस्तेमाल करने के लिए ~/.gitconfig में नीचे की settings जोड़ सकते हैं
[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
  • यही settings git config --global command से भी लागू की जा सकती हैं
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
  • Help के लिए delta -h, पूरा manual देखने के लिए delta --help, और online documentation के लिए user manual देख सकते हैं

diff पढ़ने की features

  • Syntax highlighting bat जैसी syntax highlighting themes का इस्तेमाल करती है
  • Word-level diff highlighting Levenshtein edit inference algorithm का इस्तेमाल करती है
  • Side-by-side comparison view और line wrapping को support करता है
  • Line numbers display को support करता है
  • बड़े diff में files के बीच, और log -p view में diffs के बीच n और N keys से move किया जा सकता है
    • यह feature --navigate से enable होता है
  • पारंपरिक unified diff आउटपुट को भी Git आउटपुट के साथ process करता है
  • Light/dark terminal background को automatically detect कर सकता है

View modes और themes

  • Syntax highlighting themes में bat द्वारा उपलब्ध कराई गई सभी themes Delta में भी इस्तेमाल की जा सकती हैं
    • delta --show-syntax-themes --dark
    • delta --show-syntax-themes --light
  • Side-by-side comparison view का documentation Side-by-side view user manual में है
[delta]
    side-by-side = true
  • Side-by-side comparison view में default रूप से line numbers enabled होते हैं, और left व right दोनों panels में syntax highlighting लागू होती है
  • Side-by-side comparison view लंबी lines को automatically wrap करता है
  • Line numbers feature का documentation Line numbers user manual में है
[delta]
    line-numbers = true

Git task-wise support

  • Merge conflict display बेहतर format में उपलब्ध है, और संबंधित documentation Merge conflicts user manual में है
  • git blame आउटपुट syntax highlighting को support करता है, और --hyperlinks इस्तेमाल करने पर commits को hosting provider link format में बनाया जा सकता है
    • Supported hosting providers: GitHub, GitLab, SourceHut, Codeberg
    • संबंधित documentation: Git blame user manual
  • rg, git grep, grep जैसे grep आउटपुट को भी syntax-highlight करता है
  • Git के --color-moved feature को support करता है

Styling और compatibility mode

  • diff से code सीधे copy किया जा सकता है, और -/+ markers default रूप से हटाए जाते हैं
  • diff-highlight और diff-so-fancy emulation modes उपलब्ध कराता है
  • Commit hashes को terminal hyperlinks format में hosting provider pages से link किया जा सकता है
  • File paths को भी ऐसे hyperlink format में बनाया जा सकता है जिन्हें operating system में खोला जा सके
  • Commit, file, और hunk header sections की ओर ध्यान खींचने वाली box/line decorations को style किया जा सकता है
  • 20 से अधिक style elements के लिए foreground color, background color, font attributes सहित style strings को support करता है
    • Style language Git जैसी color/style language का इस्तेमाल करती है

1 टिप्पणियां

 
GN⁺ 2024-11-09
Hacker News टिप्पणियाँ
  • Delta ऐसा टूल था जिसे एक बार सेट करके फिर भूल जाओ, और काफी समय तक मैंने ‘plain’ git grep/diff/blame आउटपुट देखा ही नहीं
    मैं इसे Git repository के बाहर वाले सामान्य diff के लिए भी हमेशा इस्तेमाल करता हूँ, और आज पता चला कि इसे ripgrep के साथ भी इस्तेमाल किया जा सकता है
    https://dandavison.github.io/delta/grep.html
    ऊपर ज़िक्र किया गया bat भी वैसा ही एक “set and forget” टूल है, इसलिए मैंने cat का alias bat पर सेट कर रखा है, और ‘original cat’ /usr/bin/cat के लिए अलग से vcat alias रखा है
    https://github.com/sharkdp/bat

    • alias expansion रोकने के लिए \cat इस्तेमाल कर सकते हैं
  • मैंने पहले कहीं एक अच्छी बात पढ़ी थी जो अब तक याद है: आज का syntax highlighting गलत चीज़ को highlight कर रहा है
    syntax तो इंसान वैसे भी पहचान लेता है, इसलिए grammar को रंगने के बजाय symbols को highlight करना चाहिए। अगर अलग-अलग variable names और function names को अलग रंग दिए जाएँ, तो लक्ष्य “यह एक symbol है” बताना नहीं, बल्कि “अलग-अलग symbols को जल्दी पहचानना” होना चाहिए
    लेकिन यह syntax को सजाने से कहीं ज़्यादा कठिन है, इसलिए लगता है कि tools आसान दिशा में ही रुके हुए हैं, उपयोगी दिशा में नहीं। syntax highlighting भी काफ़ी मददगार है, लेकिन मैं सच में देखना चाहता हूँ कि कोई symbol-matching engine वास्तव में कितना अच्छा काम करता है
    याद नहीं कि मूल लेख कहाँ पढ़ा था, इसलिए सही source नहीं दे सकता
    खोजते हुए यह लेख मिला: https://www.wilfred.me.uk/blog/2014/09/27/the-definitive-gui...

    • KDevelop में इसे syntax highlighting नहीं बल्कि semantic highlighting कहा जाता था
      शायद इससे भी पहले से यह मौजूद था, लेकिन मुझे जो सबसे पुराना विवरण मिला वह 2009 का है: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from...
    • उस लेख के लेखक ने treesitter का इस्तेमाल करने वाला difftastic भी बनाया, जो “syntax को समझने वाला structural diff” है
      https://difftastic.wilfred.me.uk/
      https://github.com/Wilfred/difftastic
    • पूरी तरह सहमत। शुरू में यह थोड़ा अजीब लगा, लेकिन आदत पड़ने के बाद मैं इस तरह की highlighting ज़्यादा पसंद करने लगा
      मैं व्यक्तिगत रूप से Emacs में color-identifiers-mode इस्तेमाल करता हूँ
      https://github.com/ankurdave/color-identifiers-mode
    • variable names को भी काफ़ी अच्छी तरह अलग पहचाना जा सकता है। खासकर जब syntax खुद highlight हो रहा हो, तब यह ठीक-ठीक पता चलता है कि कहाँ देखना है और कहाँ देखने की ज़रूरत नहीं
      मैं इस तर्क से पूरी तरह आश्वस्त नहीं हूँ, लेकिन थोड़ा उत्सुक ज़रूर हूँ
      कभी-कभी मैं किसी variable को track करने के लिए खुद highlight करके देखता हूँ कि कहीं उसका कोई usage छूट तो नहीं गया, इसलिए उस use case को मैं अच्छी तरह समझता हूँ। लेकिन एक साथ कई variables को track करने के लिए रंग और contrast काफ़ी होंगे या नहीं, यह पक्का नहीं, और स्क्रीन बिखरी-बिखरी भी लग सकती है
      समझौते के तौर पर शायद manually ज़्यादा से ज़्यादा 3 variables को रंगने का तरीका ठीक रहे। हालाँकि जिन मामलों में ऐसी मदद की ज़रूरत पड़े, वह खुद code readability कम होने का संकेत भी हो सकता है। फिर भी गंदे codebase के साथ काम करने में मदद करना बिल्कुल वैध use case है
  • यह बहुत चमकदार नहीं है, लेकिन अगर standard git के साथ एक ठीक-ठाक word-level diff चाहिए, तो कई बार इतना ही काफ़ी होता है
    git diff --color-words --word-diff-regex='\w+|.'

    • इसे .gitconfig में default के तौर पर कैसे enable करें?
  • Delta अपना काम बहुत अच्छी तरह करता है, लेकिन लंबी lines को काट देने वाली समस्या बार-बार सामने आती थी
    यह पोस्ट देखकर मैंने जाँचा कि क्या अब स्थिति बदली है, और सच में बदली है। अब git config --global --replace-all delta.max-line-length 0 सेट करने पर lines अब cut नहीं होतीं
    समझ नहीं आता कि यह default क्यों नहीं है। इस बदलाव पर चर्चा https://github.com/dandavison/delta/pull/290 में है

    • यह default क्यों नहीं है, वही उस PR में साफ़ लिखा है
      बहुत लंबी lines, जैसे minified .js files, पर syntax highlighting करते समय अगर उन्हें cut न किया जाए तो चीज़ें बहुत धीमी हो सकती हैं
  • diff की बात निकली है, तो Git के diff आउटपुट की एक परेशान करने वाली बात यह है कि file paths पारंपरिक Unix diff की तरह दो filenames से शुरू होते हैं
    --- a/some/path/to/file.c
    +++ b/some/path/to/file.c
    iTerm में मैं अक्सर cmd-click से files को editor में खोलता हूँ, लेकिन यहाँ a/ और b/ prefixes की वजह से यह काम नहीं करता। क्या Git को filenames बेहतर format में दिखाने का कोई तरीका है? वैसे भी ये दो lines ज़रूरी नहीं लगतीं

    • git config --global diff.noprefix true
      prefix से जुड़े दूसरे options के लिए manual देख सकते हैं
  • मैं delta और difftastic को मिलाकर इस्तेमाल करता हूँ, और दोनों ही शानदार हैं
    खासकर difftastic tree-sitter AST syntax में बहुत अच्छा है, इसलिए थोड़ा धीमा होने के बावजूद AST-aware diff वाकई बेहतरीन लगता है
    Delta साफ-सुथरा है और बहुत तेज़ है

  • window size के हिसाब से Delta की side-by-side feature को on/off करने की यह एक उपयोगी टिप है। यहाँ bash का उदाहरण है, बाकी shells के लिए आप खुद ढाल सकते हैं
    function delta_sidebyside {
    if [[ COLUMNS -ge 120 ]]; then
    DELTA_FEATURES='side-by-side'
    else
    DELTA_FEATURES=''
    fi
    }
    trap delta_sidebyside WINCH

    • COLUMNS के आगे $ छूटा हुआ है, और DELTA_FEATURES सेट करने से पहले शायद export भी चाहिए होगा
  • मैं delta और difftastic दोनों इस्तेमाल करता हूँ, और जितनी सिफारिश करूँ कम है
    अगर आप ज़रा भी terminal इस्तेमाल करते हैं, तो इन्हें install करना चाहिए

    • Difftastic और Delta सिर्फ pure terminal में ही काम नहीं करते
      दोनों को Emacs के Magit में support मिलता है, और Lazygit में भी support है
    • मैं कुछ समय से difftastic इस्तेमाल कर रहा हूँ, लेकिन दोनों को साथ में कैसे इस्तेमाल करते हैं, यह जानना चाहता हूँ
  • tig भी देखना चाहिए: https://jonas.github.io/tig/

  • मैं colored सामान्य git diff इस्तेमाल करता रहा हूँ, इसलिए इसे पसंद करना चाहता हूँ, लेकिन यह बहुत जटिल लगता है

    • शायद diffr पसंद आए: https://github.com/mookid/diffr
      वैसे, यह मेरा प्रोजेक्ट है
    • मेरा भी यही impression था। मुझे कभी नहीं लगा कि plain git diff में कोई खास समस्या है