我正在運行 Ubuntu 14.04 並使用虛擬終端之一(TTY[1-6],可透過 Ctrl-Alt-F[1-6] 存取);我想將遊標的外觀從明顯的預設值(閃爍的下劃線)永久更改為閃爍的框。我可以暫時更改它,但當某些應用程式運行時它會不斷重置。
最初,TTY 會話中的遊標樣式是閃爍的底線。我發現我可以使用以下命令將其更改為閃爍的框:
printf '\e[?8c'
這會更改終端中的遊標並反映在 emacs 或 elinks 等程式中。所以我將上面的命令放入我的 .bashrc 中。
然而,某些應用程式似乎會將遊標樣式恢復為閃爍的下劃線,並且即使在退出這些應用程式後,這種情況仍然存在。我可以重新發出上述命令、取得 .bashrc 或登出並重新登錄,將遊標樣式重設為閃爍框。
例如,考慮以下 3 個應用程式(tmux、emacs、elinks)如何影響遊標樣式:
- 多工器:遊標樣式立即設定為閃爍下劃線,該樣式在 tmux 內運行的所有應用程式中保持不變,並且退出 tmux 後更改仍然存在。上面的 printf 指令在 tmux 中不起作用。
- emacs:遊標樣式是我運行時處於活動狀態的樣式,然後在退出 emacs 時樣式更改為閃爍的下劃線。
- 電子連結:遊標樣式是我執行時處於活動狀態的樣式,且遊標樣式在退出 elinks 時不會變更。
我應該注意到,我有emacs 設定來將遊標樣式(在emacs 內)設置為一個框,並且雖然我在tmux 中搜尋了設定遊標樣式的設置,但除了tmux 手冊頁中的條目之外,我找不到任何內容,該條目狀態:
tmux understands some extensions to terminfo(5):
[...]
Cs, Csr
Change the cursor style. If set, a sequence such as this may be used to change the cursor to an underline:
$ printf '\033[4 q'
If Csr is set, it will be used to reset the cursor style instead of Cs.
不幸的是,我不明白如何“設定 Cs”,並且如上所述,我嘗試發出 printf 命令來設定 tmux 內的遊標樣式,但無濟於事。
另一個有趣的注意事項是,執行 X 終端模擬器(例如 XFCE4 Terminal)時不會出現遊標樣式變更的問題。這似乎只發生在 TTY 中。
我似乎無法找到有關其他遇到此問題的人或上述應用程式中可能導致問題的設定的任何資訊。是什麼導致了這個問題?
答案1
終端功能並非適用於所有終端,可能會因 tmux 版本而異。我看到 Debian 7 上的 tmux 1.6 中引用的描述。
手冊頁中給出的範例看起來像DECSCUSR
,它是透過xterm
以下方式支援的補丁#2522009 年。XTerm 控制序列:
CSI Ps SP q
Set cursor style (DECSCUSR, VT520).
Ps = 0 -> blinking block.
Ps = 1 -> blinking block (default).
Ps = 2 -> steady block.
Ps = 3 -> blinking underline.
Ps = 4 -> steady underline.
Ps = 5 -> blinking bar (xterm).
Ps = 6 -> steady bar (xterm).
要使用它們,您可以使用 ncurses 的 tic 修改 terminfo 條目,例如,
infocmp -x >foo
vi foo
tic -x foo
新增這一行(與其他功能一樣,附有一個前導選項卡):
Cs=\E[%p\sq, Csr=\E[0\sq,
但是,檢查 tmux 2.1 的源代碼,它不再讀取那些 terminfo 功能,並且已修改為使用Cs
和Cr
設定顏色(在舊版本中使用Cc
和完成Cr
)。新版本具有內建邏輯,DECSCUSR
無需 terminfo 擴充功能即可識別。
基於 VTE 的終端(例如 XFCE 終端)可能(取決於版本)實現DECSCUSR
,但 Linux 控制台不太可能實現這一點,因為它僅實現 VT220 的子集,而DECSCUSR
來自VT520
終端(VT220 的超集)。
您將看到與其他應用程式(例如 emacs)的差異,因為DECSCUSR
與其他遊標樣式功能(例如閃爍遊標功能)重疊,使用terminfo 中的cvvis
和功能進行設定或重設:cnorm
xterm
CSI ? Pm h
DEC Private Mode Set (DECSET).
Ps = 1 2 -> Start Blinking Cursor (att610).
但是,您似乎想要修改 Linux 控制台(也稱為虛擬控制台)中的遊標外觀。 DECSCUSR
那裡沒有影響。
讓遊標成為閃爍區塊全部有時,您必須變更您正在使用的終端描述中的遊標外觀功能。這些是civis
(使遊標不可見),cnorm
(使遊標“正常”外觀)和cvvis
(使遊標非常可見):
- 將這兩個選項都
\e[?8c
放在「linux」條目中將告訴使用該條目的 emacs 等程式使用閃爍框遊標。 - tmux 也讀取終端條目,查看
cnorm
和civis
。 - 另一方面,elinks 是硬編碼的,忽略終端資料庫。在快速閱讀其原始程式碼時,我沒有看到任何重置終端或修改遊標外觀的轉義序列。
由於您正在使用tmux
,您可能還需要修改xterm
(以便在其中運行的應用程式tmux
使用該遊標樣式)。但首先測試一下:如果你必須,您可以將\e[?8c
與現有cnorm
字串結合起來,因為xterm
忽略\e[?8c
.