feat: logging, remote widget, ci fix
This commit is contained in:
@@ -9,7 +9,24 @@ alias zen='curl -s https://api.github.com/zen && echo'
|
||||
alias la='ls -la'
|
||||
alias vi='vim'
|
||||
alias copilot='gh copilot'
|
||||
alias cs='gh cs ssh'
|
||||
cs() {
|
||||
local codespace="${1:-}"
|
||||
if [[ -z "$codespace" ]]; then
|
||||
codespace="$(gh cs list --json name -q '.[].name' | fzf)" || return
|
||||
fi
|
||||
[[ -n "$TMUX" ]] && tmux rename-window "cs:$codespace"
|
||||
trap '[[ -n "$TMUX" ]] && tmux set automatic-rename on' EXIT INT TERM
|
||||
gh cs ssh -c "$codespace"
|
||||
local rc=$?
|
||||
trap - EXIT INT TERM
|
||||
[[ -n "$TMUX" ]] && tmux set automatic-rename on
|
||||
if (( rc == 0 )); then
|
||||
local log="${XDG_DATA_HOME:-$HOME/.local/share}/ssh/log"
|
||||
mkdir -p "$(dirname "$log")"
|
||||
printf '%s cs:%s\n' "$(date +%s)" "$codespace" >> "$log"
|
||||
fi
|
||||
return $rc
|
||||
}
|
||||
alias colby='copilot --allow-all-tools --allow-all-paths'
|
||||
alias gs='git s'
|
||||
alias gd='git d'
|
||||
@@ -26,12 +43,12 @@ f() { local f; f="$(fzf --preview 'head -100 {}')" && ${EDITOR:-vim} "$f"; }
|
||||
|
||||
ssh() {
|
||||
local ssh_target="${@: -1}"
|
||||
if [[ -n "$TMUX" ]]; then
|
||||
tmux rename-window "ssh:$ssh_target"
|
||||
fi
|
||||
|
||||
[[ -n "$TMUX" ]] && tmux rename-window "ssh:$ssh_target"
|
||||
trap '[[ -n "$TMUX" ]] && tmux set automatic-rename on' EXIT INT TERM
|
||||
command ssh "$@"
|
||||
local rc=$?
|
||||
trap - EXIT INT TERM
|
||||
[[ -n "$TMUX" ]] && tmux set automatic-rename on
|
||||
|
||||
if (( rc == 0 )); then
|
||||
local host="$ssh_target"
|
||||
@@ -50,8 +67,6 @@ ssh() {
|
||||
|
||||
printf '%s %s\n' "$(date +%s)" "$host" >> "$ssh_log"
|
||||
fi
|
||||
|
||||
[[ -n "$TMUX" ]] && tmux set automatic-rename on
|
||||
return $rc
|
||||
}
|
||||
s() { local h; h="$(_dots_ssh_hosts | fzf)" && ssh "$h"; }
|
||||
|
||||
@@ -106,21 +106,34 @@ _dots_load_keybindings() {
|
||||
zle -N _dots_edit_widget
|
||||
bindkey '^E' _dots_edit_widget
|
||||
|
||||
# Ctrl+G: SSH host picker
|
||||
# Ctrl+G: remote connect
|
||||
_dots_ssh_hosts() {
|
||||
local ssh_log="${XDG_DATA_HOME:-$HOME/.local/share}/ssh/log"
|
||||
local cs_cache="$_dots_cache_dir/codespaces"
|
||||
|
||||
# Refresh codespace cache in background if stale (>5 min)
|
||||
if [[ ! -f "$cs_cache" ]] || [[ -n "$(find "$cs_cache" -mmin +5 2>/dev/null)" ]]; then
|
||||
{ gh cs list --json name -q '.[].name' 2>/dev/null | sed 's/^/cs:/' > "$cs_cache.tmp" && mv "$cs_cache.tmp" "$cs_cache"; } &!
|
||||
fi
|
||||
|
||||
{
|
||||
if [[ -f "$ssh_log" ]]; then
|
||||
awk '{c[$2]++; t[$2]=$1} END {for(h in c) print c[h]*1000+t[h], h}' "$ssh_log" | sort -rn | awk '{print $2}'
|
||||
fi
|
||||
awk '/^Host / && !/\*/ {print $2}' ~/.ssh/config ~/.ssh/config.d/* 2>/dev/null
|
||||
awk '{print $1}' ~/.ssh/known_hosts 2>/dev/null | tr ',' '\n' | sed 's/\[//;s/\]:.*//'
|
||||
[[ -f "$cs_cache" ]] && cat "$cs_cache"
|
||||
} | awk '!seen[$0]++'
|
||||
}
|
||||
_dots_ssh_widget() {
|
||||
local host
|
||||
host="$(_dots_ssh_hosts | fzf)" || { zle reset-prompt; return; }
|
||||
BUFFER="ssh $host"
|
||||
local target
|
||||
target="$(_dots_ssh_hosts | fzf)" || { zle reset-prompt; return; }
|
||||
if [[ "$target" == cs:* ]]; then
|
||||
BUFFER="cs ${target#cs:}"
|
||||
else
|
||||
BUFFER="ssh $target"
|
||||
fi
|
||||
zle reset-prompt
|
||||
zle accept-line
|
||||
}
|
||||
zle -N _dots_ssh_widget
|
||||
|
||||
Reference in New Issue
Block a user