Bash的自动完成功能很爽,它不知道免掉我多少记忆的负担,节约了多少键盘操作。 但是对于我们自己写的脚本也能够利用它的自动完成功能吗?回答是肯定的。下面以几个例子来说明。
程序员需要记忆很多东西,bash, vi, screen, svn都有很多命令和快捷键,偏偏我的记忆力不行,不时查看cheatsheet,每次都cd到某个目录,从一大堆文件中找到那个文件,然后再打开,这个过程显然很烦琐。所以我写了一个脚本,叫做quickref,它接收一个参数,例如bash, vi,然后就会打开对应的cheatsheet。
quickref:
#!/bin/bash
case $1 in
bash)
exo-open ~/dropbox/cheatsheets/bash/bash_cheat_sheet.pdf
;;
vi)
exo-open ~/dropbox/cheatsheets/vi_cheat_sheet.pdf
;;
# more...
esac
exo-open是xubuntu下的命令,它自动用文件关联的应用程序打开, 例如, pdf文件就会用evince打开。ubuntu下对应的命令是gnome-open。
如果只有bash, vi的cheatsheet,一切不成问题,但是当列表越来越长,问题就来,你不知道你的命令能够接受哪些参数,输入命令时你得考虑,我该输入什么呢?可能还得来回折腾几次,最坏的情况,你可能需要查看源代码才能确定你到底能输入什么。你可以将它们显示在出错消息中,这样可以节省一些功夫,但总不太好。我们可以利用Bash的自动完成功能,我不再担心会输入错误。
我们直接来看怎么做,建立一个文件quickref_completion, 输入以下内容:
_quickref_completion()
{
local cur
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($( compgen -W 'bash vi' -- $cur ))
return 0
}
complete -F _quickref_completion quickref
然后执行命令". quickref_complection",然后再在bash下输入"quickref ",然后再按Tab(或许得按两次Tab),你会发现bash自动列出所有匹配的結果,下面是我的机器上的显示結果:
$ quickref
bash vi
$ quickref
怎么实现的呢?其实很简单,_quickref_completion函数用来完成主要的功能,前三行用来得到用户当前的输入,全部补全的結果放在COMPREPLY数组中。这里补全的功能由compgen命令来完成,它完成的功能就是从单词列表中选出匹配给定前缀的所有单词,你最后在命令行下测试一下:
$ compgen -W "find fine hello"
find
fine
hello
$ compgen -W "find fine hello" fi
find
fine
最后complete命令用来注册自动补全函数,第一个参数就是自动补全的函数,后面的参数是应用这个补全函数的所有命令。执行quickref_completion的操作最好放在bashrc中去。
再一个例子,我经常用到命令"sudo apt-get install"命令,所以我给它定义了一个别名:"alias pkginstall='sudo apt-get install'",但这样不好的是,你不能再利用apt-get install的自动完成功能。另外我也定义了别名"alias pkgremove='sudo apt-get remove", 我为它们写了自动补全的函数:
_pkginstall_completion()
{
local cur
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $( apt-cache pkgnames -- $cur ) )
}
complete -F _pkginstall_completion pkginstall
_pkgremove_completion()
{
local cur
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $( dpkg -l | awk '{ print $2 }' | grep "^${cur}" ) )
}
complete -F _pkgremove_completion pkgremove
代码就不再解释了,很简单,至于用到的命令,不熟悉的在命令行下试试就知道了。
当然这里所介绍的只是十分简单,但于我已经够用了,至少到目前为止是这样。但要完成更加复杂的功能,例如对于不同的选项,使用不同的命令完成,例如apt-get install和apt-get remove的自动补全就不一样,你可能需要参考其它文章。/etc/complete.d/目录下有很多补全函数的实现,你可以拿来看一下。也可能参考官方文章
Programmable-Completion.
分享到:
相关推荐
bash进程会保存其会话中用户曾经执行的命令,以方便用户重复执行某个命令通过bash提供的历史命令文件来持久保存此前执行过的命令,用户由私有历史文件 登陆shell的时候,bash会自动读取~/.bash_history文件中所记录...
分配资料库包装/端口维护者评论Arch Linux AUR @ 2ion 通过pacman挂钩自动完成更新Gentoo Linux,Funtoo Linux 主线 @教练OpenSuSE 飞跃,风滚草 苹果系统自定义自制水龙头@ 2ion / mpv-bash-completion @ 2ion ...
将自动完成功能添加到npm脚本 终端命令来启用或禁用它(还原以前的PS1) 允许您动态地打开和关闭PS1的各个部分 带行号的PS2 自动完成git命令 显示当前分支和git状态(也可以自定义) 很多额外的别名(请查看...
自动完成 更新到EOSIO v1.8.6 更新到EOSIO v1.7.0(支持REX) 由于cleos使用的CLI11(用于c ++的命令行解析器)的限制,当前cleos不提供命令自动完成功能。 在此项目中,您可以对命令使用命令自动完成功能。 另外,...
BASH / ZSH自动完成的Symfony控制台应用程序 该软件包为基于Symfony控制台组件的应用程序提供了BASH和ZSH中的自动(制表符)完成功能。 如果配置为零,则此软件包允许完成可用命令名称及其提供的选项。 用户代码可以...
除其他外,它提供了nc函数,这些函数通过解析ncdump来汇总NetCDF文件,提供了用于处理SSH连接和维护与远程jupyter会话的连接的工具,并配置了FZF模糊自动完成和conda环境。 它还评估.dircolors.ansi以使工作站之间的...
Bash样式完成(在Cmd模式下为可选,在Emacs模式下为默认) Bash / zsh样式交互式历史记录搜索(CTRL-R) Emacs猛禽/杀死戒指 基于PowerShell令牌的“单词”移动和杀死 撤销重做 自动保存历史记录,包括在实时会话...
Arch Linux安装脚本(或alis)安装无人看管,自动化和自定义的Arch Linux系统。 这是一个简单的bash脚本,可以从原始Arch Linux安装介质启动后完全自动化Arch Linux系统的安装。 它包含与您键入的命令相同的命令,...
点文件 该存储库包含我的 。 内容 :包含默认资源。 : 配置文件。... .cdoCompletion.zsh : .cdoCompletion.zsh的CDO自动完成的定义。 .condarc : Conda Python软件包管理系统的配置文件。 .ks
Python : deoplete自动完成和MatchTagAlways功能必需。 Neovim Python模块: Deoplete自动完成功能必需。 Python Msgpack : Deoplete自动完成功能必需。 发行功能 默认配置:完整的默认设置,着重于仍可提供...
除了这些模式提供的关键字之外,SubEthaEdit还可以根据您当前打开的所有文本方便地自动完成。 脚本编写 模式可以提供自定义脚本以增强编辑体验。例如。用于十六进制颜色的颜色选择器,用于您的语言的棉绒或用于...
内容:自动为python CLI应用程序生成shell选项卡完成脚本 原因:速度与正确性。 诸如和类的替代缓慢且具有副作用 shtab : shtab处理argparse.ArgumentParser对象以为您的shell生成一个制表符完成脚本 输出以下选项...
单词自动完成(包括关键字和预处理器) 自动缩进 大括号,括号,引号的自动完成 语法高亮和自动完成支持: 纯文本 动作脚本 组装工 MASM GNU汇编器 美国宇航局 渐近线矢量图形语言 AutoIt脚本 AWK GNU AWK Bash ...
关于SingleSetup: SingleSetup是一个基于bash的脚本,该脚本只需一次单击即可在新安装的termux中加载许多必要且...ls$ bash install.sh现在,请确保您的Internet连接已打开,然后安装将自动开始安装成功完成后,您将在
我们的目标是至少自动完成所有新macOS系统设置的80% 。 盒子里装了什么? bash,curl,git,node,ruby,tmux,vim,brew,app,dev环境等的设置和配置-列表很多,因此请参阅完整的 。 强调 具有自动安装功能的...
使用Packer创建自定义Ubuntu AMI映像,然后在AWS中启动实例。 SSH密钥对创建 该密钥对将用于SSH到Ubuntu实例。 使用ssh-keygen创建一个名为packer_key的SSH密钥对。如果您使用的是Windows,则可以安装gitbash,然后...
使用 ruby 绑定和自动完成的 Vim 自定义 使用自定义 Zsh tmux(进入 tmux 后,使用 Ctrl-A 激活 tmux 模式) 安装 先决条件 zsh 混帐 多路复用器 vim 我已经用和进行了测试。 引导程序 启动和运行的最简单...
一个没有外部依赖bash的python REPL,带有实时IRC聊天和自定义文本编辑器。 用法 克隆此python3 shell.py并运行python3 shell.py 。 屏幕截图 壳 聊天 编辑 特征 所有基本的Shell命令。 Python代码解释。 彩色的...
pid控制器代码matlab CAS凉亭/传感器融合项目的存储库 凉亭 要求 Ubuntu 18.04 ROS旋律 发射凉亭 将cd ~/catkin_ws/src/提取到cd ...(按TAB几次以自动完成消息模板) GPS测量值发布到/drone/sensors/g
RPi CookStrap shell脚本框架,可以轻松引导和配置树莓派OS磁盘映像。...通过在./bootstrap.cfg中定义bash键/值对(必须与bootstrap.sh脚本位于同一目录中)来完成配置(即,“烹饪”图像的“食谱”)