Gemini CLI 自定义命令的妙用

1. 前言

Gemini CLI 是 Google 推出的一个命令行工具,可以让你通过命令行与 Gemini 模型进行交互。

现在,我的很多编程场景都在使用 Gemini CLI 来完成。用 Gemini CLI 的时候总觉得有点束缚,每个项目只能配一个 gemini.md,想换个场景还得改来改去,太麻烦了!

不像 Cursor 可以配置多条 cursor rule,Gemini CLI 在一个工程中只能配置一条系统提示词,想设定多种场景的话只能都写到一个提示词中。这会导致提示词效果变差。

功夫不负有心人,在我翻遍了 Gemini CLI 的官方文档后,终于让我找到了一个完美的解决方案------自定义命令!💡

2. 认识一下"自定义命令"

Gemini CLI 提供一系列内置命令,帮助用户管理会话、自定义界面以及控制行为。这些命令以斜杠 / 开头。

Gemini CLI 内置了一系列命令,如/help/clear/copy 等。

官方文档是这么说的 📝: 自定义命令允许用户在 Gemini CLI 中将最常用的提示保存并重复使用为个人快捷方式。您可以创建特定于单个项目的命令,或全局适用于所有项目的命令,从而简化工作流程并确保一致性。

我们可以注意到, 利用自定义命令可以管理我们的提示词,正符合我的需求,因此我决定使用自定义命令来实现灵活的系统提示词。

3. 三步创建你的第一个命令

Gemini CLI 从两个位置发现命令,并按特定顺序加载:

  1. 用户命令(全局): 位于 ~/.gemini/commands/。这些命令在用户正在处理的任何项目中都可用。
  2. 项目命令(局部): 位于 /.gemini/commands/。这些命令特定于当前项目,可以检入版本控制以便与团队共享。

如果项目目录中的命令与用户目录中的命令同名,将始终使用项目命令。这允许项目使用特定于项目的版本覆盖全局命令。

命令的名称由其相对于 commands 目录的文件路径决定。子目录用于创建命名空间命令,路径分隔符(/\)将转换为冒号(:)。

  • ~/.gemini/commands/test.toml 中的文件变为命令 /test
  • <project>/.gemini/commands/git/commit.toml 中的文件变为命名空间命令 /git:commit

自定义命令定义文件必须以 TOML 格式编写,并使用.toml 文件扩展名。

  • prompt (字符串):执行命令时将发送给 Gemini 模型的提示。这可以是单行或多行字符串。
  • description (字符串):命令功能的简短单行描述。此文本将显示在 /help 菜单中命令旁边。如果省略此字段,将根据文件名生成通用描述。

下面我给一个示例,可以简单的看一下

toml 复制代码
description = "需求拆解助手"

prompt = "请帮我拆解这个需求:  {{args}} "

添加该文件后,就可以在 Gemini 中调用 /prdspliter 命令来拆解需求。

{{args}} 是 Gemini CLI 的占位符,表示用户在命令输入的全部内容。如果做简单的提示词管理,目前就已经足够了。

但是如果想做更复杂的逻辑,比如结合命令行工具等,应该怎么做呢?

4. 终极玩法:让自定义命令与Shell联动起来

您可以通过直接在 prompt 中执行 shell 命令并注入其输出来使命令具有动态性。这非常适合从本地环境收集上下文,例如读取文件内容或检查 Git 状态。

当自定义命令尝试执行 shell 命令时,Gemini CLI 现在会提示您确认,然后才继续。这是一种安全措施,可确保只运行预期的命令。

工作原理:

  1. 注入命令:prompt 中使用 !{...} 语法指定命令应在何处运行以及其输出的注入位置。

  2. 确认执行: 当您运行命令时,将出现一个对话框,列出 prompt 想要执行的 shell 命令。

  3. 授予权限: 您可以选择:

  • 只允许一次: 命令将只运行这一次。
  • 本会话始终允许: 命令将被添加到当前 CLI 会话的临时允许列表中,不再需要再次确认。* 否: 取消 shell 命令的执行。

CLI 仍然遵循全局的 excludeToolscoreTools 设置。

示例 (git/commit.toml):

此命令获取暂存的 Git 差异,并用它来要求模型编写提交消息。

ini 复制代码
# 文件路径: <project>/.gemini/commands/git/commit.toml
# 调用方式: /git:commit

description = "Generates a Git commit message based on staged changes."

# The prompt uses !{...} to execute the command and injectits output.
prompt = """
Please generate a Conventional Commit message based on the following git diff:

```diff
!{git diff --staged}
```

"""

当用户运行 /git:commit 时,CLI 首先执行 git diff --staged,然后用该命令的输出替换 !{git diff --staged},最后将完整的提示发送给模型。

小结

总而言之,Gemini CLI 的自定义命令绝对是个值得深挖的功能,它能极大地提升我们的工作流效率。

为了方便大家,我已经把文中提到的 git:commit 和其他几个我私藏的实用命令都整理好了,放到了 GitHub 仓库里。

gemini-cli-commands (github.com/codemilesto...)

欢迎大家前去"寻宝",也别忘了给我一个 Star/Fork/Issue 三连哦!你的每一个反馈都是我继续探索的动力~ ✨

参考资料

1\] Gemini CLI Commands ([github.com/google-gemi...](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fgoogle-gemini%2Fgemini-cli%2Fblob%2Fmain%2Fdocs%2Fcli%2Fcommands.md "https://github.com/google-gemini/gemini-cli/blob/main/docs/cli/commands.md"))

相关推荐
是乐谷7 分钟前
饿了么招java开发咯
java·开发语言·人工智能·程序人生·面试·职场和发展
Mory_Herbert13 分钟前
【李宏毅-2024】第六讲 大语言模型的训练过程1——预训练(Pre-training)
人工智能·语言模型·自然语言处理
lindawang19 分钟前
AI大模型提示词工程完全指南:从入门到精通
人工智能·llm
AORO202521 分钟前
三防平板+天通卫星电话,打通无人之境的通信经脉
大数据·网络·人工智能·5g·电脑·信息与通信
lindawang22 分钟前
在Mac上搭建本地AI工作流:Dify与DeepSeek的完美结合
人工智能·llm
javastart44 分钟前
谷歌推出Genie3:世界模型的ChatGPT时刻?
人工智能·chatgpt·aigc
云云3211 小时前
Lazada东南亚矩阵营销破局:指纹手机如何以“批量智控+数据中枢”重构运营生态
大数据·人工智能·线性代数·智能手机·矩阵·重构
fsnine1 小时前
数字图像处理基础——opencv库(Python)
人工智能·python·opencv
JXL18602 小时前
神经网络-LossFunction
人工智能·深度学习·神经网络
黑心萝卜三条杠2 小时前
LIDAR:用于结构裂缝多模态分割的轻量级自适应提示感知融合视觉曼巴
人工智能