40

好きzshなプロンプトがあります。現在の時刻を評価しprecmd、プロンプトの右側に表示します。

[Floatie:~] ^_^ 
cbowns%                      [9:28:31 on 2012-10-29]

ただし、これは私が望んでいることではありません以下に示すように、この時間は実際には前のコマンドが終了した時間であり、コマンドが開始された時間ではありません。

[Floatie:~] ^_^ 
cbowns% date                           [9:28:26 on 2012-10-29]
Mon Oct 29 09:28:31 PDT 2012
[Floatie:~] ^_^ 
cbowns% date                           [9:28:31 on 2012-10-29]
Mon Oct 29 09:28:37 PDT 2012
[Floatie:~] ^_^ 
cbowns%                                [9:28:37 on 2012-10-29]

シェルが新しいコマンドを開始する直前にzshコマンドを実行するためのフックがあり、プロンプトのタイムスタンプを更新できますか?( zshプロンプトで常に更新される時計を見ましたか?が、常に更新される必要はありません。Enterキーを押すと更新されるだけです。)

(これ^_^は、前のコマンドの戻りコードに基づいています;_;。ゼロ以外の終了ステータスがある場合は、赤で表示されます。)

4

6 に答える 6

43

これは実際、奇妙なハッキングに頼ることなく可能です。.zshrcにこれがあります

RPROMPT='[%D{%L:%M:%S %p}]'

TMOUT=1

TRAPALRM() {
    zle reset-prompt
}

TRAPALRM関数はTMOUT秒(この場合は1)ごとに呼び出され、ここではプロンプトリフレッシュを実行し、コマンドが実行を開始するまで実行します(Enterキーを押す前にプロンプ​​トに入力した内容に干渉しません)。私はあなたがそれを絶えず更新する必要がないことを知っています、しかしそれはそれ自身のために線を必要とせずにそれでも仕事を成し遂げます!

出典:http ://www.zsh.org/mla/users/2007/msg00944.html (2007年からです!)

于 2013-07-29T02:27:17.927 に答える
19

私はこれを作るのに苦労しました:

コマンドが実行された日付が右側に表示されます。表示されているコマンドは上書きされません。警告:現在のRPROMPTを上書きする可能性があります。

strlen () {
    FOO=$1
    local zero='%([BSUbfksu]|([FB]|){*})'
    LEN=${#${(S%%)FOO//$~zero/}}
    echo $LEN
}

# show right prompt with date ONLY when command is executed
preexec () {
    DATE=$( date +"[%H:%M:%S]" )
    local len_right=$( strlen "$DATE" )
    len_right=$(( $len_right+1 ))
    local right_start=$(($COLUMNS - $len_right))

    local len_cmd=$( strlen "$@" )
    local len_prompt=$(strlen "$PROMPT" )
    local len_left=$(($len_cmd+$len_prompt))

    RDATE="\033[${right_start}C ${DATE}"

    if [ $len_left -lt $right_start ]; then
        # command does not overwrite right prompt
        # ok to move up one line
        echo -e "\033[1A${RDATE}"
    else
        echo -e "${RDATE}"
    fi

}

出典:

于 2014-10-27T10:44:37.660 に答える
14

zsh行をpreexec実行する直前に関数を実行します。現在の時刻を出力するのは簡単です。単純なバージョンは次のようになります。

preexec() { date }

既存のプロンプトを変更することは、はるかに困難です。

于 2012-10-29T17:11:47.877 に答える
14

Return次の行を受け入れる前に、キーを再マップしてプロンプトをリセットできます。

reset-prompt-and-accept-line() {
    zle reset-prompt
    zle accept-line
}

zle -N reset-prompt-and-accept-line

bindkey '^m' reset-prompt-and-accept-line
于 2015-10-25T09:46:46.513 に答える
9

@vitaŭt-bajarynのクールなZSHスタイルの答えを構築する:

accept-line関数をオーバーライドすることは、おそらく最も慣用的なzshソリューションだと思います。

function _reset-prompt-and-accept-line {
  zle reset-prompt
  zle .accept-line     # Note the . meaning the built-in accept-line.
}
zle -N accept-line _reset-prompt-and-accept-line
于 2016-01-28T01:09:16.187 に答える
5

次のように、 ANSIエスケープシーケンスを使用して前の行を上書きできます。

preexec () {
  DATE=`date +"%H:%M:%S on %Y-%m-%d"`
  C=$(($COLUMNS-24))
  echo -e "\033[1A\033[${C}C ${DATE} "
}
于 2012-12-29T18:17:56.063 に答える