Less

less 打開編輯器而不立即觸發終端中的重繪

  • December 22, 2018

我試圖切換到主要less在我只想閱讀程式碼時使用的工作流程,然後v在我想編輯文件時使用切換到編輯器。這是 OS X 上的 GNU,但我認為它可以推廣到其他系統。

如果我設置VISUALvim -u NONE使 vim 不讀取它的任何初始化文件,或者使用另一個像nanoorjoe或那樣立即啟動的編輯器,那麼在按下和讓文件出現在編輯器中ne之間沒有明顯的停頓。v


例如,這很好用:

$ previous-command > foo.txt
$ VISUAL='vim -u NONE' less foo.txt

查看文件less,滾動到感興趣的行並按下v,文件在裡面立即可見vim


只是為了說明這一點,如果我們設置VISUALsleep 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.txtvim 內部的內容。


只需單獨使用vim,無需額外的命令行參數,讀取文件並進行一些初始化工作。這需要幾分之一秒,但足夠長以使底層 shell 會話可見,如sleep 1; <VIM COMMAND>.

有沒有辦法以這樣一種方式將控制權從 轉移lessvim,以使底層的 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 無法知道這一點。)

另請參閱:如何在終端中配置螢幕恢復?

引用自:https://unix.stackexchange.com/questions/490431