NBSPを通常のスペースに自動的に変換するようにbash / readlineを構成できますか?


10

AltGr+ Space改行なしスペース(NBSP、U + 00A0)にマップするフィンランド語のキーボードレイアウトを使用しています。一般的にはこれで満足ですが、bashコマンドラインを使用しているときに、パイプ " |"記号(フィンランド語のキーボードレイアウトではAltGr+ <で記述)の後に通常のスペースではなくNBSPを誤って書き込むことがよくあります。これはAltGr、パイプを打ちながらスペースを押す前にそれを離す必要があるという事実が原因であると思います。そして、私がリリースのタイミングが悪いAltGrと、コマンドラインに表示されないタイプミスや次のようなエラーメッセージが表示されます

 grep: command not found

それはかなり似ています

grep: command not found

このため、初めてこの問題に気づくことは少し難しくなります。

私はNBSP無効にできることを知っていますが、パイプ文字の後にのみ無効にする(AltGr+ Spaceを使用して通常のスペースを生成する)か、それが不可能な場合は常にbashコマンドラインまたはreadlineレベルで行います。bashのソースコードreadlineや端末エミュレータ(gnome-terminalを変更せずにこれを行う簡単な方法はありますか?

別の良い解決策は、NBSPをコマンドラインで何らかの形で表示できるように構成することです。たとえば、レンダリング専用の別の文字(たとえばU + 2423 )に置き換えます。


@デザートは本当に賞金の必要はありません。私は問題にぶつかって、それについての質問を書きました。後で、Googleの検索で十分に近い設定を見つけて、以下の答えを見つけました。すべてのケースでキャラクターを無効にするのではなく、NBSPを表示するための答えを探しています。データ文字列にNBSPがある場合、すべての端末出力がめちゃくちゃにならないように、readlineレベルで可視のNBSPが欲しいと思います。
ミッコランタライネン

@MikkoRantalainenは、まだ足りないものをより明確に説明できますか?キャラクターをマッピングする方法を見つけたので、なぜ" ":␣十分ではないのですか?他に何か要りますか?
terdon

@dessertコマンドラインでNBSPを記述して取得できる機能が欲しいのですecho a␣bが、結果の出力ラインにはecho a b、出力に実際のNBSPが含まれていました。そのため、それはreadlineレベルで行う必要があると思います(つまり、コマンドラインエディターは常に表示文字を表示しますが、ターミナルエミュレーターはエディター表示と出力表示の違いを認識できないため、ターミナルエミュレーターはレンダリングの視覚的な置換を行うことができません)。
ミッコランタライネン

1
readlineレベルでそれを解決することは確かに素晴らしいですが、ターミナルのvim / emacs / etcでシェルスクリプトを書いているときに同じ問題に遭遇するかもしれません。単一のNBSP文字を含む文字列の一致を強調表示するgnome-terminalの概念実証パッチについては、bugzilla.gnome.org / show_bug.cgi?id = 788673を参照してください。(ええ、あなたはソースコードを変更したくないと言っていましたね…)
egmont

1
別のアプローチは、NBSPのグリフが空でない特別なフォントを介して、いくつかのfontconfig構成とともに、フォントレベルでそれを処理することです。これは、ターミナルだけでなくグラフィカルエディタでも機能します。さらに別のアプローチは、キーボードレイアウトを変更して通常のスペースを放出し、他の方法を使用して、まれなケースでNBSPを入力することです。
エグモント

回答:


9

これは、readline2つの異なる方法でレベルで実行できます。

方法1

以下を.inputrc(の構成ファイルreadline)に入力します。

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map NBSP to regular space (left part has NBSP in quotes, right part has space)
" ":" "

マークダウンが上記を混乱させる場合は、コメントで説明されているように、コロンの左側の引用符でNBSPを配置する必要があります。これは、通常のスペースを持つ入力ストリーム上のすべてのNBSPをマップします。

方法2

以下を入れてください.inputrc

# include default system config because ~/.inputrc overrides system config
$include /etc/inputrc
# map "pipe + NBSP" to "pipe + regular space" (left part has NBSP in quotes)
"| ":"| "
set keyseq-timeout 250

アイデアは、キーシーケンス{パイプの後にNBSP}を{パイプの後にスペース}にマップすることです。これは、シーケンスを250ミリ秒以内に入力した場合に機能します(上記で構成可能)。ただし、タイムアウトがなくなるまでは、パイプ記号だけを入力しても何も出力されません。また、シーケンスの入力が遅すぎると、修正は適用されません。また、タイムアウトはグローバルであるため、他のシーケンスを使用する場合は、最も長いシーケンスを入力できるように十分長いタイムアウトを設定する必要があります。(readlineライブラリは、文字を入力し、後で文字シーケンスが構成と一致した後に既に表示されている文字を置き換えることができるほど賢くはありません。)


0

この問題を扱った優れた記事があります:

私は、grepエラーメッセージを使用して主な懸念に対処し、execコマンドを使用してNBSPをより目に見えるものに変更することを試みています。ただし、構文はまだわかりません。

exec 2> >(tr $'\xa0' $'\x43' >&2) 

このコマンドを~/.bashrc入れて、gnome-terminal開くと自動的に読み込まれるようにするのが目的です。しかし、私が言ったように、それはまだ機能していません...


1
それはエラーメッセージのみを扱います。コマンドラインを編集しているときに問題をperl -i -npe 's/MARKER/4 KB/'見つけたいと思います。次のようなものを書いている可能性があり、誤って4との間でNBSPを滑らせてしまうからKです。問題はファイルに保存されますが、エラーは発生せず、作成したコマンドラインは完璧に見えます。
ミッコランタライネン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.