Bashは特別なモードになっているようです

Bashは特別なモードになっているようです

システム: Debian 8 (XFCE 搭載)、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 モードではありませんでした。しかし、何かが「リセット」されているようです。問題は、上記の 2 つのコマンドを使用すると、必要な設定もいくつか失われることです。

編集:言及し忘れたことですが、別のターミナル エミュレータでは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

この文字セットは、バイト値が 0 から 127 までの 128 文字を定義します。sh 言語を構成し、ほとんどのコマンド名に使用されている文字はすべて ASCII です。ただし、§ と ° は ASCII ではありません。

これらの記号がキーボード上に表示されたら、ターミナル エミュレーターで入力すると何が起こるでしょうか?

文字セットが ASCII であるロケールでターミナル エミュレーターを起動すると、 を押したときにA( XK_aX11 キー押下イベント) a、文字のエンコードを ASCII エンコード (つまり 0x61) で送信する必要があることをターミナル エミュレーターに指示することになります。しかし、 を押したときにShift+§( XK_degreeX11 キー押下イベント)、° 文字のエンコードを送信する必要がありますが、ASCII にはそのような文字がないので、どうすればよいでしょうか。

xtermそして、 iso-8859-1 文字セットでrxvtエンコードを送信することを選択します°。これは、西洋世界のほとんどの 8 ビット文字セットです (ドイツ語、フランス語、イギリス英語、スペイン語などの言語で使用されるほとんどの文字をカバーするように ASCII を拡張します)。UTF-8 以前は、これが最も一般的に使用されていた文字セットでした。

My konsoleEtermおよびすべての非 ASCII 文字をxfce4-terminal送信します。?

私の gnome-terminator と terminator は、UTF-8 エンコードを送信します°

bashのようにiso8859-1エンコードされた°(0xb0)を受け取った場合xterm、どうすればよいですか?

文字セットは ASCII であると伝えたので、0xb0 は既知の文字に対応しません。

昔の米国では、Ctrl+Xは 0 から 31 までの文字 (制御文字) を入力するために使用されていました。ASCII では、対応する文字の下位 5 ビットが送信されます。たとえば、Aの場合、0x41は0x61 と 0x1f が送信されるため、0x1 ( 、別名 CA 文字) が送信されます。一方、は8 番目のビットが設定されたのエンコードが送信されます。の場合、 は0x61 | 0x80 が送信されるため、0xe1 が送信されます。 を押すと、0x30 | 0x80 が送信されるため、0xb0 (M-0 (非) 文字とも呼ばれます) が送信されます。a0x61Ctrl+A^AMeta+Xxa0x61Meta+AMeta+0

ASCII では、0x0 -> 0x1f はテレタイプライター時代の制御文字に使用されていましたが、そのほとんどは現在では使用されていません。また、0x80 から 0xff は使用されていないため、これはテキスト入力以外の用途に使用できるコードを入力する方法でした。たとえば、emacs ではこれらを編集キーに使用し、C-B文字はカーソルを 1 文字左に移動し、M-B(非)文字はカーソルを 1 単語左に移動します。

現在では、ほとんどの人が 0x80 から 0xff までのバイト値を使用して ASCII を拡張する文字セットを使用しているため、これらの文字はメタ文字として一般的には認識されなくなりました。Meta+X代わりに、ESC 文字と X 文字の 2 つの文字が送信されるようになりました。

それでも、バイト値 0x80 から 0xff が文字になる可能性がないロケールでは、bash(実際には) が tty デバイスから 0xb0 のようなバイト値を読み取ると、それを M-0 (デフォルトでは にバインドされているため、 の説明になります)readlineであると理解します。digit-argumentarg: 0

これは、convert-metareadline 構成の設定です。readline のドキュメント ( man 3 readline) には、readline が文字セットが 7 ビットであることを検出すると、on0xb0 バイトを ESC + 0 に変換するように設定することが記載されています。

これをオフにするには:

bind 'set convert-meta = off'

(およびも であるinput-metaと仮定します)。次に、 を押すとが表示されます。ただし、これは の 0xb0 iso8859-1 エンコードであり、アプリケーションではその処理方法がわかりません。output-metaon°°°

必要なのは、それらの°文字を含むロケールに修正することです。現在では、すべての文字をカバーし、広くサポートされている UTF-8 のみを検討する必要があります。

したがって、デスクトップ構成で国際化設定を確認し、環境に最も適したde_CH.UTF-8/ fr_CH.UTF-8/ (文字セットとして UTF-8 を使用するドイツ語/フランス語/イタリア語圏のスイス語) などを選択してください。it_CH.UTF-8

これを完全に考慮するには、ログアウトして再度ログインする必要がある場合があります。

一部のログイン マネージャーでは、ログイン時にドロップダウン メニューからロケールを選択できる場合もあります。

関連情報