在命令行常常須要重複輸入一些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,不過我沒有實際地用過,就很少說了。
沒有代碼纔是最快地輸入代碼的方式
【閱讀原文】