ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

kitty diff:在 kitty 终端里用 GPU 渲染完成并排 diff、图片对比与 git 集成的全攻略

kitty diff:在 kitty 终端里用 GPU 渲染完成并排 diff、图片对比与 git 集成的全攻略 kitty diff在 kitty 终端里用 GPU 渲染完成并排 diff、图片对比与 git 集成的全攻略【免费下载链接】kittyIf you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based.项目地址: https://gitcode.com/GitHub_Trending/ki/kittykitty diff 是内置在 kitty 终端中的kitten diff子命令它把file1与file2也可以是两个目录的差异以并排side-by-side方式渲染在终端窗口中支持异步语法高亮、图片差异显示、递归目录对比甚至可以通过ssh:hostname:remote-path直接对比远端文件。读完本文你将掌握它的安装与用法、全部键盘操作、与 git 的深度集成以及通过diff.conf自定义配色、快捷键与底层 diff 算法的完整方法还能从源码层面理解它为何只在 kitty 中工作。上图展示了 kitty diff 的典型界面左右并排的文本、变更区域的背景高亮与颜色标记原文档配图。kitty diff 是什么kitten diff是 kitty 官方文档中描述为 A fast side-by-side diff tool with syntax highlighting and images 的终端内对比工具核心能力包括并排显示差异直接在 kitty 终端里左右并排展示两份内容异步语法高亮语法高亮在后台线程完成最大化响应速度图片差异除了文本还能直接显示图片差异递归目录对比传入两个目录时递归对比整个目录树。从仓库结构看它的实现横跨两层Python 侧的 kittens/diff/main.py 负责声明配置项、快捷键与命令行参数定义Go 侧的 kittens/diff/main.go 等文件负责真正的对比、渲染与交互逻辑。官方文档说明整个实现不足 3000 行代码并复用了 kitty 为所有 kitten 搭建的终端程序基础设施。安装与基本使用安装非常简单只需安装 kitty 本身参见 快速入门diff kitten 随终端一起内置无需额外安装。对比两个文件在 kitty 终端中运行kitten diff file1 file2即可看到file1与file2之间的并排差异。为了缩短命令可以在 shell 启动文件中添加别名例如alias dkitten diff之后对比只需d file1 file2对比目录把参数换成目录即可递归对比两个目录的内容kitten diff dir1 dir2对比远端文件从命令行帮助文本定义于 kittens/diff/main.py可知命令还支持形如ssh:hostname:remote-file-path的参数来 diff 远端文件。Go 端 kittens/diff/main.go 的get_remote_file()/get_ssh_file()实现了这一逻辑它先通过ssh在远端用tar --dereference --create把目标打包并输出到标准输出本地再用 tar 读取器解包到临时目录最后对本地副本做 diff。键盘控制下表完整列出 kitty diff 的默认键盘操作来源于文档与 kittens/diff/main.py 中的 shortcuts 定义操作快捷键退出Q向上滚动一行K、Up向下滚动一行J、Down向上滚动一页PgUp向下滚动一页PgDn滚动到顶部Home滚动到底部End滚动到下一页Space、PgDn、CtrlF滚动到上一页PgUp、CtrlB向下滚动半页CtrlD向上滚动半页CtrlU跳到下一处变更N跳到上一处变更P增加上下文行数减少上下文行数-显示所有上下文A恢复默认上下文向前搜索/向后搜索?清除搜索或退出Esc跳到下一个匹配、.跳到上一个匹配、,复制选中内容到剪贴板y复制选中内容若无选中则退出CtrlC注意键盘按键默认通过 kitty 的 扩展键盘协议 上报因此支持Ctrl、Shift与各按键组合的精确区分kittens/diff/main.go 在收到终端能力查询结果时会检查KeyboardProtocol若当前终端或终端复用器不支持该协议会直接报错退出。在 shortcuts 配置之外源码中还存在若干未绑定默认按键但可用的动作例如scroll_to next-change跳转下一变更、scroll_to next-file/prev-file在多个文件间跳转、change_context default/5/-5/all调整上下文、start_search regex/substring forward/backward搜索以及copy_to_clipboard等可在diff.conf中自定义绑定见下文“配置”一节。与 git 集成通过 git difftool 使用在~/.gitconfig中追加如下配置[diff] tool kitty guitool kitty.gui [difftool] prompt false trustExitCode true [difftool kitty] cmd kitten diff $LOCAL $REMOTE [difftool kitty.gui] cmd kitten diff $LOCAL $REMOTE随后即可用 kitty diff 查看 git 差异git difftool --no-symlinks --dir-diff--dir-diff让 git 同时为整个目录树中的变更文件调用 difftoolkitty diff 支持目录输入因此可以一次打开看到所有文件差异再用下一节提到的快捷键在文件之间跳转。给这条命令配个别名会非常顺手。作为 git 子命令转发参数如果你不想改动~/.gitconfig文档还提到可以安装社区的 git 插件将git diff的参数转发给 kitty-diff安装后直接运行git kitten diff即可把熟悉的git diff参数透传给 kitty diff。为什么只在 kitty 中工作官方文档对此有明确说明kitty diff 大量依赖kitty 独有的终端特性主要包括kitty 图形协议用于在终端中渲染高保真文本与图片扩展键盘协议用于精确获取键盘输入以及文档 protocol-extensions 中汇总的其它扩展协议。除此之外它还复用了 kitty 为所有 kitten 建立的终端程序基础设施事件循环、鼠标追踪、能力查询等从而显著减少了代码量。从 kittens/diff/main.go 可见其初始化流程创建loop.Loop事件循环、开启鼠标追踪模式BUTTONS_AND_DRAG_MOUSE_TRACKING、请求配色方案变更通知、隐藏光标并设置标题为 “left vs. right”随后注册键盘、文本、鼠标、缩放等回调后进入事件循环。整套交互协议都依赖 kitty 专属能力这也是它天然只运行在 kitty 内的根本原因。配置 diff.conf你可以通过创建名为diff.conf的文件放在 kitty 配置目录 中来调整所用配色、键盘快捷键、diff 实现、默认上下文行数等。下面按配置分组逐一说明默认值与含义来自 kittens/diff/main.py 的配置定义。Diffing对比行为配置项默认值说明syntax_aliasespyj:py pyi:py recipe:py语法高亮的文件扩展名别名多个别名以空格分隔。例如让file.xyz按file.abc语法高亮设置xyz:abcnum_context_lines3每处变更周围显示的上下文行数diff_cmdauto使用的 diff 命令必须包含会被替换为上下文行数的占位符_CONTEXT_。特殊值auto自动挑选可用的 diff 实现builtin使用 Go 标准库的 anchored diff 算法git调用 git 命令对比diff调用系统 diff 命令replace_tab_by\x20\x20\x20\x20用于替换 Tab 的字符串默认四个空格ignore_name可重复空仅针对文件/目录名的 glob 模式匹配的文件与目录在扫描时被忽略。例如ignore_name .git、ignore_name *~、ignore_name *.pycmark_moved_linesyes是否用moved_bg颜色区分“被移动的行”从左删除且从右新增的行word_diff_modewords高亮“变更行中哪些部分变了”的算法。words逐词高亮变更处central在字节级别高亮每个变更行的中心变更区域。注意words模式只在变更块的新增与删除行数相等时生效word_regex[^\s\p{P}]word_diff_mode为words时定义“单词”的正则表达式。默认匹配一串连续的“非空白、非标点”字符。必须是合法的 Go 正则否则 diff 会报错失败sticky_headeryes向下滚动越过文件头部后是否把文件名与分隔线固定在屏幕顶端Colors配色配色分为亮色与暗色两套不带前缀的设置用于亮色light带dark_前缀的用于暗色。配置项默认值亮色默认值暗色说明color_schemeauto—auto跟随父终端的明暗主题也可显式设为light/darkpygments_styledefault—语法高亮所用 pygments 配色仅作用于语法高亮不影响 diff 颜色亮色主题使用dark_pygments_stylegithub-dark—暗色主题下的语法高亮配色foreground/dark_foregroundblack#f8f8f2基本前景色background/dark_backgroundwhite#212830基本背景色title_fg/dark_title_fgblackwhite标题前景色title_bg/dark_title_bgwhite#212830标题背景色margin_bg/dark_margin_bg#fafbfc#212830边距背景色margin_fg/dark_margin_fg#aaaaaa#aaaaaa边距前景色removed_bg/dark_removed_bg#ffeef0#352c33被删除文本背景highlight_removed_bg/dark_highlight_removed_bg#fdb8c0#5c3539被删除文本中的词级高亮背景removed_margin_bg/dark_removed_margin_bg#ffdce0#5c3539删除侧边距背景added_bg/dark_added_bg#e6ffed#263834被新增文本背景highlight_added_bg/dark_highlight_added_bg#acf2bd#31503d被新增文本中的词级高亮背景added_margin_bg/dark_added_margin_bg#cdffd8#31503d新增侧边距背景moved_bg/dark_moved_bg#fffde7#003333被移动文本背景一处删除、另一处新增的相同文本moved_margin_bg/dark_moved_margin_bg#fff3b0#00495b移动行边距背景filler_bg/dark_filler_bg#fafbfc#262c36填充空白行背景margin_filler_bg/dark_margin_filler_bgnonenone边距中填充行背景默认继承 filler 背景hunk_margin_bg/dark_hunk_margin_bg#dbedff#0c2d6bHunk 标题栏边距背景hunk_bg/dark_hunk_bg#f1f8ff#253142Hunk 标题栏背景search_bg/dark_search_bg#444#2c599c搜索结果高亮背景search_fg/dark_search_fgwhitewhite搜索结果前景色select_bg/dark_select_bg#b4d5fe#2c599c选中区域背景select_fg/dark_select_fgblackwhite选中区域前景色Shortcuts键盘快捷键快捷键同样可在diff.conf中重映射源码中每个动作都带有默认按键说明。动作以shortcuts配置块下的映射形式定义主要动作与默认按键对照如下动作触发按键默认quitq、Escscroll_by 1/scroll_by -1j/Down、k/Upscroll_to start/scroll_to endHome/Endscroll_to next-page/prev-pagePgDn/Space/CtrlF、PgUp/CtrlBscroll_to next-half-page/prev-half-pageCtrlD/CtrlUscroll_to next-change/prev-changen/pscroll_to next-file/prev-fileShiftJ/ShiftKchange_context all/default/5/-5a///-start_search regex forward/backward//?start_search substring forward/backwardf/bscroll_to next-match/prev-match./、,/copy_to_clipboard/copy_to_clipboard_or_exity、CtrlC默认绑定中大量按键都带有--allow-fallbackshifted,ascii前缀表示当终端不提供完整键盘协议时可退化为shifted或ascii变体接收。命令行选项运行时还有如下命令行开关定义于 kittens/diff/main.py--context N变更之间显示的上下文行数typeint默认-1表示采用diff.conf中num_context_lines设置的值--config FILE加载额外的配置文件支持按type:file自动补全路径--override/-o namevalue以命令行覆盖单个配置项可多次指定例如-o backgroundgray。命令行参数要求恰好两个左右两个文件或目录同时 kittens/diff/main.go 会校验两者类型一致不能拿文件与目录对比并支持把命名管道FIFO读取到临时文件后再参与对比。一份可直接使用的示例 diff.conf以下是一个覆盖常用项、可直接放入 kitty 配置目录与kitty.conf同目录的diff.conf示例所有取值均为源码中的默认值## 对比行为 num_context_lines 3 diff_cmd auto word_diff_mode words mark_moved_lines yes sticky_header yes ignore_name .git ignore_name *~ syntax_aliases pyj:py pyi:py recipe:py replace_tab_by \x20\x20\x20\x20 ## 配色这里仅示例暗色方案的关键项 color_scheme dark dark_background #212830 dark_foreground #f8f8f2 dark_pygments_style github-dark dark_added_bg #263834 dark_removed_bg #352c33 dark_hunk_bg #253142若只覆盖个别项也可借助kitten diff -o 配置名值 file1 file2进行临时测试而无需改动配置文件。底层原理从 diff 算法到实现细节内建 anchored diff 算法当diff_cmd为builtin时kitty diff 使用 Go 标准库的 anchored diff 算法。源码 kittens/diff/diff.go 明确标注其派生自 Go 标准库internal/diff该算法寻找“唯一行”最少的插入与删除方案——即只在 old/new 中各出现一次的唯一行作为锚点来确定匹配区域因此不会把无关的空白行或右花括号误当作匹配输出通常比标准 diff 更清晰并且它保证O(n log n)复杂度避免了传统 Unix diff 最坏情况下的 O(n²) 时间开销。这一实现被一些系统称为 “patience diff”其命名含义是等待变少更快而非字面上的“耐心”。当设置为auto时程序会自动从可用的实现中挑选也可以显式选择基于 git 或系统diff命令的对比。事件循环与终端能力协商kittens/diff/main.go 完整展现了其运行管线加载配置load_config读取diff.conf、解析键盘快捷键、校验参数个数为 2、设置 diff 命令与明暗配色、初始化缓存解析左右路径然后进入基于 kitty TUI 事件循环的渲染阶段。在初始化时它会请求终端能力QueryCapabilities一旦确认终端不支持扩展键盘协议就返回形如 “This terminal does not support the kitty keyboard protocol…” 的错误明确说明依赖关系。目录对比、图片与异步高亮递归目录对比的扫描逻辑、文件集合构建与图片处理分布在 kittens/diff/collect.go、kittens/diff/render.go 等文件中目录扫描会应用ignore_name的忽略规则。语法高亮采用异步方式执行避免阻塞交互与滚动图片则借助 kitty 图形协议 在并排栏内显示。仓库中带有 kittens/diff/collect_test.go 与 kittens/diff/patch_test.go 等测试覆盖文件收集与补丁应用等核心逻辑可以作为理解行为与回归验证的参考。小结kitty diff 把“终端里的 diff”做到了视觉与速度的统一文档中的 20 余项键盘操作、递归目录/远端文件对比、异步语法高亮与图片显示加上可高度定制的配色、快捷键与 diff 实现使它成为日常查看 git 差异的高效工具而对diff_cmd、word_diff_mode、sticky_header等配置的深入理解配合 kittens/diff/main.py 与 kittens/diff/main.go 源码能让你在实际对比大量文件、代码评审或远程排障时真正得心应手。它的所有能力都建立在 kitty 的扩展协议之上这也解释了为什么只有 kitty 用户能享受这套体验。【免费下载链接】kittyIf you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based.项目地址: https://gitcode.com/GitHub_Trending/ki/kitty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表