乐趣区

关于shell:给-zsh-自定义命令添加参数自动补全

有时我会自定义一些 zsh 命令,以便晋升某些高频操作的效率。本文记录我给一个自定义命令增加参数主动补全的办法。

场景

我自定义了一个 zsh 命令 gmt,执行 gmt <b2>,能够将以后所在的 git 分支 merge 到 <b2> 这个分支。

它具体实现以下工作:

  1. 切换到 git 分支 <b2>
  2. <b2> 分支更新到最新;
  3. 询问是否合并,输出 y 则进行分支合并。

也就是用一条命令实现一个 git checkout b2git pull origin b2git merge b1 这样的组合操作。

用了一段时间,能够省一些事,美中不足的就是有时候分支名称比拟长,只能手动输出,没有主动补全。

冀望成果

  1. 输出 gmt ,而后按 tab,主动提醒本地的所有 git 分支名称;
  2. 输出 gmt fe,而后按 tab,主动补全以 fe 结尾的 git 分支名称;

实现办法

在 zsh 配置文件中增加如下代码:

compdef _git_merge_to_comp git_merge_to

_git_merge_to_comp()
{
    local -a git_branches
    git_branches=("${(@f)$(git branch --format='%(refname:short)')}")
    _describe 'command' git_branches
}

注:git_merge_to 是一个自定义的函数,gmt 是这个函数的 alias。

这段代码的意思就是应用 _git_merge_to_comp 这个函数来给 git_merge_to 命令做主动补全,主动补全的候选列表是以后我的项目的所有本地 git 分支名称。

其中:

compdef_describe 等的用法,能够参考 zsh 的官网文档 Completion System。

git_branches=("${(@f)$(git branch --format='%(refname:short)')}") 的意思是,将 git branch --format='%(refname:short)' 命令的输入按行宰割后造成一个字符串数组,赋值给 git_branches 变量,这部分能够参考 How to properly collect an array of lines in zsh。

我的 zsh 配置都上传到了 https://github.com/mzlogin/co…,有须要能够参考下。

成果演示

参考

  • Completion System
  • How to properly collect an array of lines in zsh
退出移动版