[小技巧] 在zsh中使用鼠標定位光標,簡單直接,節省時間,提高命令行操做效率

Linux下的命令行Shell因爲其歷史緣由(須要兼容沒有鼠標的設備如電傳打字機),每每並不自帶鼠標定位光標支持,這就形成一個比較麻煩的問題:若是我寫了一個很是複雜的命令,想要修改裏面的部份內容,再執行一次,就須要一直按下鍵盤上的方向鍵,找到想要替換的內容,狂按 backspace 刪除,再回車執行。這一過程費時費力,且在服務器管理等存在延遲的狀況下常常出現方向鍵按太多,又得按回去的問題。本文將爲讀者介紹在zsh中安裝並配置 mouse.zsh 插件,使終端支持鼠標定位,提高命令行操做效率的小技巧,以及綜合應用各類方法的最佳實踐。
本文原載於 未命名小站,由做者本人同步至SegmentFault,轉載請註明原做者博客地址或本連接,謝謝!

0x01 現存方案1——快捷鍵大法

若是你是Shell/Emacs重度用戶,看完引言後,你也許會回答Ctrl+A / Ctrl+E 大法好,甚至可能會祭出 Meta+F / Meta+B 絕招,可這些快捷鍵每每仍是沒法精準定位到所需位置,依舊沒能擺脫重複操做。html

的確,部分Shell或窗口管理器如Bash/Tmux支持Vim模式,容許用戶使用Vim語法來進行替換/重複/搜索等操做,然而這一過程依舊沒法擺脫重複的擊鍵、陡峭的學習曲線與繁瑣的記憶。node

0x02 現存方案2——sed替換

快捷鍵的複雜性沒法避免,但其實還有一種巧妙的方法能夠在不輸入快捷鍵的狀況下對上一次輸入的命令進行替換,變相知足咱們的需求。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

  1. 經過索引定位
!-3:s/8008/8088/g

定位前面倒數第三次輸入的命令spa

  1. 經過前綴定位
!./server:s/8008/8088/g

定位最近一次輸入前綴爲 ./server 的命令操作系統

所有內容可參考 GNU Bash的文檔: https://www.gnu.org/software/bash/manual/html_node/History-Interaction.html#History-Interaction

這種方法儘管巧妙,但其替換的本質依舊存在侷限性,有沒有更好的辦法能幫助咱們快速定位呢?插件

0x03 使用鼠標快速定位

其實在鼠標發明之初是並無指針的,當時的『鼠標指針』只是命令行界面中一個閃爍的光標,操做系統容許用戶經過移動鼠標的方式來快速移動光標(如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 ,退出鼠標選擇模式,這時咱們就使用鼠標成功編輯了這一命令。

這裏有幾點須要注意:

  1. 若是以爲 esc & m 仍是很累(畢竟要按兩個鍵),能夠將安裝命令中的 echo "bindkey -M emacs '\em' zle-toggle-mouse" >> ~/.zshrc 替換爲 echo "zle-toggle-mouse" >> ~/.zshrc,但缺點是在部分不支持獨立編輯模式的終端下沒法正常使用鼠標進行框選。
  2. 若是你使用的是MacOS自帶 Terminal.app ,發現依舊沒法使用鼠標進行定位,請開啓自帶終端的鼠標報告功能(快捷鍵:Command + R)。
(方法2能夠配合方法1使用,利用鼠標報告功能的開關來區分框選與鼠標選擇模式)
  1. \em表明 esc & m,這是ECMA-48所規定的轉義序列表,你也可使用知足ECMA-48規則的其餘快捷鍵來觸發鼠標選擇模式。

0x04 最佳實踐

上面介紹了純命令行的不便之處,也介紹了使用鼠標進行快速定位的方法,但若是想問什麼方法更高效,實際上是沒有一個固定規則的,不一樣的方法各自有其適用之處,筆者我的針對以上三種編輯方法總結了一些最佳實踐:

1. 使用快捷鍵的場景

  • 須要編輯的內容在最開始(好比須要加一個sudo)
  • 須要馬上跳轉本行到最開始或最後
  • 在本行最開始,想要刪除整行內容
  • 須要刪除某個單詞或參數

2. 使用sed替換的場景

  • 須要重複舊命令,但新命令存在有規律的變化
  • 簡單的Typo(如輸錯參數)

3. 使用鼠標定位的場景

  • 須要重複舊命令,但新命令變化較多/較複雜
  • 複雜的Typo(如漏掉關鍵參數等)

在讀者實際操做過程當中所面臨的狀況可能比本文所描述或總結得更爲複雜,所以哪一種方法更好其實沒有一個定論,但在不一樣的狀況下綜合使用不一樣方法,必定能幫助讀者提高命令行操做效率,而本文主要介紹的鼠標定位主要仍是爲了填補部分場景下的空缺。但願本文能對讀者有所幫助、有所啓發。
相關文章
相關標籤/搜索