🔙 Back to Top

Mon May 14 2018

日記 - Zsh: C-o で RPROMPT の表示・非表示をトグルする

日記です.

Macだとデスクトップのカスタマイズに制限がありすぎて、デスクトップの右上(ステータスメニューみたいなところ)に好きな文字列を表示させるのすらつらい. ターミナルならいつも開いているので、その中に表示させることにする. ターミナルの中で GNU screen を開いてその中で zsh がいつも起動している. GNU screen の表示は必要最小限にすると決めているので zsh の中に表示することにする. となるとプロンプトをいじる. zsh のプロンプトには普通の PROMPT と、右端に寄せて表示してくれる RPROMPT とがある. わたしは RPROMPT は使ってこなかった. 理由としては、ごちゃごちゃさせたくないのと、ターミナルの上でテキストコピーさせると、 RPROMPT が表示されていると、大量に並んだスペース記号のあとに PROMPT の中身まで一緒にコピーされてしまうから.

そこでタイトルのようにする. 見たいときだけ C-o で一時的に表示してすぐ消すという使い方ができる.

書いてて本当に便利なのか疑問が生じてきた. 一週間くらい使ってみて感想を書きます.

以下コード

# .zshrc

rprompt-toggle() {
    if [ -z "$RPROMPT" ]; then
        TWITTER=$( cat ~/.twurlrc | grep -A 1 default_profile | tail -1 | sed 's/ *- *//g' )  # ログインしてるアカウント
        RPROMPT="@$TWITTER"
    else
        RPROMPT=
    fi
    zle reset-prompt
}
zle -N rprompt-toggle
bindkey "^O" rprompt-toggle

日記 - GNU Screen + Zsh で hardstatusline の中に文字列の表示・非表示をトグルする

上に書いたのはやっぱ不便そう.消すのを忘れたままコマンドを実行したりすると、表示が残るのが嫌だ. あと、zsh を起動したてだと C-o 押しても RPROMPT が表示されない. reset-prompt が効いてないように見える.

というわけで、表示する箇所はただ一箇所なのがいい. 幸運にも私は基本的にいつも GNU screen を使っていて、一番したの行のステータスライン、つまり hardstatusline をいつも表示させている. いつもはここには、開いているウィンドウの番号の名前の一覧を並べてるだけだが、この右端に、任意の文字列を表示させるための小窓を設けることにする.

# .screenrc

# before
hardstatus alwayslastline '%-w%{=b dR}%n %t%{-}%+w`

# after
hardstatus alwayslastline '%-w%{=b dR}%n %t%{-}%+w%=%1`'

%= はめいっぱい広げるためのスペーサー. %1` が今回追加した部分. いわば小窓であるが、backtick という screen の機能.

backtick の 1番を登録する

# .screenrc
backtick 1 0 2 bash -c "[ -f /tmp/screen.memo.txt ] && tail -1 /tmp/screen.memo.txt"

このコマンドは次のように読む. 「backtick の 1番を登録する. 起動してから 0 秒後に 2 秒毎に次のコマンドを実行する. bach -c "...".」

というわけで、 /tmp/screen.memo.txt というファイルが存在すれば、その一番最後の行を出力する.

ここからは zsh の設定.

# .zshrc
toggle-screen-memo() {
    FILE=/tmp/screen.memo.txt
    if [ -f $FILE ]; then
        rm $FILE
    else
        TWITTER=$( cat ~/.twurlrc | grep -A 1 default_profile | tail -1 | sed 's/ *- *//g' )
        echo "@$TWITTER" > /tmp/screen.memo.txt
    fi
}
zle -N toggle-screen-memo
bindkey "^O" toggle-screen-memo

C-o を押すと、表示させたいものを /tmp/screen.memo.txt に書き込むか、または消す (トグル式). ただしこれは zsh のプロンプト待機状態でしか発動しない. この処理も GNU screen 側でやって、任意のタイミングで発動させたいが、やり方がわからない.