Delta: Git, diff, grep, blame 출력용 구문 강조 페이지 뷰어
(github.com/dandavison)- Delta는 Git, diff, grep 출력에 구문 강조와 페이지 뷰어 기능을 더해 diff를 더 효율적이고 보기 좋게 읽도록 돕는 도구임
- 대부분의 패키지 매니저에서는 패키지명이 git-delta지만 실행 파일은
delta이며,~/.gitconfig에서core.pager = delta로 설정해 Git pager로 사용할 수 있음 - 주요 기능은 bat와 동일한 구문 강조 테마, Levenshtein 편집 추론 기반 단어 단위 diff 강조, 좌우 비교 보기, 줄 번호,
n/N탐색, 병합 충돌 표시 개선임 git blame,rg,git grep,grep출력도 구문 강조하며,--hyperlinks로 GitHub, GitLab, SourceHut, Codeberg 같은 호스팅 제공자 링크 형식의 커밋 해시를 만들 수 있음- 기본 Git/diff 출력에 가깝게 유지하거나 레이아웃과 스타일을 크게 바꿀 수 있어, diff 검토 환경을 터미널 안에서 세밀하게 조정할 수 있음
Delta가 하는 일
- Delta는 Git, diff, grep 출력용 구문 강조 페이지 뷰어임
- 코드가 계속 바뀌는 환경에서 diff를 읽는 시간을 더 효율적이고 즐겁게 만드는 것을 목표로 함
- diff의 레이아웃과 스타일을 폭넓게 바꿀 수 있으며, 원하면 기본 Git/diff 출력에 매우 가깝게 유지할 수도 있음
설치와 기본 설정
- 설치 문서는 Install it에서 제공됨
- 대부분의 패키지 매니저에서 패키지명은 git-delta이고, 실행 파일 이름은
delta임 ~/.gitconfig에 다음 설정을 추가해 Git pager와 인터랙티브 diff 필터로 사용할 수 있음
[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
- 같은 설정은
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
- 도움말은
delta -h, 전체 매뉴얼은delta --help, 온라인 문서는 user manual에서 확인할 수 있음
diff 읽기 기능
- 구문 강조는 bat와 같은 구문 강조 테마를 사용함
- 단어 단위 diff 강조는 Levenshtein 편집 추론 알고리듬을 사용함
- 좌우 비교 보기와 줄 바꿈을 지원함
- 줄 번호 표시를 지원함
- 큰 diff의 파일 사이,
log -p보기의 diff 사이를n과N키로 이동할 수 있음- 이 기능은
--navigate로 활성화됨
- 이 기능은
- 전통적인 unified diff 출력도 Git 출력과 함께 처리함
- 밝은/어두운 터미널 배경을 자동 감지할 수 있음
보기 방식과 테마
- 구문 강조 테마는 bat에서 제공되는 모든 테마를 Delta에서도 사용할 수 있음
delta --show-syntax-themes --darkdelta --show-syntax-themes --light
- 좌우 비교 보기는 Side-by-side view user manual에 문서화되어 있음
[delta]
side-by-side = true
- 좌우 비교 보기의 기본값은 줄 번호가 활성화되어 있으며, 왼쪽과 오른쪽 패널 모두에서 구문 강조가 적용됨
- 좌우 비교 보기는 긴 줄을 자동으로 감쌈
- 줄 번호 기능은 Line numbers user manual에 문서화되어 있음
[delta]
line-numbers = true
Git 작업별 지원
- 병합 충돌 표시는 개선된 형식으로 제공되며, 관련 문서는 Merge conflicts user manual에 있음
- git blame 출력은 구문 강조를 지원하며,
--hyperlinks사용 시 커밋을 호스팅 제공자 링크 형식으로 만들 수 있음- 지원 호스팅 제공자: GitHub, GitLab, SourceHut, Codeberg
- 관련 문서: Git blame user manual
rg,git grep,grep등의 grep 출력도 구문 강조함- 관련 문서: Grep user manual
- Git의
--color-moved기능을 지원함
스타일링과 호환 모드
- diff에서 코드를 바로 복사할 수 있으며,
-/+마커는 기본적으로 제거됨 diff-highlight와diff-so-fancy에뮬레이션 모드를 제공함- 커밋 해시는 터미널 hyperlinks 형식으로 호스팅 제공자 페이지에 연결할 수 있음
- 파일 경로도 운영체제에서 열 수 있는 하이퍼링크 형식으로 만들 수 있음
- 커밋, 파일, hunk 헤더 섹션에 주목하게 하는 박스/라인 장식을 스타일링할 수 있음
- 20개가 넘는 스타일 지정 요소에 대해 전경색, 배경색, 글꼴 속성을 포함한 스타일 문자열을 지원함
- 스타일 언어는 Git과 같은 색상/스타일 언어를 사용함
댓글과 토론
Hacker News 의견들
-
Delta는 한 번 설정하고 잊고 쓰는 도구였고, 한동안 ‘맨’
git grep/diff/blame출력을 본 적이 없음
Git 저장소 밖의 일반 diff에도 늘 쓰는데, 오늘ripgrep과도 같이 쓸 수 있다는 걸 알게 됨
https://dandavison.github.io/delta/grep.html
이미 언급된 bat도 마찬가지로 한 번 설정해두고 잊고 쓰는 도구라서,cat을bat으로 별칭 지정하고 ‘순정 cat’인/usr/bin/cat은vcat별칭으로 따로 둠
https://github.com/sharkdp/bat- 별칭 확장을 막으려면
\cat을 쓰면 됨
- 별칭 확장을 막으려면
-
예전에 본 좋은 지적이 계속 기억에 남는데, 지금의 구문 강조는 잘못된 대상을 강조하고 있음
문법은 사람이 잘 구분하니 문법에 색을 입힐 게 아니라 심볼을 강조해야 함. 서로 다른 변수명과 함수명마다 다른 색을 주면, “이게 심볼이다”가 아니라 “서로 다른 심볼을 더 빨리 구분한다”는 목표에 맞음
다만 문법을 꾸미는 것보다 훨씬 어렵기 때문에 도구들이 유용한 쪽보다 쉬운 쪽에 머무는 듯함. 문법 강조도 꽤 도움이 되긴 하지만, 심볼 매칭 엔진이 실제로 잘 작동하는지 보고 싶음
원문을 어디서 읽었는지 기억나지 않아 제대로 출처를 달 수는 없음
찾아보다가 이 글을 발견함: https://www.wilfred.me.uk/blog/2014/09/27/the-definitive-gui...- KDevelop에서는 이걸 구문 강조가 아니라 의미 기반 강조라고 불렀음
이보다 더 일찍 있었던 것 같지만, 찾을 수 있는 가장 이른 설명 글은 2009년 글임: https://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from... - 그 글의 저자는 treesitter를 사용해 “구문을 이해하는 구조적 diff”인 difftastic도 만들었음
https://difftastic.wilfred.me.uk/
https://github.com/Wilfred/difftastic - 완전히 동의함. 처음엔 낯설어 보였지만 익숙해지고 나니 이런 강조 방식을 더 선호하게 됨
개인적으로는 Emacs에서 color-identifiers-mode를 사용함
https://github.com/ankurdave/color-identifiers-mode - 변수명도 꽤 잘 구분할 수 있음. 특히 문법 자체가 강조되어 있으면 어디를 봐야 하고 어디를 보지 않아도 되는지 정확히 알 수 있음
그 논리에 완전히 설득되지는 않았지만 약간 궁금하긴 함
가끔 변수를 따라가기 위해 직접 강조해서 놓친 사용처가 없는지 확인하는데, 그 용도는 충분히 이해됨. 다만 여러 변수를 동시에 따라갈 만큼 색과 대비가 충분한지는 모르겠고, 화면이 지저분해질 수도 있음
절충안으로는 수동으로 최대 3개 정도의 변수만 색칠하는 방식이 가능할 듯함. 다만 그런 도움이 필요한 경우는 애초에 코드 가독성이 낮다는 신호일 수도 있음. 물론 지저분한 코드베이스를 다루는 데 도움을 주는 건 정당한 용도임
- KDevelop에서는 이걸 구문 강조가 아니라 의미 기반 강조라고 불렀음
-
화려하진 않지만, 표준
git만으로도 그럭저럭 괜찮은 단어 단위 diff가 필요하면 이 정도로 충분한 경우가 많음
git diff --color-words --word-diff-regex='\w+|.'- 이걸
.gitconfig에서 기본값으로 켜려면 어떻게 해야 함?
- 이걸
-
Delta는 제 역할을 아주 잘하지만, 긴 줄을 잘라버리는 문제에 계속 걸렸음
이 글을 보고 상황이 바뀌었는지 확인해봤는데 실제로 바뀌었음. 이제git config --global --replace-all delta.max-line-length 0을 설정하면 줄을 더 이상 자르지 않음
왜 이게 기본값이 아닌지는 잘 모르겠음. 변경 논의는 https://github.com/dandavison/delta/pull/290에 있음- 왜 기본값이 아닌지는 해당 PR에 그대로 나와 있음
아주 긴 줄, 예를 들어 축소된.js파일을 구문 강조하면 자르지 않을 때 매우 느려질 수 있기 때문임
- 왜 기본값이 아닌지는 해당 PR에 그대로 나와 있음
-
diff 얘기가 나온 김에, Git의 diff 출력에서 짜증나는 점은 파일 경로를 전통적인 Unix diff처럼 두 파일 이름으로 시작해서 출력한다는 것임
--- a/some/path/to/file.c
+++ b/some/path/to/file.c
iTerm에서cmd-클릭으로 파일을 편집기에서 여는 경우가 많은데, 여기서는a/와b/접두사 때문에 작동하지 않음. Git이 파일 이름을 더 낫게 포맷하게 할 방법이 있을까? 두 줄이 꼭 필요하지도 않음git config --global diff.noprefix true
접두사 관련 다른 옵션은 매뉴얼을 보면 됨
-
delta와 difftastic을 섞어서 쓰고 있는데 둘 다 훌륭함
특히 difftastic은 tree-sitter AST 구문에 강해서 조금 느리긴 해도, AST를 아는 diff가 정말 좋음
Delta는 깔끔하고 매우 빠름 -
창 크기에 따라 Delta의 side-by-side 기능을 켜고 끄는 유용한 팁임. 여기서는 bash 기준이고, 다른 셸은 직접 응용하면 됨
function delta_sidebyside {
if [[ COLUMNS -ge 120 ]]; then
DELTA_FEATURES='side-by-side'
else
DELTA_FEATURES=''
fi
}
trap delta_sidebyside WINCHCOLUMNS앞에$가 빠졌고,DELTA_FEATURES설정 전에export도 필요할 가능성이 큼
-
delta와 difftastic 둘 다 쓰고 있고, 아무리 추천해도 부족함
터미널을 조금이라도 쓴다면 설치하는 게 좋음- Difftastic과 Delta는 순수 터미널에서만 동작하는 게 아님
둘 다 Emacs의 Magit에서 지원되고, Lazygit에서도 지원됨 - difftastic을 한동안 쓰고 있는데, 둘을 함께 쓰려면 어떻게 쓰는지 궁금함
- Difftastic과 Delta는 순수 터미널에서만 동작하는 게 아님
-
tig도 확인해볼 만함: https://jonas.github.io/tig/
-
색이 있는 일반
git diff를 써왔기 때문에 이걸 좋아하고 싶긴 한데, 너무 복잡해 보임- diffr가 마음에 들 수도 있음: https://github.com/mookid/diffr
참고로 내 프로젝트임 - 같은 인상을 받았음. 순정
git diff가 딱히 문제라고 느낀 적은 없었음
- diffr가 마음에 들 수도 있음: https://github.com/mookid/diffr