Linux下的命令行Shell因爲其歷史緣由(須要兼容沒有鼠標的設備如電傳打字機),每每並不自帶鼠標定位光標支持,這就形成一個比較麻煩的問題:若是我寫了一個很是複雜的命令,想要修改裏面的部份內容,再執行一次,就須要一直按下鍵盤上的方向鍵,找到想要替換的內容,狂按backspace
刪除,再回車執行。這一過程費時費力,且在服務器管理等存在延遲的狀況下常常出現方向鍵按太多,又得按回去的問題。本文將爲讀者介紹在zsh中安裝並配置mouse.zsh
插件,使終端支持鼠標定位,提高命令行操做效率的小技巧,以及綜合應用各類方法的最佳實踐。
本文原載於 未命名小站,由做者本人同步至SegmentFault,轉載請註明原做者博客地址或本連接,謝謝!
若是你是Shell/Emacs重度用戶,看完引言後,你也許會回答Ctrl+A
/ Ctrl+E
大法好,甚至可能會祭出 Meta+F
/ Meta+B
絕招,可這些快捷鍵每每仍是沒法精準定位到所需位置,依舊沒能擺脫重複操做。html
的確,部分Shell或窗口管理器如Bash/Tmux支持Vim模式,容許用戶使用Vim語法來進行替換/重複/搜索等操做,然而這一過程依舊沒法擺脫重複的擊鍵、陡峭的學習曲線與繁瑣的記憶。node
快捷鍵的複雜性沒法避免,但其實還有一種巧妙的方法能夠在不輸入快捷鍵的狀況下對上一次輸入的命令進行替換,變相知足咱們的需求。bash
假設這裏有一個命令:服務器
./server.sh --local-port=8008 --remote-port=1233 --name="server-8008-1233" --quiet --daemon --no-restart --enable-compression --log="./server-8008-1233.log"
咱們輸入了這個命令,結果發現local-port應該是8088而非8008,這時咱們不管是經過方向鍵仍是經過快捷鍵都很難便捷地一次性將8008修改成8088。但若是使用Bash內建的 !
語法配合sed,這一操做將會變得很是簡單:app
!:s/8008/8088/g
這時候Bash會另起一行,並當即將上次命令中的8008替換爲8088。學習
若是你的命令並不在上一次輸入,一樣不用擔憂,!
語法提供了豐富的參數可選,這裏簡單列舉兩項:ui
!-3:s/8008/8088/g
定位前面倒數第三次輸入的命令spa
!./server:s/8008/8088/g
定位最近一次輸入前綴爲 ./server
的命令操作系統
所有內容可參考 GNU Bash的文檔: https://www.gnu.org/software/bash/manual/html_node/History-Interaction.html#History-Interaction。
這種方法儘管巧妙,但其替換的本質依舊存在侷限性,有沒有更好的辦法能幫助咱們快速定位呢?插件
其實在鼠標發明之初是並無指針的,當時的『鼠標指針』只是命令行界面中一個閃爍的光標,操做系統容許用戶經過移動鼠標的方式來快速移動光標(如DOS中的命令行鼠標),實現更高效的操做。
隨着GUI的普及,咱們逐漸造成了『鼠標是爲圖形界面服務』的思惟定式,但若是追溯過往,其實會發現並不是如此。正如編輯文本時使用鼠標定位光標更方便,在命令行操做過程當中使用鼠標進行定位也是提高操做效率最簡單、最直接的方式。
比較惋惜的是,大多數終端模擬器或Shell並無自帶鼠標支持,但若是讀者們使用的是zsh
,有一個很好用的插件 mouse.zsh
能夠爲zsh新增鼠標支持,安裝方法以下:
wget http://stchaz.free.fr/mouse.zsh -O /usr/bin/mouse.zsh echo ". /usr/bin/mouse.zsh" >> ~/.zshrc echo "bindkey -M emacs '\em' zle-toggle-mouse" >> ~/.zshrc source ~/.zshrc
這時咱們按下 esc
& m
(不是同時按,是先按 esc
再按 m
) 就會進入鼠標模式(模擬VT200終端),這時終端就已支持使用鼠標定位,咱們能夠在命令的任意位置點擊鼠標左鍵進行定位,而後按下Ctrl+W
刪除光標前的單詞,最後再按一次 esc
& m
退出鼠標模式。這裏筆者再舉一個例子:
./server.sh --no-restrat --silent
假設筆者不當心把 --no-restart
輸入成了 --no-restrat
,這時咱們按下 esc
& m
,拿起鼠標點擊 --no-restrat
後的空格,並按下 Ctrl+W
刪除這個參數。
./server.sh --silent
接下來咱們輸入正確的參數:
./server.sh --no-restart --silent
再按下 esc
& m
,退出鼠標選擇模式,這時咱們就使用鼠標成功編輯了這一命令。
這裏有幾點須要注意:
esc
& m
仍是很累(畢竟要按兩個鍵),能夠將安裝命令中的 echo "bindkey -M emacs '\em' zle-toggle-mouse" >> ~/.zshrc
替換爲 echo "zle-toggle-mouse" >> ~/.zshrc
,但缺點是在部分不支持獨立編輯模式的終端下沒法正常使用鼠標進行框選。Terminal.app
,發現依舊沒法使用鼠標進行定位,請開啓自帶終端的鼠標報告功能(快捷鍵:Command
+ R
)。(方法2能夠配合方法1使用,利用鼠標報告功能的開關來區分框選與鼠標選擇模式)
\em
表明 esc
& m
,這是ECMA-48所規定的轉義序列表,你也可使用知足ECMA-48規則的其餘快捷鍵來觸發鼠標選擇模式。上面介紹了純命令行的不便之處,也介紹了使用鼠標進行快速定位的方法,但若是想問什麼方法更高效,實際上是沒有一個固定規則的,不一樣的方法各自有其適用之處,筆者我的針對以上三種編輯方法總結了一些最佳實踐:
在讀者實際操做過程當中所面臨的狀況可能比本文所描述或總結得更爲複雜,所以哪一種方法更好其實沒有一個定論,但在不一樣的狀況下綜合使用不一樣方法,必定能幫助讀者提高命令行操做效率,而本文主要介紹的鼠標定位主要仍是爲了填補部分場景下的空缺。但願本文能對讀者有所幫助、有所啓發。