gig-gitignore工具实战开发(五):gig add完善
文章目录
- gig-gitignore工具实战开发(五):gig add完善
- 🌐 GitHub模板支持
- 🔌 API模板支持
- 🖥️ TUI界面增强
- 功能特点
- 🚀 总结
gig-gitignore工具实战开发(五):gig add完善
✨ 前言: 在前几篇我们介绍了gig add的基础代码编写,本篇我们继续来完善gig add命令,重点介绍GitHub模板、API模板和TUI界面的实现。
🌐 GitHub模板支持
核心代码实现:
func handleAdd(languages []string, source string, update bool) {if source == "github" {var templateDir stringvar err errorif update {// 强制更新GitHub模板templateDir, err = ensureRemoteTemplatesAreCloned(true)if err != nil {fmt.Printf("无法更新 GitHub 模板:%v\n", err)return}} else {// 检查本地缓存home, err := utils.GetUserHomeDir()if err != nil {fmt.Println("查找用户主目录时出错:", err)os.Exit(1)}templateDir = filepath.Join(home, ".ciclebyte", "gig", "template_github")// 自动克隆如果不存在if !utils.FileExists(templateDir) {templateDir, err = ensureRemoteTemplatesAreCloned(false)if err != nil {fmt.Printf("无法准备 GitHub 模板:%v\n", err)return}}}}// ...合并模板内容逻辑...
}
使用
gig add Go Python -t github -u
可以确保获取最新的GitHub模板!
🔌 API模板支持
核心代码实现:
func getGitignoreFromAPI(languages []string) (string, error) {client := &http.Client{}var result strings.Builderfor _, lang := range languages {url := fmt.Sprintf("https://api.gitignore.io/templates/%s", lang)req, err := http.NewRequest("GET", url, nil)if err != nil {return "", err}resp, err := client.Do(req)if err != nil {return "", err}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {return "", err}result.WriteString(string(body))result.WriteString("\n\n")}return result.String(), nil
}
⚠️ 注意:API方式需要网络连接,离线环境下无法使用。
🖥️ TUI界面增强
功能特点
-
直观的差异对比:
- 左侧显示原始内容,右侧显示更新内容
- 红色标记删除的行(
-
) - 绿色标记新增的行(
+
)
-
便捷的导航控制:
Tab
/Shift+Tab
在视图间切换- 支持多种确认/取消方式
-
响应式布局:
- 自动适应终端大小
- 内容过多时支持滚动
# 使用TUI界面添加Go语言模板
gig add go --tui# 效果示意
+-------------------------------------------+
| 原始版本 更新版本 |
|+-----------------------------------------+|
|| + bin/ ||
|| + pkg/ ||
|| + *.exe ||
|+-----------------------------------------+|
核心代码实现:
func (dv *DiffViewer) ShowDiff(original, updated string) (bool, error) {// 创建左右文本视图leftView := tview.NewTextView()rightView := tview.NewTextView()// 生成差异内容dmp := diffmatchpatch.New()a, b, lineArray := dmp.DiffLinesToChars(original, updated)diffs := dmp.DiffMain(a, b, false)diffs = dmp.DiffCharsToLines(diffs, lineArray)// 渲染差异var leftBuilder, rightBuilder strings.Builderfor _, diff := range diffs {lines := strings.Split(diff.Text, "\n")for i, line := range lines {if i == len(lines)-1 && line == "" {continue}switch diff.Type {case diffmatchpatch.DiffInsert:rightBuilder.WriteString("[black:green]+ " + line + "[white:black]\n")case diffmatchpatch.DiffDelete:leftBuilder.WriteString("[black:red]- " + line + "[white:black]\n")case diffmatchpatch.DiffEqual:leftBuilder.WriteString(" " + line + "\n")rightBuilder.WriteString(" " + line + "\n")}}}// ...界面布局和事件处理代码...
}
🎮 体验优化:通过--tui
参数即可启用图形界面,比纯文本差异更直观!
🚀 总结
本次完善为gig add带来了三大增强:
- 🌐 GitHub模板 - 支持离线缓存和强制更新
- 🔌 API模板 - 提供最新内容的即时获取
- 🖥️ TUI界面 - 提升交互体验