Skip to content

Latest commit

 

History

85 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

gg

让 man 文档为你而生长

gg 是一个像 man 一样的个人命令笔记查询工具。

把 Linux 命令笔记按 Markdown 存在本地目录,用 gg <命令> 直接在终端渲染; 查不到时可以交给 AI 生成一份并保存。

功能特点

功能 说明
查询 gg <命令> 读取并渲染对应笔记
列表 / 搜索 gg list 列出全部;gg search <词> 按文件名搜,-c 按正文搜
终端渲染 优先调用 glow,不可用时回退原始 Markdown
浏览器渲染 -b 打开排版好的页面:终端手册风格、代码高亮、深浅色自适应
编辑 / 删除 -e 用编辑器打开;gg rm <命令> 删除(会先确认)
AI 生成 未命中时生成笔记,支持 claude / codex / gemini 或自定义命令,也可关闭
相近建议 未命中时给出拼写相近的命令名
中英双语 --lang zh|en,帮助信息与全部提示均本地化

安装

# 安装到系统(推荐)
cargo install --path . --force

# 或只构建发布二进制
cargo build --release      # target/release/gg

快速开始

# 1) 建立笔记目录
mkdir -p ~/.config/gg/notes

# 2) 写一份笔记:文件名即命令名
cat > ~/.config/gg/notes/ls.md <<'EOF'
`ls`:显示目录中的文件及其属性信息。

- `-a`, `--all`:显示所有文件,包括隐藏文件
- `-l`:以长格式显示详细信息
EOF

# 3) 查询
gg ls

笔记目录里的 ls.md 对应 gg ls。

常用命令

gg ls                    # 查询 ls 的笔记
gg list                  # 列出全部笔记(终端下多列显示)
gg search grep           # 按文件名搜索
gg search -c 递归        # 按正文搜索,输出 `文件:行号: 内容`(内容取原文,保留缩进)
gg -b ls                 # 在浏览器中打开
gg -e ls                 # 用编辑器打开
gg rm ls                 # 删除(默认否定,回车 = 不删)
gg rm ls grep            # 一次删多个
gg show rm               # 显式查询(用于被同名子命令占用的命令名)

选项

选项 说明
--notes-dir <DIR> 指定笔记目录
-b, --browser 在浏览器中打开 Markdown
-e, --edit 在编辑器中打开笔记
-y, --yes 对所有询问自动回答「是」(含 AI 生成、保存与删除)
--set-editor <EDITOR> 设置默认编辑器并写入配置
--lang <LANG> 设置显示语言 zh / en 并写入配置

-b 与 -e 只修饰查询动作(gg <命令> 与 gg show <命令>),两者互斥: 同时给出、或用在 list / search / rm 上,都按用法错误退出(2),而不是静默 忽略其中一个。不带任何动作时(gg -b)照常打印帮助。

--set-editor 与 --lang 只写配置,不会吞掉同一次调用里的子命令: gg --lang en list 会先保存语言,再按英文列出笔记;单独使用(gg --lang en) 则只保存配置并确认。两者同时给出时按 --lang → --set-editor 的顺序应用, 因此两条确认信息都使用本次要求的语言。

--set-editor 的取值定位不到可执行文件时会当场提示,但仍会保存:运行时 会回退到环境变量或系统默认编辑器,所以「先设好、稍后再装」依然可用;提示只是 让拼写错误立刻暴露。纯空白取值表示清除编辑器配置。

笔记目录

优先级:--notes-dir > GG_NOTES_DIR > 系统配置目录下 gg/notes。

平台 默认位置
Linux ~/.config/gg/notes
macOS ~/Library/Application Support/gg/notes
Windows %APPDATA%\gg\notes

配置

配置文件:Linux/macOS 为 ~/.config/gg/config.toml,Windows 为 %APPDATA%\gg\config.toml。

language = "zh"           # 显示语言
editor = "hx"             # 默认编辑器,支持带参数,如 "code -w"

ask_before_ai = true      # 调用 AI 前询问
auto_save_ai = true       # AI 生成后落盘
ask_before_save = false   # 落盘前再问一次
ai_provider = "claude"    # claude / codex / gemini / none
# ai_command = "llm -m gpt-4o"   # 自定义 AI 命令行,优先级高于 ai_provider
ai_note_language = "zh-CN"
ai_timeout_seconds = 180  # AI 最长等待秒数,0 表示不限制

