less
打開編輯器而不立即觸發終端中的重繪
我試圖切換到主要
less
在我只想閱讀程式碼時使用的工作流程,然後v
在我想編輯文件時使用切換到編輯器。這是 OS X 上的 GNU,但我認為它可以推廣到其他系統。如果我設置
VISUAL
為vim -u NONE
使 vim 不讀取它的任何初始化文件,或者使用另一個像nano
orjoe
或那樣立即啟動的編輯器,那麼在按下和讓文件出現在編輯器中ne
之間沒有明顯的停頓。v
例如,這很好用:
$ previous-command > foo.txt $ VISUAL='vim -u NONE' less foo.txt
查看文件
less
,滾動到感興趣的行並按下v
,文件在裡面立即可見vim
。只是為了說明這一點,如果我們設置
VISUAL
為sleep 1; vim
.$ another-previous-command > foo.txt $ VISUAL='sleep 1; vim -u NONE' less foo.txt
我們現在正在查看文件,然後我們按
v
編輯它。shell 會話現在再次可見一秒鐘,因此我們看到:
$ another-previous-command > foo.txt $ VISUAL='sleep 1; vim -u NONE' less foo.txt
第二個過去後,我們看到了
foo.txt
vim 內部的內容。只需單獨使用
vim
,無需額外的命令行參數,讀取文件並進行一些初始化工作。這需要幾分之一秒,但足夠長以使底層 shell 會話可見,如sleep 1; <VIM COMMAND>
.有沒有辦法以這樣一種方式將控制權從 轉移
less
到vim
,以使底層的 shell 會話不可見,甚至部分不可見?
Less 的
-X
選項關閉初始化和取消初始化終端,這就是導致閃爍的原因。很可能less
正在使用終端模擬器的備用螢幕功能。如果那是 Mac OS X 的 Terminal.app,您顯然可以在備用螢幕之間手動來回切換。(XTerm 也允許您手動切換)。現在,什麼是備用螢幕,為什麼很少使用它?歷史原因,真的。終端仿真器偽裝成終端——計算早期使用的實際硬體顯示設備(但現在非常少見)。程序幾乎完全通過輸出字元與終端仿真器對話;某些特殊字元被指定為控製字元,並執行諸如移動游標、清除螢幕、更改顏色等操作。與現代幀緩衝區不同,程序很難或不可能找出終端目前顯示的內容。(確實,如果可能的話,必須通過發送一個控制序列來完成,該控制序列會讓終端像使用者鍵入它一樣發回答案;實際上沒有其他方法可以從終端發送數據到程序)。
因此,如果您想在顯示其他內容後恢復螢幕(例如,查看您鍵入的命令),您需要終端來執行此操作。大多數終端模擬器允許您通過切換到備用螢幕來保存至少一個螢幕。您會注意到,當您(例如)
echo hello | less
在關閉 less 之後執行它時,您又回到了 bash 螢幕,沒有改變。那是因為 less 切換到備用螢幕並在那裡顯示“你好”;然後當你退出它時,它又切換回來。如果您執行echo hello | less -X
,則行為會大不相同(它還會跳過 init 的清屏部分,因此您會在提示後開始文件 - 嘗試使用 control-L 強制清屏並重繪)。並且當您退出較少時,您的 shell 歷史記錄將不再顯示。隨機旁注,
less -FX
是一個有用的組合。不管怎樣,所以你看到的閃光是這樣的:當 less 啟動編輯器時,它首先必須將終端返回到“正常”狀態——其中一部分是切換出備用螢幕。這就是你所看到的。(一旦 vim 啟動,它當然會立即切換回備用螢幕——但 less 無法知道這一點。)
另請參閱:如何在終端中配置螢幕恢復?