在命令行常常须要重复输入一些shell代码,例如用cd切换到某个目录、运行npm run local,或者git commit等。每次都完整地一个个字符地敲入这些命令仍是很麻烦的,这种时候就要寻找能够解决重复输入,提升效率的办法了。html
最原始的,固然是找一个文本文件,把平时常常敲入的命令存放在其中,每当须要运行这些命令的时候就打开文件选中内容复制一下,再到终端粘贴并运行,但这未免过于原始了。mysql
使用ctrl-r是一种不那么原始的方法。在终端中按下ctrl-r后,shell会等待进一步地输入,并根据输入从之前输入过的命令中找出匹配的一条。找到了本身所须要的命令行,直接敲击回车便可,效果以下git
PS:上面是使用了fzf以后的效果,因此在敲入回车后并不会当即执行所选中的命令。原生的ctrl-r命令不支持在不一样的位置上匹配输入字符,因此仍是推荐一试fzf的。github
alias相比于ctrl-r而言进化了一点,由于它毕竟再也不须要往命令行中塞入那么多字符了——它让终端用户能够用较短的内容来代替较长的内容。例如,我就给登陆我本地的MySQL的命令写了一个aliassql
alias myroot='mysql -u root -p*******'
并且alias更像是宏展开,因此能够在后面添加其它内容,以下图shell
在myroot以后输入的test和user_info都跟着myroot展开后的结果一块儿喂给了shell去执行。使用alias以后,每次只须要输入较短的myroot便可。npm
若是说alias是C语言里面的宏的话,那么shell所支持的函数就是C语言里面的函数了(这不是废话么)。alias始终不太适合所要输入的内容比较多的场景——定义也特别难写,而且alias没有输入参数可言,也不适合处理须要有为妙差别的重复内容的状况。shell函数很适合这种状况,例如,我在本地编辑完一个.sd文件后须要用sdedit将其转换为.png文件,方能上传到Confluence上贴到设计文档里,我但愿.png文件跟.sd文件有相同的basename,那么用下面这个shell函数能够减轻一些重复输入的劳动力app
# 根据.sd文件生成同名的.png文件 function sdpng() { basename=${1} /usr/local/bin/sdedit -t png -o ${basename}.png ${basename}.sd }
只须要我输入一次文件名便可,效果以下函数
Alfred带有一个叫作Snippets的特性spa
它跟上面所说的alias很类似,但它不是由shell本身处理悄悄展开的,它是显式地输入一长串的字符。好比说我定义了三个短语:gpd、gct,以及gpt,它们分别会展开为
git push -u origin develop git checkout test git push -u origin test
效果以下
Alfred的Snippets也跟alias同样是不能接受参数的,不过支持一些占位符,能够展开为一些特定模式的动态内容。一个比较有用的是{cursor}这个占位符,可让光标定位至此。例如我能够定义这样的一串展开结果
SELECT * FROM `user_info` WHERE `userId` = {cursor}\G
这样我敲入对应的短语后就能够正肯定位到WHERE语句,而后直接输入要查询的参数便可,效果以下
除了Alfred以外,还有其它的经过snippet提升输入效率的软件,好比aText,Dash,不过我没有实际地用过,就很少说了。
没有代码才是最快地输入代码的方式
【阅读原文】