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 string
var err error
if 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.Builder
for _, 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.Builder
for _, 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界面 - 提升交互体验