Add tmux fzf session chooser

Added tmux session chooser. Aliased to `tm`, calling `tmux_attach_start`
(the original tm script).

When called without arguments displays a fzf list of currently running
tmux sessions, with a preview to their respective open panes. A session
can be chosen in fzf which tmux will attach itself to. When creating a
query in fzf which does not have a valid target and confirming, tmux
will automatically create that session and attach itself to it.

When called with an argument, tmux will attach itself or create a
session of the same name. If called with the name of a session file, as
before, tmux will automatically execute that session file and attach
itself to it.
This commit is contained in:
Marty Oehme 2020-02-02 23:44:23 +01:00
parent fbc1c44652
commit 92376839a4
5 changed files with 71 additions and 2 deletions

View file

@ -0,0 +1,49 @@
#!/usr/bin/env sh
exist() { type "$1" >/dev/null 2>&1; }
# show a list of running tmux sessions
alias tl='tmux list-sessions -F "#{session_name}" 2>/dev/null'
# fzf
if exist fzf; then
# fzf select a tmux session to connect to, with pane preview
alias tm='fzf_tmux'
fi
fzf_tmux() {
if [ -z "$1" ]; then
result=$(
tl | fzf \
--layout=reverse \
--height=50% \
--border \
--prompt="Session> " \
--preview="tmux_pane_tree {}" \
--preview-window=right:99% \
--print-query
)
case "$?" in
0)
# found a session, attaching
tmux_attach_start "$(echo "$result" | tail --lines=1)"
;;
1)
# did not find a session, creating
result=$(echo "$result" | head --lines=1)
# if . was only thing entered, create one for current dir
if [ "$result" = "." ]; then
tmux_attach_start
# create for query name
else
tmux_attach_start "$result"
fi
;;
esac
else
tmux_attach_start "$1"
fi
}
unset choice
unset -f exist

View file

@ -7,6 +7,6 @@ select-pane -t 1
split-window -v watch -t -n 1 -c 'cd ~/.dotfiles; git -c color.ui=always log --graph --date=short --decorate --oneline --all --remotes' split-window -v watch -t -n 1 -c 'cd ~/.dotfiles; git -c color.ui=always log --graph --date=short --decorate --oneline --all --remotes'
select-pane -t 4 select-pane -t 4
new-window -n code new-window -n code
send-keys "cd ~/.dotfiles; vim ." C-m I send-keys "cd ~/.dotfiles; v ." C-m I
new-window -n test new-window -n test
select-window -t 1 select-window -t 1

View file

@ -58,7 +58,7 @@ set -g @plugin 'Morantron/tmux-fingers'
set -g @plugin 'christoomey/vim-tmux-navigator' set -g @plugin 'christoomey/vim-tmux-navigator'
set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'tmux-plugins/tmux-resurrect'
if "test ! -d ${TMUX_PLUGIN_MANAGER_PATH}/tpm" \ if "test ! -z ${TMUX_PLUGIN_MANAGER_PATH} && test ! -d ${TMUX_PLUGIN_MANAGER_PATH}/tpm" \
"run 'git clone https://github.com/tmux-plugins/tpm {TMUX_PLUGIN_MANAGER_PATH}/tpm && {TMUX_PLUGIN_MANAGER_PATH}/tpm/bin/install_plugins'" "run 'git clone https://github.com/tmux-plugins/tpm {TMUX_PLUGIN_MANAGER_PATH}/tpm && {TMUX_PLUGIN_MANAGER_PATH}/tpm/bin/install_plugins'"
run -b "${TMUX_PLUGIN_MANAGER_PATH}/tpm/tpm" run -b "${TMUX_PLUGIN_MANAGER_PATH}/tpm/tpm"

20
tmux/.local/bin/tmux_pane_tree Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env bash
# create a tree-style view
# of all open tmux panes
# and the command they are currently running
tmux ls -F'#{session_id}' | while read -r s; do
S=$(tmux ls -F'#{session_id}#{session_name}: #{T:tree_mode_format}' | grep ^"$s")
session_info=${S##$s}
session_name=$(echo "$session_info" | cut -d ':' -f 1)
if [[ -n "$1" ]] && [[ "$1" == "$session_name" ]]; then
echo -e "\033[1;34m$session_info\033[0m"
tmux lsw -t"$s" -F'#{window_id}' | while read -r w; do
W=$(tmux lsw -t"$s" -F'#{window_id}#{T:tree_mode_format} - #{pane_current_command}' | grep ^"$w")
H=$(tmux lsw -t"$s" -F'#{window_id}#H' | grep ^"$w")
echo " ﬌ ${W##$w}" | sed "s/\"${H##$w}\" //"
done
else
echo -e "\033[1m$session_info\033[0m"
fi
done