2016-08-04 57 views
0

我有一個如下所示的兩行提示。是否有像clear這樣的命令將清除屏幕,但保持這兩個行提示可見?用兩行提示清除終端屏幕並保持兩行可見

~/current/directory git-branch* 
$ echo 'hello... 
+0

清除保持多提示... – 123

+1

哦,你是對的。我正在使用C-l,它沒有那種相同的行爲。我認爲他們是一樣的。 – Joe

回答

0

短:不,沒有這樣的命令。

長:你可能寫一個腳本。這裏是對該主題的簡要介紹。

clear程序清除整個屏幕。你的shell會繪製一個新的提示(在新清除的屏幕的頂部)。但是,假設你想在命令完成之前清除屏幕上的部分,並返回到shell。

,您將使用支持從當前光標位置清除屏幕,這是terminfo capability ed結束的ANSI轉義序列最終端:

clr_eos     ed  cd clear to end of 
             screen (P*) 

所示infocmped=\E[J

你可以用它在腳本中,例如,使用tput

tput ed 

這是 「ANSI.SYS」 從ANSI標準不同的地區之一(實際上ECMA-48,看到8.3.29 ERASE IN PAGE) 。 ansi.sys清除整個屏幕,當它接收

printf '\033]J' 

有些人硬編碼到腳本這一點,並假設「ANSI.SYS」的標準相匹配。例如參見ncurses FAQ中的How do I get color with VT100?

注意到關於如何測試的評論:可能在提示下面的屏幕上沒有任何內容。因此,輸入tput ed可能看起來什麼都不做。如上所述,它在下清除光標。如果你想清除(2線)上方的提示,這是一個更復雜一點:

  • 保存光標位置
  • 向上移動光標兩行光標
  • 明確
  • 恢復光標位置。

如果您提示恰好是在屏幕的第一線,這可以使用光標位置報告檢測。但是,這要比措辭所預期的問題更復雜。假設上面還有空間:

tput sc 
tput cuu 2 
tput cub 999 
printf '\033[1J' 
tput rc 

定期printf而非tput用在這裏,因爲有該類型的擦除的定義沒有預定義的terminfo(或termcap中)的能力。

如果您想處理提示在終端頂部行開始的情況,您必須找到當前行number並決定是否執行上面的清除(或不清除)。

延伸閱讀:

+0

也不''輸入ed'或'printf'\ 033] J''正在'konsole'中工作。 – 2016-08-04 11:00:57

+0

'tput ed'和'printf'\ 033] J''都沒有在st(吮吸終端)中工作。這兩個命令都會返回。在xterm中,'printf'\ 033] J''掛起。 – Joe

+0

我不希望它能夠工作,因爲那是**'OSC J' **而不是**'CSI J' **。 xterm按預期處理它。從這一點開始,關於konsole和tput的評論需要一些澄清(konsole作品也如預期的那樣......)。 –