赤い目





こんにちは。赤い目でコマンドラインプロンプトを設計する方法についての小さなチュートリアルを紹介します。



一部のLinuxのコンソールで作業したすべての人は、プロンプト行の表示に応じて、現在のフォルダー、ユーザー名、サーバー名などを表示する便利な機能におそらく気づきました。私もいつも好きでした。しかし、次のようになることもあり







ます。3文字の行で「作成」するのは困難です。もちろん、カーソルは次の行に移動しますが、それは助け以上に激怒します。そしてある時点で、私は自分自身に言いました:







私はすべてのコマンドラインスペースを取り戻し、二度と誰にもそれを与えないことに決めました。問題は、コマンドプロンプトのテキストをどのように変更するかでした。特別なシステム変数 `PS1`を変更するだけで、非常に簡単であることがわかりました。







はい、ターミナルで直接新しい招待状を設定できます。しかし、どのように変更を保存しますか?そして、現在のカタログに関する情報がなくても、あなたはどういうわけか不快に感じ、常に「私はどこにいるのか」と自問します。〜/ .bashrcファイルが役立ちます。PS1の変更を保存できます。現在のディレクトリに関する情報が作業スペースを占有しないように、INではなくコマンドライン上に配置することにしました。〜/ .bashrcファイルに次の行を追加します。



PS1='$PWD\n# '


一重引用符に注意してください。二重引用符を使用する場合は、$ PWD変数(pwdコマンドに類似した、現在のフォルダーのフルパスを格納するシステム変数)へのポインターの代わりに、その値(現在のディレクトリ)がプロンプト文字列に書き込まれ、フォルダーから移動すると変更されます。フォルダはありません。次のようになります。







コマンドラインは完全に無料ですが、lsコマンドを実行すると、フォルダ名がコンテンツとマージされますハエをカトレットから、フォルダー名を内容から分離する必要があります。上下に「-」行を追加して$ PWDの「フレーム」を追加することにしました。文字列の文字数を確認するにはどうすればよいですか?このためのシステム変数$ COLUMNSもあります..。また、必要な数の「-」文字を含む文字列をすばやく作成するには、printfコマンドを使用します



printf -v line "%${COLUMNS}s"


このコマンドは、変数$行を作成し、$ COLUMNSの量のスペースで埋めますが、スペースは必要ありませんが、「-」が必要です。このために、次のトリックを使用します。



