重複輸入類似的命令的幾種方法

在命令行常常須要重複輸入一些shell代碼,例如用cd切換到某個目錄、運行npm run local,或者git commit等。每次都完整地一個個字符地敲入這些命令仍是很麻煩的,這種時候就要尋找能夠解決重複輸入,提升效率的辦法了。html

最原始的,固然是找一個文本文件,把平時常常敲入的命令存放在其中,每當須要運行這些命令的時候就打開文件選中內容複製一下,再到終端粘貼並運行,但這未免過於原始了。mysql

使用ctrl-r翻出歷史命令

使用ctrl-r是一種不那麼原始的方法。在終端中按下ctrl-r後,shell會等待進一步地輸入,並根據輸入從之前輸入過的命令中找出匹配的一條。找到了本身所須要的命令行,直接敲擊回車便可,效果以下
ctrl-r的效果git

PS:上面是使用了fzf以後的效果,因此在敲入回車後並不會當即執行所選中的命令。原生的ctrl-r命令不支持在不一樣的位置上匹配輸入字符,因此仍是推薦一試fzf的。github

使用alias

alias相比於ctrl-r而言進化了一點,由於它畢竟再也不須要往命令行中塞入那麼多字符了——它讓終端用戶能夠用較短的內容來代替較長的內容。例如,我就給登陸我本地的MySQL的命令寫了一個aliassql

alias myroot='mysql -u root -p*******'

並且alias更像是宏展開,因此能夠在後面添加其它內容,以下圖
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
}

只須要我輸入一次文件名便可,效果以下
shell函數的效果函數

使用Alfred的Snippets功能

Alfred帶有一個叫作Snippets的特性
Alfred的Snippets特性spa

它跟上面所說的alias很類似,但它不是由shell本身處理悄悄展開的,它是顯式地輸入一長串的字符。好比說我定義了三個短語:gpd、gct,以及gpt,它們分別會展開爲

git push -u origin develop
git checkout test
git push -u origin test

效果以下
Alfred的Snippets自動展開的效果

Alfred的Snippets也跟alias同樣是不能接受參數的,不過支持一些佔位符,能夠展開爲一些特定模式的動態內容。一個比較有用的是{cursor}這個佔位符,可讓光標定位至此。例如我能夠定義這樣的一串展開結果

SELECT * FROM `user_info` WHERE `userId` = {cursor}\G

這樣我敲入對應的短語後就能夠正肯定位到WHERE語句,而後直接輸入要查詢的參數便可,效果以下
cursor佔位符的效果

除了Alfred以外,還有其它的經過snippet提升輸入效率的軟件,好比aTextDash,不過我沒有實際地用過,就很少說了。

後記

沒有代碼纔是最快地輸入代碼的方式

閱讀原文

相關文章
相關標籤/搜索