Ssh

螢幕 - 退出 Vim 後的奇怪行為

  • January 30, 2018

我的配置螢幕遇到問題。

screen.rc的很簡單,看起來像這樣:

altscreen on
termcapinfo xterm ti@:te@

我想將螢幕配置為具有與直接使用 SSH 客戶端(如MobaXterm. 所以我想要實現的是:

  • 可以使用滑鼠滾動vim(不使用 set mouse a
  • 用滑鼠滾動終端輸出(不帶Ctrl+ A Esc
  • 退出vim和其他編輯器等後,我想查看我以前的命令,而不是vim輸出,也沒有我的螢幕被清除。

配置.vimrc(和類似的本地配置文件)也是不可能的,因為我正在使用螢幕連接到許多機器並且我無法.vimrc在所有機器上進行修改。

我發現實現這一切是不可能的。因此,通過我的這兩行,我.screenrc可以滾動終端輸出,但vim我必須使用鍵盤 - 好的。

所以,直奔問題。

當我關閉時,vim我得到了一個非常奇怪的行為。控制台的輸出就像打開之前一樣,vim所以這就是我想要的。但是提示位於視窗頂部,而不是在我的最後一個命令(正在執行vim)之後。所以我寫在一些以前的輸出之上。

我希望你明白。你知道如何解決嗎?任何幫助,將不勝感激。

我不知道這是否有意義,但是MobaXterm當我配置了螢幕時,我正在使用連接到虛擬機。也許它也與SSH有關,誰知道。

編輯:我也嘗試了另一個 ssh 客戶端Putty,它是一樣的

原來問題是由一條愚蠢的線路引起的.bashrc

TERM=xterm; export $TERM

所以在執行 screen 之後它有TERM=xterm而不是TERM=screen. 刪除此行後,問題消失了。

描述的症狀來自rc(恢復游標)轉義序列。仔細想想,問題的根源可能是vim:

  • 使用給定.screenrc的 ,screen程序模擬 xterm 備用螢幕功能。

  • 這是使用 terminfosmcuprmcup(termcaptite) 控制序列完成的

  • 當切換備用螢幕時,xterm (a) 保存游標位置,(b) 清除備用螢幕,(c) 顯示備用螢幕。

  • 當從備用螢幕切換時,xterm (a) 恢復正常螢幕的游標位置並 (b) 顯示正常螢幕。

  • 這些操作是在單個控制序列中完成的,而不是分開的。在終端描述中,您可能(infocmp 輸出)看到一個1049.

  • screen程序模擬這些操作。

  • 但是,xterm 不同的是,它不使用單個變數來保存/恢復游標位置:快速檢查表明,如果

    • 我保存游標位置(用tput sc),
    • 切換到/從備用螢幕(tput smcup
    • 後跟tput rmcup),最後
    • 恢復游標位置(tput rc),
    • 然後游標轉到保存的位置tput sc

vim – 和 vim 的外掛 – 可以發送轉義序列。似乎在 vim 退出期間的某些東西正在發送轉義序列以恢復游標。在這裡快速檢查一下,vim 表現正常(但配置和版本不同)。所以我會檢查外掛。

如果我正在調試這種情況,我會擷取發送到螢幕的字元(script例如使用)並查找最常用的序列rc

  • escape``7
  • escape``[``u

如果screen更接近地匹配 xterm 的行為會很好,但最終似乎存在vim發送意外保存/恢復游標序列的問題。

相關閱讀:

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