line=${line// /-} #     -


このコードを〜/ .bashrcに追加しましょう



printf -v line "%${COLUMNS}s"
line=${line// /-}
PS1='\n$line\n$PWD\n$line\n# '






すばらしいですが、ここでターミナルウィンドウのサイズを変更すると、「行」のサイズは変更されず、美しさが消え







ます。状況を修正するために、新しいコードをinfo関数に転送して、PS1に追加しましょう



info () {
    printf -v line "%${COLUMNS}s"
    line=${line// /-}
    printf "\n$line\n$PWD\n$line\n# "
}
PS1='$(info)'


上部の区切り文字にホスト名を含む「挿入」を追加することで、ビジネスと喜びを組み合わせることができます。名前の挿入は中央になります。このため、行の中心を計算する必要があります(ホスト名の長さと追加の文字を考慮に入れて)。



info () {
    name_length="{ $HOSTNAME }"
    name_length=${#name_length}
    top_line_left=$[(COLUMNS-name_length)/2]
    top_line_right=$[COLUMNS-(top_line_left+name_length)]
    printf -v top_line "%${top_line_left}s{_S_${HOSTNAME}_S_}%${top_line_right}s"
    printf -v bot_line "%${COLUMNS}s"
    bot_line=${bot_line// /-}
    top_line=${top_line// /-}
    top_line=${top_line//_S_/ }
    printf "\n$top_line\n$PWD\n$bot_line\n# "
}
PS1='$(info)'






ホスト名を中括弧で囲んでスペースで囲みましたが、$ HOSTNAMEの前後のスペースの代わりに、文字「_S_」が使用され、スペースに変更されます。これが必要なのは、最終行のすべてのスペースが「-」に置き換えられ、スペースはインサート内に残しておく必要があるためです。色を追加しましょう。このために、端末のテキストの色を変更するためのコードを含む変数を準備します。次の色を使用しました。



RED='\e[31m' # 
GRN='\e[32m' # 
YLW='\e[33m' # 
BLU='\e[34m' # 
MGN='\e[35m' # 
DEF='\e[0m'  #    
BLD='\e[1m'  # 
DIM='\e[2m'  # 


これらの変数をコードに追加しましょう:



info () {
    name_length="{ $HOSTNAME }"
    name_length=${#name_length}
    top_line_left=$[(COLUMNS-name_length)/2]
    top_line_right=$[COLUMNS-(top_line_left+name_length)]
    printf -v top_line "%${top_line_left}s{_S_$DEF$BLD$HOSTNAME${DEF}_S_$GRN}%${top_line_right}s"
    printf -v bot_line "%${COLUMNS}s"
    bot_line=$GRN${bot_line// /-}$DEF
    top_line=${top_line// /-}
    top_line=$GRN${top_line//_S_/ }$DEF
    printf "\n$top_line\n$BLD$BLU$PWD$DEF\n$bot_line\n# "
}
PS1='$(info)'






先に進みます。右側は空に見えます。そこに日付と時刻を入力できます。



printf -v date "%(%a %d %b %T)T"


これを右側に配置するには、$ PWDの後にいくらかのスペースを追加する必要があります。これを数えましょう:



center_space=$[COLUMNS-${#date}-${#PWD}]
((center_space<0)) && center_space=1
...
printf "\n$top_line\n$BLD$BLU$PWD$DEF%${center_space}s$DIM$date\n$bot_line\n# "






もっと上手くできますか?もちろん、gitプロジェクトのあるフォルダーにいる場合はgitstatusの出力を追加しましょう



    git_tst= git_clr=
    [[ -d .git ]] && {
        git_tst=($(git status -c color.ui=never -sb))
        git_tst="GIT ${git_tst[*]} " #   
        git_clr=(GIT $(git -c color.ui=always status -sb))
        git_clr="GIT ${git_clr[*]} " #   
    }
    ...
    center_space=$[COLUMNS-${#date}-${#PWD}-${#git_tst}]
    ...
    printf "\n$top_line\n$BLD$BLU$PWD$DEF%${center_space}s$git_clr$DIM$date\n$bot_line\n\$ "






git_clrgit_tstは最初に配列として書き込まれ、次に変数に変換される ことに注意してくださいこれは、gitstatus出力から改行を削除するために必要です。しかし、目はどこにありますか?これでO_oの目ができます。基本的な目のセットを使用して、配列を作成しましょう。



eyes=(O o ∘ ◦ ⍤ ⍥)


そして、それらの数を数えましょう:



en=${#eyes[@]}


口のシンボルを追加しましょう:



mouth='_'


そして、ランダムな顔のジェネレーターを作りましょう:



face () {
    printf "$YLW${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}$DEF"
}


目は情報フィールドの端に配置されます。中央のスペースの数を計算するときにそれらを考慮する必要があります。これのために別の変数を用意します。



face_tst='O_o  o_O'
...
center_space=$[COLUMNS-${#date}-${#PWD}-${#git_tst}-${#face_tst}]
printf "\n$top_line\n$(face) $BLD$BLU$PWD$DEF%${center_space}s$git_clr$DIM$date $(face)\n$bot_line\n\$ "






あなたの目を赤面させる方法は?。寝ていない、長い時間のためのコンピュータの前に座っstackoverflow.com私が面白い出くわした質問、著者は尋ねる:「最後のコマンドが失敗した場合は赤に、プロンプトのコマンドラインの色を変更する方法?」これは私を赤い目のアイデアに導きました。最後のコマンドの完了ステータスを記憶しているinfo関数に追加しましょう



info () {
    error=$?
    ...
}


そして、face関数を変更して$エラー変数チェックし、その値に応じて、目を赤または黄色にペイントします。



face () {
    [[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
    printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}






さて、私の目は赤くなりましたが、他のものを追加することができます。$ debian_chroot変数のチェックを追加しましょう



[[ $debian_chroot ]] && chrt="($debian_chroot)" || chrt=
...
name_length="{ $HOSTNAME$chrt }"
...
printf -v top_line "%${top_line_left}s{_S_$DEF$BLD$HOSTNAME$chrt${DEF}_S_$GRN}%${top_line_right}s"


そして、ターミナルウィンドウのタイトルのテキストを変更しましょう。



PS1='$(info)'; case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;$(face 1) \w\a\]$PS1";; esac


見出しには顔と現在のディレクトリが表示されますが、face関数を少し変更して、カラーコードなしで顔を描画する必要があります。見出しにはテキストとして表示されface関数にパラメータ(「1」など)を渡し、関数内にチェックを追加します。最初の引数が指定されている場合、装飾なしで銃口を出力します。



face () {
    [[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
    [[ $1 ]] && printf "${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}" \
             || printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}






最終スクリプト:



RED='\e[31m' # 
GRN='\e[32m' # 
YLW='\e[33m' # 
BLU='\e[34m' # 
MGN='\e[35m' # 
DEF='\e[0m'  #    
BLD='\e[1m'  # 
DIM='\e[2m'  # 
eyes=(O o ∘ ◦ ⍤ ⍥) en=${#eyes[@]} mouth='_'
face () {
    [[ $error -gt 0 ]] && ecolor=$RED || ecolor=$YLW
    [[ $1 ]] && printf "${eyes[$[RANDOM%en]]}$mouth${eyes[$[RANDOM%en]]}" \
             || printf "$ecolor${eyes[$[RANDOM%en]]}$YLW$mouth$ecolor${eyes[$[RANDOM%en]]}$DEF"
}
info () { error=$? git_tst= git_clr=
    [[ -d .git ]] && {
        git_tst=($(git -c color.ui=never status -sb))
        git_tst="GIT ${git_tst[*]} " #   
        git_clr=($(git -c color.ui=always status -sb))
        git_clr="GIT ${git_clr[*]} " #   
    }
    [[ $debian_chroot ]] && chrt="($debian_chroot)" || chrt=
    name_length="{ $HOSTNAME$chrt }"
    name_length=${#name_length}
    face_tst='O_o  o_O'
    top_line_left=$[(COLUMNS-name_length)/2]
    top_line_right=$[COLUMNS-(top_line_left+name_length)]
    printf -v top_line "%${top_line_left}s{_S_$DEF$BLD$HOSTNAME$chrt${DEF}_S_$GRN}%${top_line_right}s"
    printf -v bot_line "%${COLUMNS}s"
    printf -v date  "%(%a %d %b %T)T"
    top_line=${top_line// /-}
    top_line=$GRN${top_line//_S_/ }$DEF
    bot_line=$GRN${bot_line// /-}$DEF
    center_space=$[COLUMNS-${#date}-${#PWD}-${#git_tst}-${#face_tst}]
    ((center_space<0)) && center_space=1
    printf "\n$top_line\n$(face) $BLD$BLU$PWD$DEF%${center_space}s$git_clr$DIM$date $(face)\n$bot_line\n\$ "
}
PS1='$(info)'; case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;$(face 1) \w\a\]$PS1";; esac


それだけです、ご清聴ありがとうございました!)購読してください、それだけです、プロジェクトは情報バーgithubにあります作成、発明、試してみてください!)



ケアチェック
"#" "$"?)



(*)(*)



All Articles