這是一些比較雜亂的小東西們,任何一個都沒有辦法獨立成節,就把他們湊在一起羅嗦一下吧。按說這些亂七八糟的小東西們應該放到最後弄一個類似雜物箱之類的章節,但是鑒於這些亂七八糟的內容多數還是和曆史命令相關的東西,想想還是放到一起來說一下吧。
在上一節曆史命令編輯裡面提到了兩種命令的重複,一種是在複雜應用程式的不同執行個體之間的重複,另一種則是複雜的命令在不同的系統,不同的機器之間的重複。這後一種命令的重複使用 Bash 的曆史命令功能可就徹底的鞭長莫及了。畢竟 Shell 就是再強大,也只能做用在一台機器的一個session範圍之內。事實上即便是在一台機器上面,只要是在不同的 Shell session 之間,Bash 的曆史命令功能就已經變得無能為力了。
那該怎麼辦呢?其實並沒有什麼困難的。對很多人來說這都不是個問題,命令只要在 X Window 的不同 terminal 之間拷來拷去其實就OK了嘛。看起來很簡單。但是,對我來說,這種無數次的拷貝粘貼本身就是一個大問題。你沒有必要非得同意我的觀點,但是請想一想那日複一日龐大的數量,你就會多少體會到一些我的感受。那些一次兩次的拷貝粘貼和一萬兩萬的拷貝粘貼是完全不同的兩種感受。數量,數量可以變很多東西。。。。。。
所以我們尊重數量,我需要用 Emacs 來搞定這個問題。具體的辦法說白了也沒有什麼神奇的。畢竟還是需要進行拷貝粘貼的,這是一個逃脫不了的魔咒。我們唯一能做的就是想辦法讓 Emacs 去搞定這些煩人的勾當。
所以有了一個叫做 Jump 的擴充。Jump 是個非常可愛的傢伙。 很多時候當我在 tivhpi03 上面運行完了一條複雜的命令,為了避免在 tivvm273 上面把它再敲一遍,我會輸入 M-x jump,然後這條命令就會自己跳到 tivvm273 的 shell-buffer 裡面,並且成功的出現在當前 Shell 提示符的後面。
下面讓我們來看看 jump 的具體代碼。代碼其實很簡單,無非就是搞到這條曆史命令,然後自己跳到另一個視窗,再把命令貼上去就是了。原來我寫的是跳到另一個視窗之後,定位到 shell-buffer 的最下面,直接把命令貼到 Shell 提示符的後面去,後來為了更加通用( 事實上在非 shell-mode 的時候我也會經常用到 jump 命令),所以就把移動到最後面的代碼去掉了。通常在 shell-mode 的環境下,游標位置多數都是在當前 shell 提示符的後面的。所以影響也不大。
因為這條命令非常常用,我把這條命令綁定到了 Ctrl-c j 按鍵組合上。
再說另外一個事情,其實也是很有意思的一個問題,什麼問題呢?螢幕輸出。沒想到吧?不僅僅是曆史命令,我們還要關注曆史的輸出。為什麼呢?因為在軟體品質測試工作中,terminal 中輸出的內容,不僅僅是命令的執行結果,更是軟體品質問題報告裡的證據,是非常重要的內容。
說到這裡有人可能會想,重要就重要了,輸出就在那裡,看就是了嘛。但是清細想一下,真的就是看就行了這麼簡單嗎?那好,試著回答我的一個問題,當你剛剛 cat 了一個非常大的 log,然後又有人來找你需要看看你之前運行了某條命令的結果,你怎麼辦?向上滾屏的範圍裡面已經沒有要看的內容了,全部的容量都被那個 log 沾滿了,這個時候怎麼辦?其實這樣的狀況在軟體品質測試的工作中是相當平常的一個情境。當你發現應用程式出現了問題,肯定是要去查 log,甚至要翻看好幾份 log 才有可能找到問題出現的地方。
在這個時候,還是需要 Emacs shell-mode 出來幫忙。前文提到過,Emacs 首先是一個文字編輯器,文字編輯器裡工作空間就是各種形形色色的 buffer,shell-buffer 也是一個 buffer。這個 buffer 包含了在這個 shell session 裡面輸入的所有命令和輸出的所有資訊。所有是這裡的關鍵詞,cat 了一個 log 再也不會把之前的命令和輸出的資訊從原來 terminal 裡面衝掉了。當你一天的工作結束的時候,如果這些內容對你很重要,還可以像儲存一篇文章或者一篇代碼一樣,將 Emacs 的 shell-buffer 作為一個檔案儲存下來,以備後用。
說到這裡,讓我們再次回顧以下剛才提到的 log 問題。雖然現在不會在因為 log 的內容使得曆史命令和曆史輸出被從 terminal 裡面衝掉了,但是這些無窮無盡的 log 內容在這裡佔著空間也的確是一個比較礙事兒的東西,我們可不可以把它從螢幕上清理掉呢?其實 Emacs 早已想到了這個問題,Emacs 的 Shell-mode 提供了這樣一個命令,comint-delete-output,這個命令的作用就是把上一條命令的輸出全部都刪除掉。在 Emacs shell-mode 裡面這條命令通常被綁定在 Ctrl-c Ctrl-o 按鍵組合上。這樣當你看完了一個 log 以後,只需要輸入 Ctrl-c Ctrl-o 按鍵組合,就可以將那些礙事兒的輸出內容變成這樣一行內容
沒錯,就想上面顯示的那樣,由於這個命令的存在,即便是在 ls 了一個比較大的目錄之後,也可以使用 Ctrl-c Ctrl-o 按鍵組合將這些已經看過的內容刪除掉。從此你的螢幕將會變的非常乾淨,只有那些真正有價值的內容才會佔據螢幕的空間,也才會在儲存下來的 buffer 檔案當中佔有一席之地。
但是這個 Emacs 內建的命令和 Bash 的 ^ 命令一樣,存在一個作用範圍的問題。comint-delete-output 能夠刪除的僅僅限於剛剛執行過的那一條命令。換句話說,如果你在 cat 完 log 之後,又習慣性的執行了一條 ls -ltr, 然後你就會發現“一 切都晚了。。。”, comint-delete-output 再也無法刪除你想對付的 log 內容了。當然,當然,辦法總歸是有的,不就是一個 buffer 嗎?選中開頭,選中結束,然後把中間 delete 掉不就行了麼,跟其他所有的 buffer 沒有什麼區別嘛。說是這麼說,要真的天天這麼去作,那不是太麻煩了嘛。所以我就自己又擴充了一個新的命令。這個命令的作用就是刪除 comint-delete-output 無法搞定的“上上一條” 命令的輸出資訊。命令的名字叫做 some 只是因為當初擴充這個功能的時候還沒想好應該叫做什麼,然後忙了一段時間以後發現 some 這個命令已經用熟了,所以也就沒有再換名稱。