tmuxを使ってターミナルを分割して増えるyou are an idiotを作りたい!
##前回までのお話
前回の記事
前回実装した機能は以下の通り。
- trapでCtrl - Cを押すたびに☺が増える。そのため、プロセスからkillする必要がある。
- tputで白黒に点滅する。
- soxを使って「You are an idiot♪」が流れる。
環境
- Ubntu 20.04LTS
- GNU bash, version 5.0.17(1)
参考にしたもの
tmuxを使う部分はhollywoodコマンドを参考にさせていただきました。
前回との比較
前回のもの
tmuxを使った今回のもの
tmuxを使ってターミナルが分割されることで原作再現度が格段に上がっています。
ソースコードと少し解説
tmuxで新しい画面を作成すると、新しいシェルが立ち上がり関数等を指定して新規ウィンドウを立ち上げることができなかったので、☺を表示する部分を別のスクリプトに分割してパスを通しました。
youareidiot.bash
#!/bin/bash
#########################################################################
# Name: youareidiot.bash
#
# You are idiot animation
#
# Usage: ./youareidiot.bash
#
# Author: anon
# Date: 2021/03/09
##########################################################################
PKG="uareidiottmux" #必須(名前はなんでもいい)
function clonetmux() #tmuxのウィンドウを増やす
{
for ((n=0; n < $cnt; n++));
do
[ "$h_or_v" = "-v" ] && h_or_v="-h" || h_or_v="-v"
if [ $cnt -eq 1 ]; then
./uareidiotwithtmux.bash
else
panes=$(tmux list-panes -t $PKG 2>/dev/null)
splits=$(echo "$panes" | wc -l)
pane=$((RANDOM % $splits))
tmux split-window $h_or_v -t "${PKG}.$pane" ./uareidiotwithtmux.bash
sleep 0.5
fi
done
}
#--------------------main--------------------
declare -i cnt=${1:-1} #引数の数だけ画面を分割する。デフォルト値は1でCtrl-Cを押すたびに数が増えるように分割したスクリプトで設定してある。
echo $cnt > record #一時的にcntの値を保存しておくことで、異なるシェルにcntの値を渡す。
# tmux (だいたいコピペ)
arrangements="main-horizontal main-vertical tiled"
if [ -z "$TMUX" ]; then
tmux_launcher=tmux
$tmux_launcher new-session -d -s $PKG "/bin/bash"
$tmux_launcher send-keys -t $PKG "$0 $1"
$tmux_launcher send-keys -t $PKG Enter
exec $tmux_launcher attach-session -t $PKG
exit 1
fi
tmux new-window -n $PKG "$WIDGET_DIR/$widget1" \; \
set-option -g pane-active-border-bg "default" \; \
set-option -g pane-active-border-fg "default" >/dev/null 2>&1
clonetmux
分割したコードは前回のものとほとんど変わっていませんが、trapで起動するのを関数ではなく、youareidiot.bash(上のスクリプト)を指定しています。
youareidiotwithtmux.bash
#!/bin/bash
##########################################################################
# Name: uareidiotwithtmux.bash
#
# run automatically by youareidiot.bash
#
# Usage: ./youareidioto.bash
#
# Author: anon
# Date: 2021/03/09
##########################################################################
function changecolor() #色の点滅
{
tput setab $1
tput setaf $2
}
function runscript() #trap(Ctrl -C)を押した時に起動させる関数
{
let cnt++
./youareidiot.bash $cnt
}
# main
declare -i cnt=$(cat record) #youareidiot.bash(上のスクリプトから分割数を受け取る。
trap runscript EXIT
declare -i i=0 t=7 tmp
while true #点滅させる関数に引数を交換しながら渡す。
do
clear
changecolor $i $t && echo -n " ☺ ☺ ☺ "
echo -n -e "\n"
if ps -e | grep play > /dev/null 2>&1; then
:
else
play -q ./music/youareidiot.mp3 > /dev/null 2>&1 &
fi
sleep 1
tmp=$i
i=$t
t=$tmp
done
おまけ
以下のコードをターミナルで実行すると作業が捗るようになります。(大嘘)
alias ls='youareidiot.bash'