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[0m
。tput 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
(デフォルトでは空白ですが、上で明示的に設定されます)。