mirror of
https://github.com/theniceboy/.config.git
synced 2025-12-26 14:44:57 +08:00
128 lines
4.5 KiB
Bash
Executable file
128 lines
4.5 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
new_window() {
|
|
[[ -x $(command -v fzf 2>/dev/null) ]] || return
|
|
pane_id=$(tmux show -gqv '@fzf_pane_id')
|
|
[[ -n $pane_id ]] && tmux kill-pane -t $pane_id >/dev/null 2>&1
|
|
tmux new-window "bash $0 do_action" >/dev/null 2>&1
|
|
}
|
|
|
|
# invoked by pane-focus-in event
|
|
update_mru_pane_ids() {
|
|
o_data=($(tmux show -gqv '@mru_pane_ids'))
|
|
current_pane_id=$(tmux display-message -p '#D')
|
|
n_data=($current_pane_id)
|
|
for i in ${!o_data[@]}; do
|
|
[[ $current_pane_id != ${o_data[i]} ]] && n_data+=(${o_data[i]})
|
|
done
|
|
tmux set -g '@mru_pane_ids' "${n_data[*]}"
|
|
}
|
|
|
|
do_action() {
|
|
trap 'tmux set -gu @fzf_pane_id' EXIT SIGINT SIGTERM
|
|
current_pane_id=$(tmux display-message -p '#D')
|
|
tmux set -g @fzf_pane_id $current_pane_id
|
|
|
|
cmd="bash $0 panes_src"
|
|
set -- 'tmux capture-pane -pe -S' \
|
|
'$(start=$(( $(tmux display-message -t {1} -p "#{pane_height}")' \
|
|
'- $FZF_PREVIEW_LINES ));' \
|
|
'(( start>0 )) && echo $start || echo 0) -t {1}'
|
|
preview_cmd=$*
|
|
last_pane_cmd='$(tmux show -gqv "@mru_pane_ids" | cut -d\ -f1)'
|
|
selected=$(FZF_DEFAULT_COMMAND=$cmd fzf -m --preview="$preview_cmd" \
|
|
--preview-window='down:80%' --reverse --info=inline --header-lines=1 \
|
|
--delimiter='\s{2,}' --with-nth=2..-1 --nth=1,2,9 \
|
|
--bind="alt-p:toggle-preview" \
|
|
--bind="ctrl-r:reload($cmd)" \
|
|
--bind="ctrl-x:execute-silent(tmux kill-pane -t {1})+reload($cmd)" \
|
|
--bind="ctrl-v:execute(tmux move-pane -h -t $last_pane_cmd -s {1})+accept" \
|
|
--bind="ctrl-s:execute(tmux move-pane -v -t $last_pane_cmd -s {1})+accept" \
|
|
--bind="ctrl-t:execute-silent(tmux swap-pane -t $last_pane_cmd -s {1})+reload($cmd)")
|
|
(($?)) && return
|
|
|
|
ids_o=($(tmux show -gqv '@mru_pane_ids'))
|
|
ids=()
|
|
for id in ${ids_o[@]}; do
|
|
while read pane_line; do
|
|
pane_info=($pane_line)
|
|
pane_id=${pane_info[0]}
|
|
[[ $id == $pane_id ]] && ids+=($id)
|
|
done <<<$selected
|
|
done
|
|
|
|
id_n=${#ids[@]}
|
|
id1=${ids[0]}
|
|
if ((id_n == 1)); then
|
|
tmux switch-client -t$id1
|
|
elif ((id_n > 1)); then
|
|
tmux break-pane -s$id1
|
|
i=1
|
|
tmux_cmd="tmux "
|
|
while ((i < id_n)); do
|
|
tmux_cmd+="move-pane -t${ids[i-1]} -s${ids[i]} \; select-layout -t$id1 'tiled' \; "
|
|
((i++))
|
|
done
|
|
|
|
# my personally configuration
|
|
if (( id_n == 2 )); then
|
|
w_size=($(tmux display-message -p '#{window_width} #{window_height}'))
|
|
w_wid=${w_size[0]}
|
|
w_hei=${w_size[1]}
|
|
if (( 9*w_wid > 16*w_hei )); then
|
|
layout='even-horizontal'
|
|
else
|
|
layout='even-vertical'
|
|
fi
|
|
else
|
|
layout='titled'
|
|
fi
|
|
|
|
tmux_cmd+="switch-client -t$id1 \; select-layout -t$id1 $layout \; "
|
|
eval $tmux_cmd
|
|
fi
|
|
}
|
|
|
|
panes_src() {
|
|
printf "%-6s %-7s %5s %8s %4s %4s %5s %-8s %-7s %s\n" \
|
|
'PANEID' 'SESSION' 'PANE' 'PID' '%CPU' '%MEM' 'THCNT' 'TIME' 'TTY' 'CMD'
|
|
panes_info=$(tmux list-panes -aF \
|
|
'#D #{=|6|…:session_name} #I.#P #{pane_tty} #T' |
|
|
sed -E "/^$TMUX_PANE /d")
|
|
ttys=$(awk '{printf("%s,", $4)}' <<<$panes_info | sed 's/,$//')
|
|
ps_info=$(ps -t$ttys -o stat,pid,pcpu,pmem,thcount,time,tname,cmd |
|
|
awk '$1~/\+/ {$1="";print $0}')
|
|
ids=()
|
|
hostname=$(hostname)
|
|
for id in $(tmux show -gqv '@mru_pane_ids'); do
|
|
while read pane_line; do
|
|
pane_info=($pane_line)
|
|
pane_id=${pane_info[0]}
|
|
if [[ $id == $pane_id ]]; then
|
|
ids+=($id)
|
|
session=${pane_info[1]}
|
|
pane=${pane_info[2]}
|
|
tty=${pane_info[3]#/dev/}
|
|
title=${pane_info[@]:4}
|
|
while read ps_line; do
|
|
p_info=($ps_line)
|
|
if [[ $tty == ${p_info[5]} ]]; then
|
|
printf "%-6s %-7s %5s %8s %4s %4s %5s %-8s %-7s " \
|
|
$pane_id $session $pane ${p_info[@]::6}
|
|
cmd=${p_info[@]:6}
|
|
# vim path of current buffer if it setted the title
|
|
if [[ $cmd =~ ^n?vim && $title != $hostname ]]; then
|
|
cmd_arr=($cmd)
|
|
cmd="${cmd_arr[0]} $title"
|
|
fi
|
|
echo $cmd
|
|
break
|
|
fi
|
|
done <<<$ps_info
|
|
fi
|
|
done <<<$panes_info
|
|
done
|
|
tmux set -g '@mru_pane_ids' "${ids[*]}"
|
|
}
|
|
|
|
$@
|