- 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 टिप्पणियां
Hacker News टिप्पणियाँ
Delta ऐसा टूल था जिसे एक बार सेट करके फिर भूल जाओ, और काफी समय तक मैंने ‘plain’
git grep/diff/blameआउटपुट देखा ही नहींमैं इसे Git repository के बाहर वाले सामान्य diff के लिए भी हमेशा इस्तेमाल करता हूँ, और आज पता चला कि इसे
ripgrepके साथ भी इस्तेमाल किया जा सकता हैhttps://dandavison.github.io/delta/grep.html
ऊपर ज़िक्र किया गया bat भी वैसा ही एक “set and forget” टूल है, इसलिए मैंने
catका aliasbatपर सेट कर रखा है, और ‘original cat’/usr/bin/catके लिए अलग सेvcatalias रखा हैhttps://github.com/sharkdp/bat
\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...
शायद इससे भी पहले से यह मौजूद था, लेकिन मुझे जो सबसे पुराना विवरण मिला वह 2009 का है: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from...
https://difftastic.wilfred.me.uk/
https://github.com/Wilfred/difftastic
मैं व्यक्तिगत रूप से Emacs में color-identifiers-mode इस्तेमाल करता हूँ
https://github.com/ankurdave/color-identifiers-mode
मैं इस तर्क से पूरी तरह आश्वस्त नहीं हूँ, लेकिन थोड़ा उत्सुक ज़रूर हूँ
कभी-कभी मैं किसी 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 में है
बहुत लंबी lines, जैसे minified
.jsfiles, पर syntax highlighting करते समय अगर उन्हें cut न किया जाए तो चीज़ें बहुत धीमी हो सकती हैंdiff की बात निकली है, तो Git के diff आउटपुट की एक परेशान करने वाली बात यह है कि file paths पारंपरिक Unix diff की तरह दो filenames से शुरू होते हैं
--- a/some/path/to/file.c+++ b/some/path/to/file.ciTerm में मैं अक्सर
cmd-click से files को editor में खोलता हूँ, लेकिन यहाँa/औरb/prefixes की वजह से यह काम नहीं करता। क्या Git को filenames बेहतर format में दिखाने का कोई तरीका है? वैसे भी ये दो lines ज़रूरी नहीं लगतींgit config --global diff.noprefix trueprefix से जुड़े दूसरे 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 ]]; thenDELTA_FEATURES='side-by-side'elseDELTA_FEATURES=''fi}trap delta_sidebyside WINCHCOLUMNSके आगे$छूटा हुआ है, औरDELTA_FEATURESसेट करने से पहले शायदexportभी चाहिए होगामैं delta और difftastic दोनों इस्तेमाल करता हूँ, और जितनी सिफारिश करूँ कम है
अगर आप ज़रा भी terminal इस्तेमाल करते हैं, तो इन्हें install करना चाहिए
दोनों को Emacs के Magit में support मिलता है, और Lazygit में भी support है
tig भी देखना चाहिए: https://jonas.github.io/tig/
मैं colored सामान्य
git diffइस्तेमाल करता रहा हूँ, इसलिए इसे पसंद करना चाहता हूँ, लेकिन यह बहुत जटिल लगता हैवैसे, यह मेरा प्रोजेक्ट है
git diffमें कोई खास समस्या है