首要一点: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的更多相关文章

  1. Python3设置在shell脚本中自动补全功能的方法

    本篇博客将会简短的介绍,如何在ubuntu中设置python自动补全功能. 需求:由于python中的内建函数较多,我们在百纳乘时,可能记不清函数的名字,同时自动补全功能,加快了我们开发的效率. 方法 ...

  2. 如何为 .NET Core CLI 启用 TAB 自动补全功能

    如何为 .NET Core CLI 启用 TAB 自动补全功能 Intro 在 Linux 下经常可以发现有些目录/文件名,以及有些工具可以命令输入几个字母之后按 TAB 自动补全,最近发现其实 do ...

  3. Python-2.7 配置tab自动补全功能

    作者博文地址:http://www.cnblogs.com/spiritman/ 之前一直使用shell编程,习惯了shell的 tab 自动补全功能,而Python的命令行却不支持 tab 自动补全 ...

  4. Python-2.7 配置 tab 自动补全功能

    作者博文地址:http://www.cnblogs.com/liu-shuai/ 之前一直使用shell编程,习惯了shell的 tab 自动补全功能,而Python的命令行却不支持 tab 自动补全 ...

  5. gocode+auto-complete搭建emacs的go语言自动补全功能

    上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功 ...

  6. notepad++代码自动补全功能

    可以代码自动补全功能,默认他是没有开启这个功能的,在首选项->备份与自动完成 里面有自动完成这一个设置,可以设置单词补全,也可以设置函数补全,这样写代码就快多了

  7. Eclipse自动补全功能和自动生成作者、日期注释等功能设置

    修改作者.日期注释格式:打开Windows->Preferences->Java->Code Style->Code Templates,点击右边窗口中的Comments,可以 ...

  8. Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件

    本文介绍如何设置Eclipse代码自动补全功能.轻松实现输入任意字母均可出现代码补全提示框.   Eclipse代码自动补全功能默认只包括 点"."  ,即只有输入”." ...

  9. 【Qt编程】基于Qt的词典开发系列<十四>自动补全功能

    最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项).这个自动补全功能十分常见,百度搜索关键词时就会出现.不过它们这些补全功能都是与你输入的进行 ...

随机推荐

  1. 随机生成三个数(break用法)

  2. Linux mount 修改文件系统的读写属性

    有时候要在某个文件夹下添加和删除文件时,显示 "read only filesystem",说明该文件系统是只读的不能修改.使用 mount –o remount,rw / 命令可 ...

  3. laravel console - 自定义命令

    在改造一个支付流程,新的流程加入了一个新的数据表字段,但是这个新的字段需要通过计算来填充,所以为了兼容历史数据,必须将已有的数据行重新计算一遍该字段. 这时使用 laravel console 命令就 ...

  4. 性能测试二十五:redis-cli 命令总结

    常用命令dbsize:查看redis中的kv数量 keys *:查看redis中所有的keyset key_1 v_1:新增一个key_1,包含v_1get key_1:查看key_1中的内容del ...

  5. js中常见的数组排序算法-冒泡排序和选择排序

    reverse( )  数组逆序   // reverse() 数组逆序 var arr = ["边境牧羊犬", "德国牧羊犬", "金毛" ...

  6. 《转》Pragma: no-cache 对性能的影响

    做了下go和java的http性能的简单比较服务端直接输出字符串使用JMeterwindows下  2000的并发,测试结果很出乎意料,go不会这么差吧 研究了半小时,原因如下tomcat的servl ...

  7. canvas绘制简易动画

    在canvas画布中制作动画相对来说很简单,实际上就是不断变化的坐标.擦除.重绘的过程 1.使用setInterval方法设置动画的间隔时间. setInterval(code,millisec) s ...

  8. Spring之hello world(Spring入门)

    spring各个版本中: 在3.0以下的版本,源码有spring中相关的所有包[spring功能 + 依赖包] 如2.5版本: 在3.0以上的版本,源码中只有spring的核心功能包[没有依赖包] ( ...

  9. jsp统计页面访问量和刷访问量的简单使用

    ~Jsp可以进行简单的页面访问量统计,当然也可以使用Jsp刷访问量. 1:第一种使用全局变量<%! int i=0;%>进行页面的访问量统计,只有新打开一个浏览器才可以进行统计. 2:第二 ...

  10. WP8 调用webservice 错误 The remote server returned an error: NotFound 解决

    本人出错是由于本地的IIS不能被局域网其它机器访问导致的,如果你所用的本机IIS 也不可被其它机器访问,则可按照本文进行设置   具体操作时需要在防火墙设置中添加 入站规则   具体步骤如下: 1.控 ...