Bash 似乎處於特殊模式

Bash 似乎處於特殊模式

系統:帶有 XFCE 的 Debian 8,Cli:Konsole 版本 2.14.2(終端稱為“Konsole”->https://konsole.kde.org/

我的朋友要我幫他解決一個奇怪的問題。

有些按鍵有奇怪的行為。

例如,Shift + §使當前行僅顯示(arg: 0)(我們有一個瑞士鍵盤https://en.wikipedia.org/wiki/QWERTZ#/media/File:KB_Swiss.svg,您可以在左上角找到此鍵)

ö給定(arg: 6).等等...

我可以透過以下命令退出這種「模式」:

set -o vi
set +o vi

但我之前不是vi模式。據我所知。但似乎有些東西被「重置」了。問題是,如果我使用上面的兩個命令,我也會失去一些我想要的設定。

編輯:我忘記提及的是;在另一個終端模擬器上 - UXTerm- 行為是「正常」的。所以按照我想要的方式。但在XTerm我有同樣的行為Konsole

編輯2:正如所要求的:

user@myMachine:~$ bind -p | grep arg
"\M--": digit-argument
"\M-0": digit-argument
"\M-1": digit-argument
"\M-2": digit-argument
"\M-3": digit-argument
"\M-4": digit-argument
"\M-5": digit-argument
"\M-6": digit-argument
"\M-7": digit-argument
"\M-8": digit-argument
"\M-9": digit-argument
"\M-.": insert-last-argument
"\M-_": insert-last-argument
# universal-argument (not bound)
# vi-arg-digit (not bound)
# vi-yank-arg (not bound)
"\M-.": yank-last-arg
"\M-_": yank-last-arg
"\M-\C-y": yank-nth-arg
bioinf@ags-wav-debian-MandS:~$ set +o emacs
bioinf@ags-wav-debian-MandS:~$ bind -p | grep ö
bash: bind: warning: line editing not enabled

附加資訊:

user@machine:~$ locale charmap
ANSI_X3.4-1968

user@machine:~$ bind -v | grep meta
set convert-meta on
set enable-meta-key on
set input-meta on
set meta-flag on
set output-meta on

答案1

似乎一切都歸結為這樣一個事實:您的語言環境中的字元集是 ASCII。 ASCII 是 60 年代的美國字元集,是大多數現代字元集的共同點。

當未配置語言環境(LANG、LC_* 環境變數全部未設定)或將它們設為C或時,通常會發生這種情況POSIX

該字符集定義了 128 個字符,位元組值為 0 到 127。但 § 和 ° 則不然。

現在這些符號都在您的鍵盤上,當您在終端模擬器中鍵入它時會發生什麼?

如果您在字元集為 ASCII 的語言環境中啟動終端仿真器,則您將告訴終端模擬器,當您按下 時AXK_aX11 按鍵事件),它需要傳送aASCII 編碼中的字元編碼,即 0x61。但是當你按下Shift+§XK_degreeX11按鍵事件)時,它應該發送°字符的編碼,但ASCII中沒有這樣的字符,那麼它應該做什麼?

xterm並選擇發送iso-8859-1字元集中rxvt的編碼。°這是大多數西方世界的 8 位元字元集(擴展 ASCII 以涵蓋德語、法語、英式英語、西班牙語等語言中使用的大部分字元)。在 UTF-8 之前,這是最常用的字元集。

My konsole,Etermxfce4-terminal發送?每個非 ASCII 字元。

我的 gnome-terminal 和 terminator 發送°.

當收到像中這樣的(0xb0)bash的iso8859-1編碼時,它會做什麼?°xterm

我們已經告訴它字元集是 ASCII,因此 0xb0 對應於未知字元。

過去在美國,Ctrl+X用於輸入 0 到 31 的字元(控製字元)。在 ASCII 中,這將發送相應字元的低 5 位元。例如,Abeing 0x41abeing0x61Ctrl+A傳送 0x61 和 0x1f,因此 0x1(^A又稱 CA 字元)。同時將發送第 8 位元設定Meta+X的編碼。 ,會發送 0x61 | 0x80,即0xe1。按下將發送 0x30 | 0x80,即 0xb0 也稱為 M-0(非)字元。xa0x61Meta+AMeta+0

在 ASCII 中,0x0 -> 0x1f 用於電傳打字機時代的控製字符,其中大多數已不再使用,並且 0x80 到 0xff 也不再使用,因此這是一種輸入代碼的方法,可用於執行除輸入文字。例如,emacs 使用這些鍵作為編輯鍵,C-B字元將遊標向左移動一個字符,M-B(非)字符將遊標向左移動一個單字。

如今,由於大多數人使用透過使用位元組值 0x80 到 0xff 來擴展 ASCII 的字元集,因此這些字元集不再被普遍理解為元字元。Meta+X現在通常發送兩個字元:ESC 和 X 字元。

儘管如此,當在位元組值 0x80 到 0xff 不可能是字元的語言環境中時,當bash(實際上readline)從tty 裝置讀取位元組值(如0xb0)時,它會將其理解為M-0(預設情況下綁定到digit-argument,這解釋了你的arg: 0)。

這是convert-metareadline 配置中的設定。您會在 readline 文件 ( man 3 readline) 中發現,當 readline 偵測到字元集是 7 位元時,它會將其設定為on將那些 0xb0 位元組轉換為 ESC + 0。

如果您使用以下命令將其關閉:

bind 'set convert-meta = off'

(並且假設input-metaoutput-meta也是on)。然後你會發現按下°就會°顯示一個。但這將是 0xb0 iso8859-1 編碼,°應用程式將不知道該如何處理。

您需要做的是將區域設定修復為具有這些°字元的區域設定。如今,您應該只考慮 UTF-8,因為它涵蓋了所有字元並且得到了廣泛支援。

因此,請檢查您的桌面配置的國際化設置,並選擇最適合您的環境的設置,例如de_CH.UTF-8/ fr_CH.UTF-8/ it_CH.UTF-8(瑞士德語/法語/義大利語,使用 UTF-8 作為字元集)。

您可能需要登出並再次登入才能充分考慮到這一點。

某些登入管理員有時還允許您在登入時透過某些下拉式選單選擇區域設定。

相關內容