diff --git a/scripts/backup.sh b/scripts/backup.sh index 1c5c151..3b5a7b7 100755 --- a/scripts/backup.sh +++ b/scripts/backup.sh @@ -17,6 +17,9 @@ backup_folder ~/.config/rua-scripts ./ ./rua-scripts backup_folder ~/.config/lazygit ./ ./lazygit/ # tmux backup_folder ~/.tmux/tmux.conf ./tmux/tmux.conf ./tmux/tmux.conf +backup_folder ~/.tmux/renew_env.sh ./tmux/renew_env.sh ./tmux/renew_env.sh +backup_folder ~/.tmux/tmux.remote.conf ./tmux/tmux.remote.conf ./tmux/tmux.remote.conf +backup_folder ~/.tmux/yank.sh ./tmux/yank.sh ./tmux/yank.sh if [[ $OSTYPE == "linux"* ]]; then # hyprland diff --git a/tmux/renew_env.sh b/tmux/renew_env.sh new file mode 100755 index 0000000..31a4b7c --- /dev/null +++ b/tmux/renew_env.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -eu + +pane_fmt="#{pane_id} #{pane_in_mode} #{pane_input_off} #{pane_dead} #{pane_current_command}" +tmux list-panes -s -F "$pane_fmt" | awk ' + $2 == 0 && $3 == 0 && $4 == 0 && $5 ~ /(bash|zsh|ksh|fish)/ { print $1 } +' | while read -r pane_id; do + # renew environment variables according to update-environment tmux option + # also clear screen + tmux send-keys -t "$pane_id" 'Enter' 'eval "$(tmux show-env -s)"' 'Enter' 'C-l' +done; \ No newline at end of file diff --git a/tmux/tmux.remote.conf b/tmux/tmux.remote.conf new file mode 100644 index 0000000..ea385bc --- /dev/null +++ b/tmux/tmux.remote.conf @@ -0,0 +1,10 @@ +# show status bar at bottom for remote session, +# so it do not stack together with local session's one +set -g status-position bottom + +# Set port of SSH remote tunnel, where tmux will pipe buffers to transfer on local machine for copy +set -g @copy_backend_remote_tunnel_port 11988 + +# In remote mode we don't show "clock" and "battery status" widgets +set -g status-left "$wg_session" +set -g status-right "#{prefix_highlight} $wg_is_keys_off $wg_is_zoomed #{sysstat_cpu} | #{sysstat_mem} | #{sysstat_loadavg} | $wg_user_host | #{online_status}" diff --git a/tmux/yank.sh b/tmux/yank.sh new file mode 100755 index 0000000..83686c6 --- /dev/null +++ b/tmux/yank.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +set -eu + +is_app_installed() { + type "$1" &>/dev/null +} + +# get data either form stdin or from file +buf=$(cat "$@") + +copy_backend_remote_tunnel_port=$(tmux show-option -gvq "@copy_backend_remote_tunnel_port") +copy_use_osc52_fallback=$(tmux show-option -gvq "@copy_use_osc52_fallback") + +# Resolve copy backend: pbcopy (OSX), reattach-to-user-namespace (OSX), xclip/xsel (Linux) +copy_backend="" +if is_app_installed pbcopy; then + copy_backend="pbcopy" +elif is_app_installed reattach-to-user-namespace; then + copy_backend="reattach-to-user-namespace pbcopy" +elif [ -n "${DISPLAY-}" ] && is_app_installed xsel; then + copy_backend="xsel -i --clipboard" +elif [ -n "${DISPLAY-}" ] && is_app_installed xclip; then + copy_backend="xclip -i -f -selection primary | xclip -i -selection clipboard" +elif [ -n "${copy_backend_remote_tunnel_port-}" ] \ + && (netstat -f inet -nl 2>/dev/null || netstat -4 -nl 2>/dev/null) \ + | grep -q "[.:]$copy_backend_remote_tunnel_port"; then + copy_backend="nc localhost $copy_backend_remote_tunnel_port" +fi + +# if copy backend is resolved, copy and exit +if [ -n "$copy_backend" ]; then + printf "%s" "$buf" | eval "$copy_backend" + exit; +fi + + +# If no copy backends were eligible, decide to fallback to OSC 52 escape sequences +# Note, most terminals do not handle OSC +if [ "$copy_use_osc52_fallback" == "off" ]; then + exit; +fi + +# Copy via OSC 52 ANSI escape sequence to controlling terminal +buflen=$( printf %s "$buf" | wc -c ) + +# https://sunaku.github.io/tmux-yank-osc52.html +# The maximum length of an OSC 52 escape sequence is 100_000 bytes, of which +# 7 bytes are occupied by a "\033]52;c;" header, 1 byte by a "\a" footer, and +# 99_992 bytes by the base64-encoded result of 74_994 bytes of copyable text +maxlen=74994 + +# warn if exceeds maxlen +if [ "$buflen" -gt "$maxlen" ]; then + printf "input is %d bytes too long" "$(( buflen - maxlen ))" >&2 +fi + +# build up OSC 52 ANSI escape sequence +esc="\033]52;c;$( printf %s "$buf" | head -c $maxlen | base64 | tr -d '\r\n' )\a" +esc="\033Ptmux;\033$esc\033\\" + +# resolve target terminal to send escape sequence +# if we are on remote machine, send directly to SSH_TTY to transport escape sequence +# to terminal on local machine, so data lands in clipboard on our local machine +pane_active_tty=$(tmux list-panes -F "#{pane_active} #{pane_tty}" | awk '$1=="1" { print $2 }') +target_tty="${SSH_TTY:-$pane_active_tty}" + +printf "$esc" > "$target_tty" diff --git a/zsh/zshrc b/zsh/zshrc index 2dd55a5..331572f 100644 --- a/zsh/zshrc +++ b/zsh/zshrc @@ -7,6 +7,7 @@ alias icat="kitty +kitten icat" alias kssh="kitty +kitten ssh" alias ll="ls -lhtr" # Environmental variables +export EDITOR="nvim" # node export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ export NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/