给 zsh 自定义命令添加参数自动补全

简介: 有时我会自定义一些 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/config-files,有需要可以参考下。

效果演示

图片

参考

  • Completion System

  • How to properly collect an array of lines in zsh

目录
相关文章
|
7月前
|
存储
201403-3 命令行选项
201403-3 命令行选项
|
7月前
|
Shell Docker 容器
mac终端命令补全设置(docker 命令补全)
mac终端命令补全设置(docker 命令补全)
157 0
|
存储 Shell 开发工具
转到zsh,第6部分–自定义zsh提示
您可能会花费很多时间(或浪费时间)来微调提示。这些修改是否真的可以提高您的生产率是一个问题。
656 0
转到zsh,第6部分–自定义zsh提示
zsh 使用通配符功能
zsh 使用通配符功能
315 0
|
Python
如何优雅地解析命令行选项(上)
随着我们编程经验的增长,对命令行的熟悉程度日渐加深,想来很多人会渐渐地体会到使用命令行带来的高效率。 自然而然地,我们自己写的很多程序(或者干脆就是脚本),也希望能够像原生命令和其他程序一样,通过运行时输入的参数就可以设定、改变程序的行为;而不必一层层找到相应的配置文件,然后还要定位到相应内容、修改、保存、退出……
161 0
|
Python
如何优雅地解析命令行选项(下)
随着我们编程经验的增长,对命令行的熟悉程度日渐加深,想来很多人会渐渐地体会到使用命令行带来的高效率。 自然而然地,我们自己写的很多程序(或者干脆就是脚本),也希望能够像原生命令和其他程序一样,通过运行时输入的参数就可以设定、改变程序的行为;而不必一层层找到相应的配置文件,然后还要定位到相应内容、修改、保存、退出……
278 0
|
Linux 开发工具 Python
vim设置python脚本自动补全
Linux VIM python 自动补全插件:pydiction Pydiction 可以是我们使用Tab键自动补全Python代码在Vim,是一款非常不错的插件。
2951 0