Terminal

從控制台複製時的尾隨空格

  • November 4, 2019

這是我偶爾會遇到的這種煩人的行為:當您在控制台中用滑鼠選擇文本(即複製它)時,粘貼它,然後意識到每行末尾都有額外的空格。那是,

line 1                                                                          
line 2                                                                          

代替

line 1
line 2

因此,每行末尾不只有一個空格。

我無法可靠地重現該問題,也找不到答案。我相信對於某些軟體,它只會在一段時間後才會顯現出來。

但我剛剛注意到,當我在 中打開同一個文件時vim,首先從控制台,然後從tmux,在前一種情況下效果很好。而不是在後一個。考慮TERM=xterm-256color在控制台和TERM=screen-256colortmux,我的猜想是它與終端沒有正確執行,或者沒有使應用程序正確執行有關。我想這是一個相當模糊的猜想。所以,第一個問題是,“到底是什麼原因造成的?”

另一個是,“我該怎麼做?” 最壞的情況是文件位於遠端位置。我曾經在本地複制它並gedit最近打開它。現在我應該可以選擇在新控制台中打開它(因為我主要在tmux會話中工作),然後從那裡複製。這可以做得更簡單嗎?

當我vimtmuxwith執行時TERM=xterm-256color vim,它的行為很奇怪。就像在沒有文字的地方不繪製背景一樣。而且對我來說改變變數似乎不太好TERM(讓軟體認為它正在與其他終端打交道)。

編輯本地文件時,我通常使用:!gedit %.

如果應用程序在該位置顯示空格,則從終端選擇和複製時,您將在行尾有空格。應用程序可能會顯示空格以擦除之前的內容。終端具有刪除整行或刪除游標右側字元的命令;應用程序根據他們認為最有效的方式在該空間和顯示空間之間進行選擇。例如,如果您在提示符下鍵入一些內容,然後按 Backspace,則應用程序(例如 shell)可能會用空格覆蓋最後一個字元。

如果您有 X11 連接,則可以使用xselxclip將文件複製到本地剪貼板。

實驗上,Vim 似乎很努力地不顯示以空格結尾的行(即使緩衝區包含以空格結尾的行)。因此,如果您沒有 X11 連接,則可以選擇從中複製。

另一種方法是在複製後進行後處理:

xsel | sed 's/  *$//' | xsel

這實際上是幾個問題,沒有一個答案比瀏覽有趣的部分更重要:

  • 當您在控制台中用滑鼠選擇文本(即複製它)時,粘貼它,然後意識到每行末尾都有多餘的空格。
  • 當我使用 TERM=xterm-256color vim 從 tmux 執行 vim 時,它的行為很奇怪。

大多數終端(如 xterm)儲存您可以螢幕上選擇的數據。它背後沒有隱藏的部分告訴終端應用程序打算填充背景。

應用程序通過移動游標、寫入文本(可能包括實際空格或終端呈現為空格的選項卡)和擦除部分螢幕來更新螢幕。

擦除是一個特殊問題(用於選擇/粘貼),因為許多終端(例如 xterm)會用目前顏色填充螢幕的擦除區域(終端描述中的背景顏色擦除 (bce) 功能)。但與此同時,已擦除區域不再有字元儲存在螢幕的這些位置。使用螢幕表示的終端將允許您選擇除已擦除區域之外的所有內容。(作為一種特殊情況,您的終端可能已經擦除了被文本包圍的區域,它會假裝這些區域是供選擇的空間)。

所有這些都很麻煩,很久以前 xterm 提供了一個忽略尾隨空格的功能。大多數其他終端不提供。而且由於它是一個選項,如果您碰巧執行 xterm,它可能不會被打開。大多數複製 xterm 功能的終端開發人員不會複製選項。

轉到 tmux:它不支持 bce 功能。它的開發人員決定不這樣做。所以在 tmux 中執行的普通應用程序會產生尾隨空白。當您覆蓋終端描述時,它會混淆 tmux,因為它不知道 vim 真的假設背景將使用目前顏色清除。你只是得到擦除。沒有顏色。

另一方面,GNU screen 的開發人員不久前決定支持該功能。它是可選的…

進一步閱讀:

如果您設置 highlightSelection,您可以看到被選中的文本,包括任何尾隨空格。清除螢幕(或一行)會將其重置為不包含空格的狀態。當應用程序將它們寫入螢幕時,某些行可能包含尾隨空格。但是,您可能不希望粘貼帶有尾隨空格的行。如果此資源為真,xterm 將從選定的文本中刪除尾隨空格。它不會影響導致換行的空格,也不會從您的選擇中修剪尾隨換行符。預設值為“假”。

實現新的資源**trimSelection**,它允許 xterm 從選定的行中修剪尾隨空白。這不會影響突出顯示。

這個更新檔修復了我長期抱怨的一個問題:xterm 的選擇沒有清楚地顯示正在選擇的內容(根據 David 的要求,它由資源控制,預設為舊行為)。

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