非程式員的GNU Emacs使用心得……Shell Mode 第6集 命令列縮寫

來源:互聯網
上載者:User

縮寫是個好東西。生活中的很多地方人們都喜歡用縮寫,又省時來又省力。Bash 也有自己形式的縮寫,就是 alias,但是用
alias總有很多不能如願的地方。怎麼不如願呢?前文我們常說的那些個大量機器,複雜系統,大量 profile
這樣的問題我們以後就不再重複了,經過前面那些文章的解釋,相信大家應該已經都很熟悉了。現在我在這裡講一些對多數人來說都很現實的問題,即便是在自己的
機器上面工作。

在還沒有大量使用 Emacs 的時候,一直有一個讓我很鬱悶的問題,是什麼呢?就是你定義了一個 alias
了之後呢,每次運行這條命令的時候,就只需要輸入這個 alias 的名字,然後斷行符號,這個命令就被 bash
解釋並運行了。看到這裡的時候,有沒有人想到了我說的問題究竟是什嗎?沒想到吧?就是你沒有機會替換,或者增減參數!定義了以後就是死的了!在前文裡面我
多次說過了,實際工作中面對的很多命令都是大同小異的,如果要給每一個稍有不同的命令都定義一個
alias,先不說定義的時候有多麻煩,就是你能不能把他們都記在心裡都是個問題。這樣的狀況也太糟糕了吧。。。

算了還是回到 Emacs 的 shell-mode 裡面過兩天清淨日子吧。呵呵。


個玩笑了。在 Emacs 的 shell-mode 裡面,我們不再使用 Bash 的 alias 來進行命令的縮寫,而是使用 Emacs 本身的
abbrev 功能,將常用的命令定義成 abbreviation。這些 abbreviation 在我們在 shell-buffer
當中輸入命令的時候,會像在其他 buffer 裡面的文字編輯一樣,擴充成我們所需要的命令內容。因為這個過程是完全發生在 Emacs 的
shell-buffer 裡面的,所以在敲下斷行符號將這條命令發送給 shell
的時候,我們可以進行任意的修改。讓我們看一個實際的例子吧,下面是我的工作當中非常常用的一個縮寫,叫做 strma ,這個縮寫擴充之後是一條這樣的命令

bin/itmcmd agent start


得注意的是這個不是一條完整的命令,它只是一個命令片段,在這個時候直接斷行符號是不能夠成功執行的。這個正是 Emacs abbrev 和 Bash
alias
最明顯的區別。通常在我使用這個縮寫的時候,我的目的都是為了在這個片段的基礎上,再加上各種不同的參數,最終變成一條適合特定需要的特定的命令。下面再
讓我們來看一看這個縮寫最終會擴充成為什麼樣的一些命令

bin/itmcmd agent start mc

bin/itmcmd agent -o QMA,QMB,QMC start mq

bin/itmcmd agent start lz sy hd cq qi

與此相對應的,還有一條非常常用的命令縮寫,stpma,這個縮寫擴充至後是這樣一條命令

bin/itmcmd agent stop

這同樣只是一個命令的片段。在實際使用的過程中這個片段會被填充成這樣的一些命令

bin/itmcmd agent stop mc

bin/itmcmd agent -o QMA,QMB,QMC stop mq

bin/itmcmd agent stop lz sy hd cq qi


麼樣?不錯吧?只需要記憶很少的命令縮寫,就可以輕鬆搞定各種不同的命令,這是 Bash 的 alias 所完全無法做到的。 並且在 Emacs
裡面還可以把這些命令縮寫定義成只在 shell-mode 裡可用,這樣同樣的縮寫名稱就可以在別的 mode
裡面擴充成其他的內容。畢竟,字母雖多,形象好記的組合并不很多。是不是呢?

那麼這個 abbev 有沒有自己的問題呢?其實也有。abbrev 擴充以後,在她的後面添磚加瓦是很順手的,但是如果中間的部分需要替換,那就很麻煩了。每天無數次的擴充一條命令,再把游標向前移動、移動、移動、移動,也是一件很鬱悶的事情。

解決這個問題,Emacs 還提供了一個 skeleton 的功能。skeleton 本身是一個非常強大的功能,在這裡我們只用一個最最簡單的部分,就是定義一個 abbrev 的同時,可以自訂擴充之後游標的位置。

比如說有這樣一條命令

bin/itmcmd support -t
tivvm273 -s NEW sy hd lz ux nt m6 mq mc
qi

日常使用的時候,每次不同的部分就是中間的 tivvm273
這樣的主機名稱,其他的地方都一模一樣。這樣的命令要是簡單的作為 abbrev 擴充以後,再把游標從 qi 後面一路遷移到 -t
後面,那還不得麻煩死。在這個時候就可以定義一個 skeleton,規定擴充完畢之後,游標位置就定位在 -t 的後面,這樣就直接輸入主機名稱就 OK
了。這樣就舒服了吧?

大家注意了嗎?上面代碼裡面的底線那個位置,就是擴充之後游標的位置,非常形象吧?這樣每次只要輸入 addappsupport 就可以擴充成這樣一條命令,並把游標自動定位到 -t 參數的後面。

bin/itmcmd support -t -s NEW sy hd lz ux nt m6 mq mc qi

最後再羅嗦一句,記得前段時間在網上查 alias 的時候,貌似看到 Bash 的文檔裡面提到現在推薦大家多用 function 來代替
alias功能。想想也是,alias 定義的局限性實在是太大了。但是換用 function 呢?雖然靈活的多了,但是相對 alias
定義的快速高效來說,又實在是複雜的多了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.