題 如何正確設置GNU Screen以在hardstatus中顯示當前正在運行的程序


在bash中,要在GNU Screen中顯示當前程序的名稱,hardstatus行只需要兩條配置行。 首先,告訴屏幕提示的結尾通常是什麼樣的,並在您坐在shell中時為窗口提供默認標題:

shelltitle“$ | bash”

接下來,在通常終止提示的字符之前,將此轉義序列放在PS1變量中 '$ ' 在這種情況下: \033k\033\\

這種技術很有用。 hardstatus窗口標題更新為當前正在運行的程序的名稱,然後在執行完成後立即切換回默認標題。但是,一個主要問題是這個轉義字符串本身沒有轉義,導致命令長於初始行的換行問題。

這很煩人,所以我開始尋找解決方案。事實證明,只需轉義前一個轉義序列就可以糾正換行: \[\033k\]\[\033\\\]

大!我的hardstatus窗口標題仍然更新為當前正在運行的程序的名稱,現在我的較長命令正確地換行到第二行。但是,在我的PS1中使用這個新的轉義序列,屏幕將窗口標題更新為我正在鍵入的實際命令,而不僅僅是當前程序執行後的名稱。

我想知道,有沒有人得到這個正常工作 - 即換行和正確更新hardstatus窗口標題?


3
2017-11-15 15:21


起源


我不確定我理解你的意思是“屏幕更新我正在輸入的實際命令的窗口標題,而不僅僅是當前程序執行後的名稱”。例如,如果你這樣做, echo test; less somefile 這將是 echo 它顯示為窗口標題而不是 less。這是你想要的嗎? less 顯示而不是? - Dennis Williamson
我試圖修復反斜杠序列的格式,請確保我做對了。請注意,在這種情況下預覽是一個小小的錯誤;反引號工作比 <pre>。像丹尼斯一樣,我不明白你想要達到的目的,你能舉個例子嗎? - Gilles
@Gilles:你有正確的反斜杠。 - Dennis Williamson
例如:如果我輸入'less somefile',那麼hardstatus中的gnu屏幕窗口標題將顯示為“less”。這是對的。但是,如果我輸入一個長命令,即'cat path / to / some / file >> / path / to / some / new_file && chmod 755 / path / to / some / new_file',當我輸入命令時gnu screen hardstatus窗口標題將包含while命令行,而不僅僅是'cat'或'chmod'。使用未轉義的序列並沒有發生這種情況,儘管這不是一個主要問題,但我希望能找到一種完整性的方法來補救它。 - johnny_bgoode


答案:


我不認為屏幕是更新該副本的正確位置。你的shell配置真的很容易。你可以定義一個 preexec() 函數在你的shellrc文件中發送它之前運行的詳細信息。您可以從那裡打印告訴屏幕更改當前窗口標題。我正在使用zsh,而不是bash,所以你的里程會有所不同,但我知道同樣的事情也是可能的。在我的zshrc文件中作為參考,我有這樣的事情:

# If running in screen, set the window title to the command about to be executed
preexec() {
    [ -n "$WINDOW" ] && print -Pn "^[k$2^[\\"
}

# If in screen, blank the window title when displaying the prompt
premd() {
    [ -n "$WINDOW" ] && print -Pn "^[k ^[\\"
}

實際上,在將命令顯示為標題之前,我會對命令進行一些清理。例如,您可以使用 print -Pn "^[k`echo $2|perl -pne 's!\s.*/! !g'|cut -c1-16`^[\\" 在上面的preexec()中顯示關於將要運行的內容的更清晰的信息。這剝奪了最後一個組件的路徑,並做了幾個忍者技巧。


4
2018-02-19 13:44