shell脚本自定义自动补全

前言

最近使用tmux+vim开发中遇到一个问题那就是能不能使用命令直接打开我的项目存放根目录 然后在该命令后面使用tab自动补全想要的目录名(项目文件夹名) 然后在指定的那个文件夹(补全后的那个项目文件夹)直接打开 我的tmux脚本(也可以是vim直接打开文件)。
比如 我输入myobj 然后按tab 会直接出现 我的项目文件夹 “项目1 项目2 …” 然后自动补全回车自动打开项目。tmux脚本网上一大把 这里就不发出来了。由于本人觉得自动补全比较有难度,所以下面把我的方案分享给大家。

先看结果

shell自动补全大法,拿去不谢!

1、创建 obj_complete.sh文件 填写内容如下

complete -F _myobj_complete_func myobj
_myobj_complete_func() {
    COMPREPLY=()
    command_name="${COMP_WORDS[COMP_CWORD]}"  #注意这里不能使用$1获取只能用 ${COMP_WORDS[COMP_CWORD]}
    completion_txt="text formal"
    COMPREPLY=($(compgen -W "${completion_txt}" -- ${command_name}))
    return 0
}

2、执行 source ./obj_complete.sh
3、输入 myobj (myobj后面要有一个空格才有效)按[tab][tab] 即可看到如下效果 注意这里的myobj是注册到了全局即使没有myobj这个命令也有效,但是直接回车会报myoba: command not found 但是补全功能是有效的
在这里插入图片描述

再探究竟

命令详解

complete -F _myobj_complete_func myobj
complete-F_myobj_complete_funcmyobj
执行complete方法使用-F参数调用_myobj_complete_func函数传入myobj参数
complete参数
参数类型说明
-obashdefault如果没有生成补全条目,就使用bash默认的其它补全。
-odefault如果没有生成补全条目,就使用“readline”默认的文件名补全。
-odirnames如果没有生成补全条目,就进行目录名补全。
-ofilenames告诉“readline”生成文件名,以便进行与文件名相关的处理,例如在目录名后面加上斜杠,引用特殊字符,去掉行尾的空格,目的是用于shell函数。
-onoquote告诉“readline”不引用文件名,默认会进行引用。
-onospace告诉“readline”在补全的名称后不添加空格,默认添加空格。
-oplusdirs生成补全条目之后,还会进行目录名补全并把结果添加到其它动作得到的结果中。
-Aalias别名,同选项“-a”。
-Aarrayvar数组变量名。
-Abinding“readline”键绑定名。
-Abuiltinshell内建命令名,同选项“-b”。
-Acommand命令名,同选项“-c”。
-Adirectory目录名,同选项“-d”。
-Adisabled不可用的shell内建命令名。
-Aenabled可用的shell内建命令名。
-Aexport导出的shell变量名,同选项“-e”。
-Afile文件名,同选项“-f”。
-Afunctionshell函数名。
-Agroup组名,同选项“-g”。
-Ahelptopic内建命令help支持的帮助主题。
-Ahostname主机名,从shell环境变量HOSTFILE中获取。
-Ajob作业名,同选项“-j”。
-Akeywordshell保留字,同选项“-k”。
-Arunning正在运行的作业名。
-Aservice服务名,同选项“-s”。
-Asetopt内建命令set的选项“-o”可用的参数。
-Ashopt内建命令shopt可接受的选项名。
-Asignal信号名。
-Astopped暂停的作业名。
-Auser用户名,同选项“-u”。
-Avariable所有的shell变量名,同选项“-v”。
-Ccommand在子shell中执行命令,并把其结果作为补全条目。
-Ffunction我们现在用的 在当前的shell环境中执行函数function,执行时,参数“$1”表示那个参数正在进行补全的命令名,参数“$2”表示补全的名称,参数“$3”表示补全的名称前面的单词,表示结束执行时,从数组变量COMPREPLY中获取补全条目。
-Gglobpat使用文件名扩展模式globpat进行扩展以生成可能的补全条目。
-Pprefix在所有的选项应用到补全结果后,在结果前添加前缀prefix。
-Ssuffix在所有的选项应用到补全结果后,在结果后添加后缀suffix。
-Wwordlist使用特殊变量IFS中的字符拆分单词列表wordlist,并扩展拆分后的每个单词,结果中与待补全单词匹配的条目就是补全条目。
-Xfilterpatfilterpat是进行文件名扩展时使用的模式,它作用于通过前面的选项和参数生成的补全列表,并把每个与过滤模式匹配的条目删除,模式中前导的叹号表示否定,这时会删除与过滤模式不匹配的条目。
COMPREPLY=($(compgen -W "${completion_txt}" -- ${command_name}))
COMPREPLYcompgen-W“${completion_txt}”${command_name}
将执行的结果赋值给环境变量COMPREPLY执行compgen命令使用compgen的-W参数补全的字符串集合唤起补全的命令名称
compgen 参数说明
参数类型说明
-Ffunction执行shell 函数,函数中生成COMPREPLY作为候选的补全结果
-Ccommand将 command 命令的执行结果作为候选的补全 结果
-Gpattern将匹配 pattern的文件名作为候选的补全结果
-Wwordlist我们现在用的 分割 wordlist 中的单词,作为候选的补全结果
-p[name]列出当前所有的补全命令
-r[name]删除某个补全命令
内置变量
变量名说明变量类型
COMP_WORDS存放当前命令行中输入的所有单词Array
COMP_CWORD当前输入的单词在COMP_WORDS中的索引Int
COMPREPLY候选的补全结果Array
COMP_WORDBREAKS单词之间的分隔符String
COMP_LINE当前的命令行输入字符String
COMP_POINT光标在当前命令行的哪个位置Int
注意

如需【参数不同时出现】请参考如下博客:
linux shell中的命令自动补全(compgen complete)与 命令行参数解析

这种方法只针对当前终端会话有效,如果关闭终端打开其他终端即刻失效。
如果想要全局生效请自行研究如何添加到系统环境变量中。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱折腾的小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值