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モードではありませんでした。私の知る限り。しかし、何かが「リセット」されているようです。問題は、上記の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は1960年代のアメリカ文字セットであり、ほとんどの現代文字セットの共通分母です。

Cこれは通常、ロケールが設定されていない場合(LANG、LC_ *環境変数がすべて設定されていない)、またはに設定されている場合に発生しますPOSIX

この文字セットは、0から127までのバイト値で128文字を定義します。 sh言語を構成し、ほとんどのコマンド名で見つかるすべての文字はASCII形式です。しかし、§と°の場合はそうではありません。

今、これらの記号はキーボードにあるので、ターミナルエミュレータに入力するとどうなりますか?

A文字セットがASCIIのロケールでターミナルエミュレータを起動している場合は、X11キーイベントを押すと文字エンコーディングをASCIIエンコーディング(0x61 XK_a)に送信する必要があることをターミナルエミュレータに通知します。しかし、(X11キーイベント)aを押すと°文字のエンコーディングを送信する必要がありますが、ASCIIにはそのような文字がないのですが、どうすればよいですか?Shift+§XK_degree

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

My konsole、ASCII以外のすべての文字をEterm送信しますxfce4-terminal?

私のGNOMEターミナルとターミネーターは°

このようなiso8859-1エンコーディング(0xb0)bashを受け取ったらどうなりますか?°xterm

文字セットがASCIIなので、0xb0は不明な文字に対応すると言いました。

過去米国では、Ctrl+X0から31(制御文字)までの文字を入力するために使用していました。 ASCIIはその文字の下位5ビットを送信します。たとえば、Abeing 0x41abeingは0x61と0x1fを送信するため、0x1(0x61CA文字とも呼ばれる)になります。ビット8に設定されたエンコーディングも送信されます。 、0x61 | 0x80(0xe1) を送信します。押すと0x30 | 0x80が送信され、これはM-0(no)文字とも呼ばれる0xb0です。Ctrl+A^AMeta+Xxa0x61Meta+AMeta+0

ASCIIでは、0x0 -> 0x1fがテレタイプ時代の制御文字として使用されますが、ほとんど使用されなくなり、0x80〜0xffも使用されなくなり、他の目的に使用できるコードを入力する方法です。 Wordを入力するよりも、たとえば、emacsはこれらのキーを編集キーとして使用し、C-Bcharはカーソルを1文字左に移動し、M-B(non)charはカーソルを1単語の左に移動します。

今日、ほとんどの人は0x80から0xffまでのバイト値を使用してASCIIを拡張する文字セットを使用しているため、これらの文字セットは通常メタ文字として理解されなくなりました。Meta+X通常、ESCとX文字の2文字が送信されます。

それにもかかわらずbash(実際には)ttyデバイスから0xb0などのバイト値を読み取ると、M-0(デフォルトでバインドされている)readlineと理解されます。digit-argumentarg: 0

これはconvert-metareadline設定の設定です。man 3 readlinereadlineドキュメント()で、readlineが文字セットが7ビットであることを検出すると、対応するon0xb0バイトをESC + 0に変換するように設定することがわかります。

以下を使用してオフにする場合:

bind 'set convert-meta = off'

(そしてそれを仮定input-metaするとoutput-metaon。その後、それを押すと1つが表示さ°れることがわかります°。ただし、これは0xb0 iso8859-1エンコーディングになり、°アプリケーションはそれをどのように処理するかわかりません。

あなたがすべきことは、°これらの文字を含むロケールを変更することです。現在、UTF-8はすべての文字を含み、広くサポートされているため、UTF-8のみを考慮する必要があります。

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

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

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

おすすめ記事