这是我制作的更具吸引力(也更无用)的提示符之一。由于许多 X 终端模拟器不实现光标位置的保存和恢复,因此在右上角放置时钟的替代方法是将光标固定在终端的底部。 这建立在上述“termwide”提示符的想法之上,从提示符到时钟,在屏幕右侧绘制一条线。 需要 VGA 字体。
注意:这里有一个奇怪的替换,从 SGML 翻译成其他格式时可能无法正确打印:我不得不将屏幕字符替换为 \304 - 我通常会直接包含序列“\304”,但在这种情况下必须进行此替换。
#!/bin/bash # This prompt requires a VGA font. The prompt is anchored at the bottom # of the terminal, fills the width of the terminal, and draws a line up # the right side of the terminal to attach itself to a clock in the upper # right corner of the terminal. function prompt_command { # Calculate the width of the prompt: hostnam=$(echo -n $HOSTNAME | sed -e "s/[\.].*//") # "whoami" and "pwd" include a trailing newline usernam=$(whoami) newPWD="${PWD}" # Add all the accessories below ... let promptsize=$(echo -n "--(${usernam}@${hostnam})---(${PWD})-----" \ | wc -c | tr -d " ") # Figure out how much to add between user@host and PWD (or how much to # remove from PWD) let fillsize=${COLUMNS}-${promptsize} fill="" # Make the filler if prompt isn't as wide as the terminal: while [ "$fillsize" -gt "0" ] do fill="${fill}�" # The A with the umlaut over it (it will appear as a long dash if # you're using a VGA font) is \304, but I cut and pasted it in # because Bash will only do one substitution - which in this case is # putting $fill in the prompt. let fillsize=${fillsize}-1 done # Right-truncate PWD if the prompt is going to be wider than the terminal: if [ "$fillsize" -lt "0" ] then let cutt=3-${fillsize} newPWD="...$(echo -n $PWD | sed -e "s/\(^.\{$cutt\}\)\(.*\)/\2/")" fi # # Create the clock and the bar that runs up the right side of the term # local LIGHT_BLUE="\033[1;34m" local YELLOW="\033[1;33m" # Position the cursor to print the clock: echo -en "\033[2;$((${COLUMNS}-9))H" echo -en "$LIGHT_BLUE($YELLOW$(date +%H%M)$LIGHT_BLUE)\304$YELLOW\304\304\277" local i=${LINES} echo -en "\033[2;${COLUMNS}H" # Print vertical dashes down the side of the terminal: while [ $i -ge 4 ] do echo -en "\033[$(($i-1));${COLUMNS}H\263" let i=$i-1 done let prompt_line=${LINES}-1 # This is needed because doing \${LINES} inside a Bash mathematical # expression (ie. $(())) doesn't seem to work. } PROMPT_COMMAND=prompt_command function clock3 { local LIGHT_BLUE="\[\033[1;34m\]" local YELLOW="\[\033[1;33m\]" local WHITE="\[\033[1;37m\]" local LIGHT_GRAY="\[\033[0;37m\]" local NO_COLOUR="\[\033[0m\]" case $TERM in xterm*) TITLEBAR='\[\033]0;\u@\h:\w\007\]' ;; *) TITLEBAR="" ;; esac PS1="$TITLEBAR\ \[\033[\${prompt_line};0H\] $YELLOW\332$LIGHT_BLUE\304(\ $YELLOW\${usernam}$LIGHT_BLUE@$YELLOW\${hostnam}\ ${LIGHT_BLUE})\304${YELLOW}\304\${fill}${LIGHT_BLUE}\304(\ $YELLOW\${newPWD}\ $LIGHT_BLUE)\304$YELLOW\304\304\304\331\ \n\ $YELLOW\300$LIGHT_BLUE\304(\ $YELLOW\$(date \"+%a,%d %b %y\")\ $LIGHT_BLUE:$WHITE\$$LIGHT_BLUE)\304\ $YELLOW\304\ $LIGHT_GRAY " PS2="$LIGHT_BLUE\304$YELLOW\304$YELLOW\304$NO_COLOUR " } |