取值写错会在启动时直接报错并指出问题所在,不会静默降级。

环境变量

变量 说明
GG_NOTES_DIR 笔记目录
GG_CONFIG_DIR 配置根目录(显式覆盖平台默认位置,便于可移植部署)
GG_GLOW_BIN glow 路径,支持带参数:"glow -s dark -w 80"
GG_AI_BIN 替换 AI 可执行文件(保留预设参数);旧名 GG_CLAUDE_BIN 仍兼容
GG_EDITOR / VISUAL / EDITOR 编辑器,优先级依次降低
COLUMNS 覆盖 gg list 的列宽(默认按终端实际宽度,拿不到时按 80 列)
GG_DEBUG=1 输出调试日志,排查外部命令调用问题

AI 回退

未命中时不直接调用 AI,而是先检查后端是否可用,再询问:

$ gg rsyns
未找到命令 `rsyns`,推荐:
rsync
$ gg rsync
⠹ 正在生成 `rsync` 的笔记 [3s]
已保存笔记: ~/.config/gg/notes/rsync.md
用 `gg rsync` 查看
ai_provider 实际执行
claude(默认) claude -p --output-format text <提示词>
codex codex exec <提示词>
gemini gemini -p <提示词>
none 关闭 AI 回退

需要别的形态就用 ai_command,提示词默认追加为最后一个参数:

ai_command = "llm -m gpt-4o"
ai_command = "my-tool --flag {prompt}"    # 或用 {prompt} 指定位置

# Windows 路径含反斜杠,用 TOML 字面量字符串(单引号)免转义:
# ai_command = 'C:\Tools\my-tool.exe --flag'

自定义提示词

提示词内置在程序里;在配置目录放一份 AGENTS.md 即可整体替换(文件不存在或内容只有空白时用内置默认):

平台 位置
Linux ~/.config/gg/AGENTS.md
macOS ~/Library/Application Support/gg/AGENTS.md
Windows %APPDATA%\gg\AGENTS.md

文件里可用 {{command}}(命令名)与 {{language}}(输出语言)两个占位符:

为命令 `{{command}}` 输出一份简易的 Markdown 速查笔记。
先给一个可运行的示例代码块,再列 2~4 个最高频选项。输出语言 {{language}}。

非交互终端不会静默调用 AI:gg foo | less 或 gg foo > out.md 这类场景 没有用户可确认,会跳过 AI 并返回退出码 3。脚本里需要自动化就显式加 -y, 或把 ask_before_ai 设为 false。

退出码

退出码 含义
0 成功
1 运行时错误:命令行没问题,但操作没能完成(配置文件非法、文件不可写、外部命令失败等,stderr 有完整原因)
2 命令行用法错误:缺少参数、未知选项,或参数取值非法(如 --lang jp、含空格的命令名、空的搜索关键词)
3 没有产生任何结果:查询未命中、search 无命中,或操作因缺少确认而未执行

1 与 2 的分界不是「谁报的错」,而是错误来自哪里:命令行本身用错(含 gg 自己对参数取值的校验)是 2;命令行没问题、只是操作失败才是 1。因此 --lang jp 是 2,而配置文件里的 language = "jp" 是 1。

退出码 3 的原因写在 stderr(stdout 保持干净,便于管道与重定向):查询未命中会 附带相近命令名,search 未命中会区分是名称还是正文。

注意事项

  • 仅支持「单词命令名」,不能含空格,也不能含 /、\、:
  • 仅识别 .md 笔记文件
  • list、search、rm、show、help 是子命令名,不能作为普通查询命令名直接使用; 被占用的名字(典型是 rm)可以用 gg show <命令> 查询
  • gg rm 不可逆,非交互终端需显式 -y;若笔记目录在 git 仓库内会提示找回方式
  • gg search 的关键词不能为空(含只由空白组成),否则按用法错误退出(2)
  • 帮助信息与全部运行时提示均已本地化;但命令行用法错误(缺参数、未知选项等) 由 clap 生成,目前仍为英文

License

MIT,见 LICENSE。

About

让 man 文档为你而生长

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages