shell自动补全功能:bash和zsh
首要一点:shell有多种,比如bash、zsh、csh、ksh、sh、tcsh等
因此,制作自动补全功能时,要先搞清楚,你使用的是哪种shell,各个shell制作方法是不同的,网上大部分介绍的是关于bash的。
定义补全脚本后,要重新打开终端或者先执行下脚本:source
一、bash:
涉及命令:
补全命令complete、筛选命令compgen、修改补全命令设置compopt
内置变量:
通过这些变量,可以获得当前命令的内容、位置等信息,以便判断下面应该出现的提示命令的内容
除了上面三个命令外,Bash还有几个内置变量来辅助补全功能,如下:
| variable | description |
|---|---|
| COMP_WORDS | 类型为数组,存放当前命令行中输入的所有单词 |
| COMP_CWORD | 类型为整数,当前输入的单词在COMP_WORDS中的索引 |
| COMPREPLY | 类型为数组,候选的补全结果 |
| COMP_WORDBREAKS | 类型为字符串,表示单词之间的分隔符 |
| COMP_LINE | 类型为字符串,表示当前的命令行输入字符 |
| COMP_POINT | 类型为整数,表示光标在当前命令行的哪个位置 |
帮助信息:
man complete
补全脚本位置(Mac):
每打开一个新的shell,都会把这个目录下的脚本执行一遍
/usr/local/etc/bash_completion.d
代码解读:
_god()
{
COMPREPLY=() # 为数组,名字必须是COMPREPLY,在给COMPREPLY赋值之前,最好将它重置清空,避免被其它补全函数干扰
local cur prev
_get_comp_words_by_ref cur prev
COMPREPLY=( $( compgen -W 'xiaomi noops blog' -- "$cur" ) )
return
}
complete -F _god god
_god()
{
COMPREPLY=(xiaomi noops blog)
return
}
complete -F _god god
查看已经有的命令补全:complete
最简单的使用方式:complete -W "192.168.1.1 192.168.1.2" ssh
这样在输入ssh 后,按tab可以提示+补全IP地址
参考:
https://mp.weixin.qq.com/s/nSje0zhcP2vAmBAH05g64w
http://noops.me/?p=1114
https://linux.cn/article-6301-1.html
二、zsh:
涉及命令:compctl
内置变量:没有bash的那些内置的变量,但是有个内置read函数,可以获取当前出现指令集、当前的指令内容、前一个指令内容等信息。
帮助信息:
通过这条命令查找zsh的内置函数,找到read的用法:
man zshbuiltins
read函数所用参数解释:
-A The first name is taken as the name of an array and all words are assigned to it.
-n Together with -c, the number of the word the cursor is on is read. With -l, the index of the character the cursor is on is read. Note that the command name is word number , not word , and
that when the cursor is at the end of the line, its character index is the length of the line plus one.
-c
-l These flags are allowed only if called inside a function used for completion (specified with the -K flag to compctl). If the -c flag is given, the words of the current command are read. If the
-l flag is given, the whole line is assigned as a scalar. If both flags are present, -l is used and -c is ignored.
man zsh
补全脚本位置(Mac):每个新的shell终端都会把这个脚本执行一遍,所以内容太多,一是占用内存,而是新的terminal启动慢
~/.zshrc
代码解读:执行下面这段代码,终端执行proxy命令,就可以看到提示信息
_proxy(){
local cur cword words # 定义变量,cur表示当前光标下的单词
read -cn cword # 所有指令集
read -Ac words # 当前指令的索引值
cur="$words[$cword-1]" # 当前指令值
if [ $cur = "proxy" ] # 根据当前不同指令返回对应的提示信息
then
reply=(start stop restart connect route help) # 必须是值reply,返回提示信息内容
elif [ $cur = "route" ]
then
reply=(add delete)
else
reply=()
fi
}
compctl -K _proxy proxy # -K 表示使用函数
参考:
https://github.com/johan/zsh/blob/master/Misc/compctl-examples
在.zshrc里加入如下语句:意思大概是自动加载fpath路径下的各种函数,比如自动补全函数。
fpath=(/usr/local/share/zsh-completions $fpath)
autoload -Uz compinit && compinit -u
autoload -U +X bashcompinit && bashcompinit
另外autoload/compinit/bashcompinit是zsh的builtin函数,可以使用man zshbuiltins查看帮助
三、brew search comple
这种模糊搜索可以查到很多工具的命令自动补全脚本:比如pip、bash、docker、zsh等

brew info bash-completion查看安装信息
四、python shell的自动补全
五、zsh启动优化
查看zsh启动时间:2.37s,还是很长的,是否可以优化到0.x秒,这样感觉就没有卡顿
time zsh -i -c exit
zsh -i -c exit 2.37s user 1.25s system 98% cpu 3.663 total
shell自动补全功能:bash和zsh的更多相关文章
- Python3设置在shell脚本中自动补全功能的方法
本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...
- 如何为 .NET Core CLI 启用 TAB 自动补全功能
如何为 .NET Core CLI 启用 TAB 自动补全功能 Intro 在 Linux 下经常可以发现有些目录/文件名,以及有些工具可以命令输入几个字母之后按 TAB 自动补全,最近发现其实 do ...
- Python-2.7 配置tab自动补全功能
作者博文地址:http://www.cnblogs.com/spiritman/ 之前一直使用shell编程,习惯了shell的 tab 自动补全功能,而Python的命令行却不支持 tab 自动补全 ...
- Python-2.7 配置 tab 自动补全功能
作者博文地址:http://www.cnblogs.com/liu-shuai/ 之前一直使用shell编程,习惯了shell的 tab 自动补全功能,而Python的命令行却不支持 tab 自动补全 ...
- gocode+auto-complete搭建emacs的go语言自动补全功能
上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功 ...
- notepad++代码自动补全功能
可以代码自动补全功能,默认他是没有开启这个功能的,在首选项->备份与自动完成 里面有自动完成这一个设置,可以设置单词补全,也可以设置函数补全,这样写代码就快多了
- Eclipse自动补全功能和自动生成作者、日期注释等功能设置
修改作者.日期注释格式:打开Windows->Preferences->Java->Code Style->Code Templates,点击右边窗口中的Comments,可以 ...
- Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件
本文介绍如何设置Eclipse代码自动补全功能.轻松实现输入任意字母均可出现代码补全提示框. Eclipse代码自动补全功能默认只包括 点"." ,即只有输入”." ...
- 【Qt编程】基于Qt的词典开发系列<十四>自动补全功能
最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项).这个自动补全功能十分常见,百度搜索关键词时就会出现.不过它们这些补全功能都是与你输入的进行 ...
随机推荐
- js字符串截取为数组
var str="hello,word,java,eclipse,jsp"; //字符串截取为数组 var strArr=str.split(","); for ...
- python 全栈开发,Day76(Django组件-cookie,session)
昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...
- java判断给定路径或URL下的文件或文件夹是否存在?
if (file.exists()) { 来判断这是不是一个文件. file.isDirectory() 来判断这是不是一个文件夹. 1.File testFile = new File(testFi ...
- hdu 1711( 模式串T在主串S中首次出现的位置)
Sample Input213 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 1 313 51 2 1 2 3 1 2 3 1 3 2 1 21 2 3 2 1 Sample Out ...
- POJ 2456 3258 3273 3104 3045(二分搜索-最大化最小值)
POJ 2456 题意 农夫约翰有N间牛舍排在一条直线上,第i号牛舍在xi的位置,其中有C头牛对牛舍不满意,因此经常相互攻击.需要将这C头牛放在离其他牛尽可能远的牛舍,也就是求最大化最近两头牛之间的距 ...
- Codeforces Round #341 (Div. 2) E - Wet Shark and Blocks
题目大意:有m (m<=1e9) 个相同的块,每个块里边有n个数,每个数的范围是1-9,从每个块里边取出来一个数组成一个数,让你求组成的方案中 被x取模后,值为k的方案数.(1<=k< ...
- Codeforces Round #428 (Div. 2)
终于上蓝名了,hahahahaha,虽然这场的 B 题因为脑抽了,少考虑一种情况终判错了,还是很可惜的.. B题本来过来1500个人,终判之后只剩下了200多个,真的有毒!!!! A - Arya a ...
- C++和java的区别和联系
今晚,数院的一个兄弟借我Java课本,顺便问了一句“Java和C++到底有啥区别啊”.一下子有点问蒙了,“啊额.....运行平台不同....” "一个在高层,一个在底层...." ...
- centos6.8 yum安装mysql 5.6 (完整)
一.检查系统是否安装其他版本的MYSQL数据 #yum list installed | grep mysql #yum -y remove mysql-libs.x86_64 二.安装及配置 # w ...
- Java并发编程快速学习
上周的面试中,被问及了几个关于Java并发编程的问题,自己回答的都不是很系统和全面,可以说是"头皮发麻",哈哈.因此果断购入<Java并发编程的艺术>一书,学习后的体会 ...