Bash

在 shell 中處理 nbsp 字元

  • September 16, 2021

當我使用“alt-gr”字元後跟一個“空格”字元時,我經常會錯過我的輸入,而不是輸入“非中斷空格字元”,即 nbsp。

管道命令範例:mount |<space>tailvsmount |<nbsp>tail 最後一個命令將觸發錯誤(注意尾部..." tail" command unfindable...命令名稱之前的可視空間,實際上是一個 nbsp 字元)。

所以我找到了一個非常適合我的解決方案,可以簡單地中和 nbsp 字元:

setxkbmap -option "nbsp:none"

但是這種變化立即獲得了整個系統,並且為了證明,在 LibreOffice Writer 中,如果我想在必須保持分組的兩個單詞之間添加一個 nbsp 字元,這不起作用。

從過去開始,由於那個該死的角色,我浪費了很多時間來確定無法正常工作的命令或腳本或服務無法啟動的原因。

所以我問自己是否有解決方案使中和僅限於外殼(控制台、終端、vty、tty 等)?在 bash 或其他 shell …

你能告訴我這個該死的 nbsp 角色在 shell 中的角色嗎?何時何地使用它以及用於什麼目的?我們失去了什麼不使用它?

另一個建議:我們可以通過帶有顏色的圖形字元來顯示它,而不是中和它嗎?

正如 Kamil 讓我意識到的那樣,NBSP 功能在將近 95% 的時間裡都不會為我服務。所以我可以禁用它,對於剩下的 5%,我將不得不實現一個獨特的更新檔來允許我為所有需要的應用程序插入這個字元。

前言:為了確定要向您介紹的內容相同,對我而言,PTS 控制台和 TTY 控制台之間的區別是什麼。PTS 是我們從桌面環境打開的 GUI 控制台(圖形),TTY 是我們使用ctrl-alt-Fn組合打開的 CLI(命令行) (n 代表會話編號,通常在 1 之間和 7、7 預設保留給 X11 圖形會話)。

從 X11 環境中禁用 NBSP 字元

因此,根據我自己的搜尋(見上文),我可以從我的 X11 環境中禁用 NBSP 字元。由於 X11 是圖形環境,禁用必須在圖形環境中執行。

所以我建議在自動啟動腳本中實現它(對我來說來自 XFCE DE):

user@host:~$ cat <<EOF > $HOME/.config/autostart/setxkbmap_no_nbsp.desktop
[Desktop Entry]
Encoding=UTF-8
Version=0.9.4
Type=Application
Name=No NBSP
Comment=Disable NBSP key
Exec=/usr/bin/setxkbmap -option "nbsp:none"
OnlyShowIn=XFCE;
StartupNotify=false
Terminal=false
Hidden=false
EOF

重定向 Libre Office Writer 的 NBSP 快捷鍵

有時我需要從 Libre Office Writer 插入 NBSP 字元,但由於它被禁用(見上文),我仍然必須找到插入此字元的方法。

我建議使用Ctrl-Shift-space進行替換。

所以對於宏(在此處可用:工具 → 宏 → 組織宏 → LOdev Basic → 我的宏 > 標準 > 模組 1 > 編輯):

REM  *****  BASIC  *****

' Based on : https://ask.libreoffice.org/t/special-characters/1089/3
Sub InsertNBSP
Dim oDoc as variant
 oDoc = ThisComponent
Dim oCurrentController as variant
 oCurrentController = oDoc.getCurrentController()
Dim oTextViewCursor as variant
 oTextViewCursor = oCurrentController.getViewCursor()
Dim oText as variant
If IsEmpty(oTextViewCursor.Cell) Then
 oText=oTextViewCursor.Text
Else
 oText=oTextViewCursor.Cell.Text
End If
' NBSP unicode : https://www.compart.com/en/unicode/U+00A0
oText.insertString(oTextViewCursor,_
 chr(clng("&H00A0&")),false)
End Sub

注意:請注意 NBSP unicode 程式碼是 U+00A0 並且在我的情況下,生成的程式碼寫在$HOME/.config/libreoffice/4/user/basic/Standard/Module1.xba

對於鍵綁定(工具 → 自定義… → 鍵盤),我們將使用Ctrl-Shift-space與名為InsertNBSP的宏函式綁定

注意:在我的情況下,生成的關聯寫在$HOME/.config/libreoffice/4/user/registrymodifications.xcu


從 vim 中顯示一些字元(包括 NBSP)

基於這個來源,我找到了一種方法來顯示vim(這是我的偏好文本編輯器)中所有重要的字元(在我的例子中)。這在 TTY 控制台中很有用,因為沒有什麼能阻止輸入 NBSP。

重要提示:根據我們是從PTS還是TTY控制台訪問 shell,我們可以使用 unicode 字元(在第一種情況下)或部分(在第二種情況下,但顯然可以使 TTY 支持完整的 unicode - 不是測試)。

先決條件:在添加以下配置行之前,請確保已安裝vim

# See more here : https://vimhelp.org/options.txt.html#%27listchars%27
user@host:~$ mkdir .vim
user@host:~$ echo -e "set list\nset listchars=tab:\>\ ,trail:·,nbsp:?" >> $HOME/.vim/vimrc

成績:

  • 選項卡將顯示所有選項卡以區分空格組,它們將被替換為大於 (>)
  • trail將顯示一行末尾的所有尾隨空格,它們將被中間點 (·) 替換;要輸入此 Unicode,請參見下文
  • nbsp將顯示在大多數情況下將無用的所有 NBSP 字元(不是說從不),它們將被問號 (?)
  • 雖然不推薦這樣做,因為它只能從 PTS 控制台工作(除非我們設法從 TTY 集成完整的 unicode 支持),但可以使用一些更有意義或異國情調的 unicode 字元;例如選項卡可以由 ⇥ 和 nbsp 由“☠”組成(見下文)

使用 PTS 控制台中的 unicode 字元

重要提示:此方法適用於我的配置,但我不知道它是否適用於任何地方

要鍵入製表符(請參閱下面的其他程式碼):

  • 從外殼(來源):ctrl-shift-u 21e5
  • 來自 vim(來源):ctrl-v u 21e5

來自 PTS 的 Unicode 字元:

從 TTY shell 控制台禁用 NBSP 字元

最後一個未處理的情況是 TTY 控制台。正如@Kamil 建議我的那樣,可以在 $HOME/.bashrc 文件中添加以下行來禁用 NBSP:

user@host:~$ echo -e "bind '\"\302\240\":\" \"'" >> $HOME/.bashrc

總結

現在我們可以禁用 X11 中的 NBSP 字元,因此也可以在 PTS中禁用 PTS bash shell 和vimsetxkbmap -option "nbsp:none"(為了使持久性,我在位於 的自動啟動腳本中實現它$HOME/.config/autostart)。我們也可以使用bind '"\302\240":" "'in禁用 TTY bash shell $HOME/.bashrc。我們可以警告在 TTY中使用 NBSP(和其他有問題的字元)和vimlistchars並在$HOME/.vim/vimrc. 最後,我們總是可以在 Libre Office Writer 中添加一些想要的 NBSP 字元(這也取決於 X11,因此阻止了 NBSP),將 NBSP 快捷鍵重定向到另一個組合鍵。

最後,我會說所有不同的環境案例都沒有得到處理,但我認為這裡所說的是為其他案例找到方法的一個很好的起點。

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