zshで文字列修飾子を使用して入力変数を変更するには?

zshで文字列修飾子を使用して入力変数を変更するには?

bold私は概念証明と自分自身に挑戦して機能を開発してきました。テキスト(例:)を入力fooして太字(foo)。

コンテキスト:

私はテーマファイルの変数を使用しており、echoそれを基本として使用しています。PROMPT私はいかなるフレームワークも使用しません。

%B%n%bテーマは太字のユーザー名()などのコードを使用しますが、これをユーザー入力()に置き換える%n方法がわかりません。役に立ちましたか?%n$1

編集:試してみるコード

echo '%B'"$1"'%b'

- 引用符を使用または使用せずに、サブシェル({})を使用してさまざまな場所で試しました。

答え1

%Bそして%bはいプロンプトの順序、通常はプロンプトの書式設定にのみ使用されます。一般的なスクリプトでは、次のtputコマンドを使用して必要なものを取得できます。

echo "$(tput bold)$1$(tput sgr0)"

または出力できます。ECMA-48("ANSI") 直接エスケープコードです。ただし、この方法は端末間の移植性が低下するため推奨されません。 (21世紀には、ECMA-48と基本的なECMA-48 SGR機能(太字など)を実装していない端末を見つけるのはかなり難しいです。フォントの太さの変更ではなく色の変更であるいくつかのターミナルエミュレータがまだあることに注意する必要があります。

echo $'\e[1m'"$1"$'\e[22m'

使用に注意してくださいコーエン名言制御シーケンスの場合。通常、このechoコマンドはそうである場合とそうでない場合があります。それ自体シーケンスはKornスタイルの引用符ではない場合に解釈され、これらの\eエスケープシーケンスは異なるシェルまたは同じシェルの異なるバージョンで異なる動作をします。逆に、すべてのシェルがKornスタイルの引用を理解しているわけではありません。望むより」なぜprintfがechoより優れているのですか?全体の話を言うと、echo単一の特定の(バージョン)シェル以外の問題を解決したいのなら、なぜ良い考えではないのですか?

printf '\e[1m%s\e[22m' "$1"

SGR 0(現在一般的に発行されている場合)がオフになっています\e[0mtput sgr0すべて、おそらくあなたが望むものではありません。返品下線、斜体、色、反転ビデオ、またはその他のグラフィック表現を使用します。太くする具体的に、SGR 22は、太字とフェード機能をオフにして「中間」フォントの太さを復元するグラフィックレンダリングコードです。 (これS待つGラピック終了制御シーケンスを使用すると、太字、わずかに太字、中、軽さの4つのフォントの太さを設定できます。 )

あなたが〜した後はいZシェルを使用すると、次のことができます。返品使用自己組み込みprintコマンドまったく使用しないechoか、使用しない代わりに。 Zシェルプロンプトの拡張順序を理解するために組み込みprintf機能を作成できます。print

print -P '%B'"$1"'%b'

もちろん$1、文字列自体に他の拡張シーケンスを含めることはできず、太字で変更されるSGR制御シーケンスも含めることはできません。これはtput、terminfo機能がどのように機能するかを学ぶのに困難を与えません。

答え2

%パラメータ拡張フラグを使用できます。

echo "${(%):-%B}$1${(%):-%b}"

zshにはプロンプト拡張を実行するprint必要がある組み込み関数があります-P(注:$ 1にプロンプ​​トシーケンスが含まれている場合は次のように解釈されます)。

print -P -- "%B$1%b"

最初の位置引数だけでなく、すべての引数を印刷したい場合もあります($@/使用$*)。

引数が与えられなければ、何も印刷したくないでしょう(改行文字も含む)($#ゼロより大きい場合にのみ印刷するか、+引数拡張を使用してprint出力列に通知します)。

print -rバックスラッシュエスケープ文字()のエコーに似た解釈を無効にできます。

print_bold() {
  local IFS=' '
  print -rC1 -- ${1+"${(%):-%B}$*${(%):-%b}"}
}

"$*"最初の文字で区切られた位置引数に展開されますIFS(デフォルトでは空白ですが、上で明示的に設定されます)。

関連情報