Compare commits
1 Commits
display-po
...
future
| Author | SHA1 | Date | |
|---|---|---|---|
| cc688392da |
15
.conduit.yaml
Normal file
15
.conduit.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
- location: ~/.config/tmux
|
||||
- apt:
|
||||
- libevent-dev
|
||||
- ncurses-dev
|
||||
- xsel
|
||||
- repo:
|
||||
- url: 'https://github.com/tmux/tmux.git'
|
||||
location: ~/.local/src/tmux
|
||||
branch: 2.6
|
||||
actions:
|
||||
- command: ./configure --prefix=$HOME/.local
|
||||
- command: {install: make -j8 install, remove: make uninstall}
|
||||
- symlink:
|
||||
- {src: tmux.conf, dst: ~/.tmux.conf}
|
||||
40
agent.sh
40
agent.sh
@@ -1,40 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
# Get the directory passed as argument (from #{pane_current_path})
|
||||
dir="${1:-$HOME}"
|
||||
# Use the directory basename as window name
|
||||
window_name="$(basename "$dir")"
|
||||
session_name="agent"
|
||||
|
||||
# Create the agent session if it doesn't exist
|
||||
if ! tmux has-session -t "$session_name" 2>/dev/null; then
|
||||
tmux new-session -ds "$session_name" -c "$dir" -n "$window_name" claude
|
||||
# Store the directory in a window option for later matching
|
||||
tmux set-window-option -t "$session_name" @agent_dir "$dir"
|
||||
tmux attach-session -t "$session_name"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Search for an existing window with matching directory
|
||||
target_window=""
|
||||
while IFS=$'\t' read -r window_id window_dir; do
|
||||
if [ "$window_dir" = "$dir" ]; then
|
||||
target_window="$window_id"
|
||||
break
|
||||
fi
|
||||
done < <(tmux list-windows -t "$session_name" -F '#{window_id} #{@agent_dir}')
|
||||
|
||||
if [ -n "$target_window" ]; then
|
||||
# Select the existing window
|
||||
tmux select-window -t "$target_window"
|
||||
else
|
||||
# Create a new window with claude
|
||||
tmux new-window -t "$session_name" -n "$window_name" -c "$dir" claude
|
||||
# Store the directory in a window option for later matching
|
||||
tmux set-window-option -t "$session_name" @agent_dir "$dir"
|
||||
fi
|
||||
|
||||
# Attach to the session
|
||||
tmux attach-session -t "$session_name"
|
||||
@@ -1,96 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Compare the current tmux version against a given version.
|
||||
# Exit: 0 if comparison is true, 1 if false
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
usage() {
|
||||
echo "usage: $0 <operator> <version>" >&2
|
||||
echo "operators: < <= == >= >" >&2
|
||||
}
|
||||
|
||||
if [[ ${1:-} == "-h" || ${1:-} == "--help" ]]; then
|
||||
usage
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ $# -ne 2 ]]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
operator="$1"
|
||||
target_version="$2"
|
||||
|
||||
# Extract tmux version (e.g., "tmux 3.3a" -> "3.3a")
|
||||
current_version=$(tmux -V | sed 's/^tmux //')
|
||||
|
||||
# Compare two version strings
|
||||
# Returns: -1 if v1 < v2, 0 if v1 == v2, 1 if v1 > v2
|
||||
compare_versions() {
|
||||
local v1="$1"
|
||||
local v2="$2"
|
||||
|
||||
# Strip trailing letters (e.g., "3.3a" -> "3.3") and save them
|
||||
local v1_suffix="${v1##*[0-9]}"
|
||||
local v2_suffix="${v2##*[0-9]}"
|
||||
v1="${v1%[a-zA-Z]*}"
|
||||
v2="${v2%[a-zA-Z]*}"
|
||||
|
||||
# Split into components
|
||||
IFS='.' read -ra v1_parts <<< "$v1"
|
||||
IFS='.' read -ra v2_parts <<< "$v2"
|
||||
|
||||
# Compare numeric parts
|
||||
local max_len=$(( ${#v1_parts[@]} > ${#v2_parts[@]} ? ${#v1_parts[@]} : ${#v2_parts[@]} ))
|
||||
for ((i = 0; i < max_len; i++)); do
|
||||
local p1="${v1_parts[i]:-0}"
|
||||
local p2="${v2_parts[i]:-0}"
|
||||
if ((p1 < p2)); then
|
||||
echo -1
|
||||
return
|
||||
elif ((p1 > p2)); then
|
||||
echo 1
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
# Numeric parts equal, compare suffixes (no suffix < a < b < ...)
|
||||
# A letter suffix indicates a patch release, so 3.6a > 3.6
|
||||
if [[ -z "$v1_suffix" && -n "$v2_suffix" ]]; then
|
||||
echo -1
|
||||
return
|
||||
elif [[ -n "$v1_suffix" && -z "$v2_suffix" ]]; then
|
||||
echo 1
|
||||
return
|
||||
elif [[ "$v1_suffix" < "$v2_suffix" ]]; then
|
||||
echo -1
|
||||
return
|
||||
elif [[ "$v1_suffix" > "$v2_suffix" ]]; then
|
||||
echo 1
|
||||
return
|
||||
fi
|
||||
|
||||
echo 0
|
||||
}
|
||||
|
||||
result=$(compare_versions "$current_version" "$target_version")
|
||||
|
||||
case "$operator" in
|
||||
'<')
|
||||
[[ "$result" -eq -1 ]] && exit 0 || exit 1 ;;
|
||||
'<=')
|
||||
[[ "$result" -le 0 ]] && exit 0 || exit 1 ;;
|
||||
'==')
|
||||
[[ "$result" -eq 0 ]] && exit 0 || exit 1 ;;
|
||||
'>=')
|
||||
[[ "$result" -ge 0 ]] && exit 0 || exit 1 ;;
|
||||
'>')
|
||||
[[ "$result" -eq 1 ]] && exit 0 || exit 1 ;;
|
||||
*)
|
||||
echo "error: invalid operator: $operator" >&2
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
session_name=$(tmux display-message -p '#S')
|
||||
session_layout=~/.local/share/tmux/layouts/session-$session_name
|
||||
if [ -f $session_layout ]; then
|
||||
$session_layout
|
||||
elif [ "$session_name" != "agent" ]; then
|
||||
tmux rename-window home
|
||||
fi
|
||||
45
install.sh
45
install.sh
@@ -1,45 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [ ! -d $HOME/.local/share/tmux/layouts ]; then
|
||||
mkdir -p $HOME/.local/share/tmux/layouts
|
||||
echo changed created layouts directory
|
||||
fi
|
||||
|
||||
symlink() {
|
||||
local source=$1
|
||||
local dest=$2
|
||||
if [ -L $dest ]; then
|
||||
local target=`readlink $dest`
|
||||
if [ "$target" != "$source" ]; then
|
||||
rm $dest
|
||||
ln -s $source $dest
|
||||
echo changed replace incorrect symlink $dest
|
||||
fi
|
||||
elif [ -f $dest ]; then
|
||||
error symlink failed $dest exists but is a regular file
|
||||
else
|
||||
ln -s $source $dest
|
||||
echo changed created symlink $dest
|
||||
fi
|
||||
}
|
||||
|
||||
symlink $HOME/.config/tmux/tmux.conf \
|
||||
$HOME/.tmux.conf
|
||||
symlink $HOME/.config/tmux/layouts/session-config \
|
||||
$HOME/.local/share/tmux/layouts/session-config
|
||||
symlink $HOME/.config/tmux/layouts/session-infra \
|
||||
$HOME/.local/share/tmux/layouts/session-infra
|
||||
symlink $HOME/.config/tmux/layouts/session-main \
|
||||
$HOME/.local/share/tmux/layouts/session-main
|
||||
symlink $HOME/.config/tmux/layouts/session-visor \
|
||||
$HOME/.local/share/tmux/layouts/session-visor
|
||||
symlink $HOME/.config/tmux/layouts/session-work \
|
||||
$HOME/.local/share/tmux/layouts/session-work
|
||||
symlink $HOME/.config/tmux/layouts/window-auto \
|
||||
$HOME/.local/share/tmux/layouts/window-auto
|
||||
symlink $HOME/.config/tmux/layouts/window-tall \
|
||||
$HOME/.local/share/tmux/layouts/window-tall
|
||||
symlink $HOME/.config/tmux/layouts/window-wide-left \
|
||||
$HOME/.local/share/tmux/layouts/window-wide-left
|
||||
symlink $HOME/.config/tmux/layouts/window-wide-right \
|
||||
$HOME/.local/share/tmux/layouts/window-wide-right
|
||||
@@ -1,32 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
interpreters=()
|
||||
|
||||
add() {
|
||||
local interp=$1
|
||||
if command -v $interp &> /dev/null; then
|
||||
interpreters+=($(which $interp))
|
||||
fi
|
||||
}
|
||||
|
||||
add ipython
|
||||
add python
|
||||
add cling
|
||||
add lua
|
||||
add luajit
|
||||
add node
|
||||
|
||||
add bash
|
||||
add zsh
|
||||
add fish
|
||||
|
||||
interpreter=$(
|
||||
echo "${interpreters[@]}" | tr ' ' '\n' |
|
||||
fzf --layout=reverse --info=hidden --border=none --cycle
|
||||
)
|
||||
|
||||
$interpreter
|
||||
|
||||
exit
|
||||
4
layouts/2vt
Normal file
4
layouts/2vt
Normal file
@@ -0,0 +1,4 @@
|
||||
# vim: ft=tmux
|
||||
select-pane -t 0
|
||||
split-window -v -p 34
|
||||
select-pane -t 1
|
||||
@@ -1,28 +0,0 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
tmux rename-window home
|
||||
|
||||
tmux new-window -c ~/.config/nvim
|
||||
tmux rename-window config/nvim
|
||||
`dirname $0`/window-auto
|
||||
|
||||
tmux new-window -c ~/.config/zsh
|
||||
tmux rename-window config/zsh
|
||||
`dirname $0`/window-auto
|
||||
|
||||
tmux new-window -c ~/.config/tmux
|
||||
tmux rename-window config/tmux
|
||||
`dirname $0`/window-auto
|
||||
|
||||
if [ -d ~/.config/work ]; then
|
||||
tmux new-window -c ~/.config/work
|
||||
tmux rename-window config/work
|
||||
`dirname $0`/window-auto
|
||||
fi
|
||||
|
||||
tmux new-window -c ~/.config/local
|
||||
tmux rename-window config/local
|
||||
tmux move-window -s config:config/local -t 9
|
||||
`dirname $0`/window-auto
|
||||
|
||||
tmux select-window -t config:home
|
||||
@@ -1,12 +0,0 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
tmux rename-window home
|
||||
|
||||
for entry in ~/Projects/infra/*; do
|
||||
if [ ! -d $entry ]; then
|
||||
continue
|
||||
fi
|
||||
tmux new-window -c $entry
|
||||
tmux rename-window $(basename $entry)
|
||||
`dirname $0`/window-auto
|
||||
done
|
||||
@@ -1,5 +0,0 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
tmux rename-session main
|
||||
tmux rename-window home
|
||||
`dirname $0`/window-auto
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/usr/bin/env -S tmux source-file
|
||||
|
||||
rename-window home
|
||||
if 'command -v btop &> /dev/null' \
|
||||
'split-window -h btop' \
|
||||
'split-window -h htop'
|
||||
select-pane -t visor:home.1
|
||||
|
||||
# vim: ft=tmux
|
||||
@@ -1,9 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
tmux rename-window work
|
||||
tmux rename-window home
|
||||
$(dirname $0)/window-auto
|
||||
|
||||
tmux new-window -c ~/Projects/modularml/modular
|
||||
tmux rename-window modularml/modular
|
||||
$(dirname $0)/window-auto
|
||||
@@ -1,27 +0,0 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
cols=`tmux display -p "#{pane_width}"`
|
||||
lines=`tmux display -p "#{pane_height}"`
|
||||
width=$(( $cols / 2.5 ))
|
||||
height=$lines.0
|
||||
ratio=$(( ($width / $height) * 100 ))
|
||||
|
||||
if [[ $cols -lt 140 ]] && [[ $lines -lt 70 ]]; then
|
||||
# terminal is too small
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ $ratio -ge 100 ]]; then
|
||||
# terminal is wide or square
|
||||
if [[ $cols -gt 240 ]]; then
|
||||
# terminal is wide and large
|
||||
`dirname $0`/window-wide-right
|
||||
else
|
||||
# terminal is wide and small
|
||||
tmux split-window -h -c '#{pane_current_path}'
|
||||
tmux select-pane -t 1
|
||||
fi
|
||||
else
|
||||
# terminal is tall
|
||||
`dirname $0`/window-tall
|
||||
fi
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/usr/bin/env -S tmux source-file
|
||||
|
||||
split-window -v -l 34% -c '#{pane_current_path}'
|
||||
select-pane -t 1
|
||||
|
||||
# vim: ft=tmux
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cols=`tmux display -p "#{pane_width}"`
|
||||
|
||||
if [ "$LAYOUT_FULLSCREEN" = "1" ]; then
|
||||
tmux split-window -h -l 37% -c '#{pane_current_path}'
|
||||
tmux select-pane -t 1
|
||||
else
|
||||
tmux split-window -h -l 43% -c '#{pane_current_path}'
|
||||
tmux select-pane -t 1
|
||||
fi
|
||||
@@ -1,11 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cols=`tmux display -p "#{pane_width}"`
|
||||
|
||||
if [ "$TMUX_LAYOUT_FULLSCREEN" = "1" ]; then
|
||||
tmux split-window -h -l 63% -c '#{pane_current_path}'
|
||||
tmux select-pane -t 1
|
||||
else
|
||||
tmux split-window -h -l 57% -c '#{pane_current_path}'
|
||||
tmux select-pane -t 1
|
||||
fi
|
||||
20
project.sh
20
project.sh
@@ -1,20 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
projects=()
|
||||
|
||||
# Get list of projects from ~/Projects
|
||||
for dir in $HOME/Projects/**/*; do
|
||||
if [ -d $dir ]; then
|
||||
projects+=(${dir#$HOME/Projects/})
|
||||
fi
|
||||
done
|
||||
|
||||
project=$(
|
||||
echo "${projects[@]}" | tr ' ' '\n' | sort -u |
|
||||
fzf --layout=reverse --info=hidden --border=rounded --cycle
|
||||
)
|
||||
|
||||
tmux new-window -n $project -c ~/Projects/$project
|
||||
~/.local/share/tmux/layouts/window-auto
|
||||
26
session.sh
26
session.sh
@@ -1,26 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
sessions=()
|
||||
|
||||
# Get list of predefined session layouts
|
||||
for item in $HOME/.local/share/tmux/layouts/session-*; do
|
||||
sessions+=(${item#$HOME/.local/share/tmux/layouts/session-})
|
||||
done
|
||||
|
||||
# Get list of existing sessions
|
||||
sessions+=($(tmux list-sessions | awk -F: '{print $1}'))
|
||||
|
||||
# Pick the session with fzf (remove duplicates)
|
||||
session=$(
|
||||
echo "${sessions[@]}" | tr ' ' '\n' | sort -u |
|
||||
fzf --layout=reverse --info=hidden --border=rounded --cycle
|
||||
)
|
||||
|
||||
# Create the session if it doesn't alreayd exist
|
||||
tmux list-sessions | grep "^$session:" &> /dev/null || \
|
||||
tmux new-session -Ads $session -c $HOME
|
||||
|
||||
# Switch to the session
|
||||
tmux switch-client -t $session
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
script_dir=`dirname $0`
|
||||
|
||||
if [ `uname` = Darwin ]; then
|
||||
cp $script_dir/system-info.plist ~/Library/LaunchAgents/system-info.plist
|
||||
launchctl load -w ~/Library/LaunchAgents/system-info.plist
|
||||
else
|
||||
if [ "$WSL_DISTRO_NAME" = "" ]; then
|
||||
cp $script_dir/system-info.service ~/.config/systemd/user/system-info.service
|
||||
systemctl --user enable system-info
|
||||
systemctl --user start system-info
|
||||
else
|
||||
echo -e "\033[0;33mwarning:\033[0m WSL detected, system-info systemd service disabled"
|
||||
fi
|
||||
fi
|
||||
@@ -1,13 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [ `uname` = Darwin ]; then
|
||||
launchctl unload ~/Library/LaunchAgents/system-info.plist
|
||||
rm ~/Library/LaunchAgents/system-info.plist
|
||||
else
|
||||
if [ "$WSL_DISTRO_NAME" = "" ]; then
|
||||
systemctl --user stop system-info
|
||||
systemctl --user disable system-info
|
||||
else
|
||||
echo -e "\033[0;33mwarning:\033[0m WSL detected, system-info systemd service disabled"
|
||||
fi
|
||||
fi
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cache_dir=~/.cache/tmux
|
||||
cache_file=$cache_dir/system-info
|
||||
|
||||
# Make sure the output directory exists.
|
||||
if [ ! -d $cache_dir ]; then
|
||||
mkdir -p $cache_dir
|
||||
fi
|
||||
|
||||
if command -v sensors &> /dev/null; then
|
||||
if sensors 'coretemp-isa-0000' &> /dev/null; then
|
||||
function get_cpu_temp() {
|
||||
sensors 'coretemp-isa-0000' | awk 'NR == 3 { print $4 }'
|
||||
}
|
||||
elif sensors 'k10temp-pci-00c3' &> /dev/null; then
|
||||
function get_cpu_temp {
|
||||
sensors 'k10temp-pci-00c3' | grep 'Tctl:' | awk '{ print $2 }'
|
||||
}
|
||||
else
|
||||
function get_cpu_temp {
|
||||
echo ''
|
||||
}
|
||||
fi
|
||||
else
|
||||
function get_cpu_temp {
|
||||
echo 'N/A°C'
|
||||
}
|
||||
fi
|
||||
|
||||
if upower -e | grep 'BAT' 2> /dev/null; then
|
||||
function get_battery {
|
||||
local output=$(acpi -b)
|
||||
local charging=$(echo $output | awk '{ print $3 }')
|
||||
local percentage=$(echo $output | awk '{ print $4 }')
|
||||
if [ "$charging" = "Charging," ];then
|
||||
echo $percentage | awk '$battery ~ /.*/ {
|
||||
printf " %d%% %s\n", $battery, substr("", int($battery / 100 * 11), 1)
|
||||
}'
|
||||
else
|
||||
echo $percentage | awk '$battery ~ /.*/ {
|
||||
printf " %d%% %s\n", $battery, substr("", int($battery / 100 * 11), 1)
|
||||
}'
|
||||
fi
|
||||
}
|
||||
else
|
||||
function get_battery {
|
||||
echo ''
|
||||
}
|
||||
fi
|
||||
|
||||
# Cleanup cache file when interrupted.
|
||||
trap '[ -f $cache_file ] && rm $cache_file; exit' INT
|
||||
trap '[ -f $cache_file ] && rm $cache_file; exit' TERM
|
||||
|
||||
while true; do
|
||||
# Parse the current CPU load on all cores/threads.
|
||||
cpu_load=" `mpstat -P ALL -n 1 -u 1 -o JSON | \
|
||||
jq '.sysstat.hosts[0].statistics[0]["cpu-load"][1:]|.[].idle' | \
|
||||
awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 100 * 9), 1) }'`"
|
||||
|
||||
# Parse the current CPU package temperature.
|
||||
cpu_temp=$(get_cpu_temp)
|
||||
|
||||
# Get the battery status if present.
|
||||
battery=$(get_battery)
|
||||
|
||||
# Write to the cache file.
|
||||
echo "$cpu_temp$cpu_load$battery" > $cache_file
|
||||
done
|
||||
@@ -1,49 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cache_dir=~/.cache/tmux
|
||||
cache_file=$cache_dir/system-info
|
||||
|
||||
# Make sure the output directory exists.
|
||||
if [ ! -d $cache_dir ]; then
|
||||
mkdir -p $cache_dir
|
||||
fi
|
||||
|
||||
# Cleanup cache file when interrupted.
|
||||
trap '[ -f $cache_file ] && rm $cache_file; exit' INT
|
||||
trap '[ -f $cache_file ] && rm $cache_file; exit' TERM
|
||||
|
||||
if cat /proc/cpuinfo | grep -i intel > /dev/null; then
|
||||
cpu_temp_sensor="/intelcpu/0/temperature/0"
|
||||
elif cat /proc/cpuinfo | grep -i amd > /dev/null; then
|
||||
cpu_temp_sensor="/amdcpu/0/temperature/0"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
|
||||
powershell="/mnt/c/Windows/System32/WindowsPowerShell/v1.0//powershell.exe"
|
||||
|
||||
while true; do
|
||||
# Assumes OpenHardwareMonitor is running and emitting data to WMI so we can
|
||||
# access it via the Windows hosts powershell.exe.
|
||||
raw_cpu_temp=$($powershell -NoProfile \
|
||||
"(Get-WmiObject -Namespace \"root/OpenHardwareMonitor\" -Query 'select Value from Sensor WHERE Identifier LIKE \"$cpu_temp_sensor\"').Value" \
|
||||
| sed 's/\r//')
|
||||
cpu_temp=$(printf "%.1f°C" "$raw_cpu_temp")
|
||||
|
||||
cpu_load=" `mpstat -P ALL -n 1 -u 1 -o JSON | \
|
||||
jq '.sysstat.hosts[0].statistics[0]["cpu-load"][1:]|.[].idle' | \
|
||||
awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 100 * 9), 1) }'`"
|
||||
|
||||
raw_battery=$($powershell -NoProfile \
|
||||
"(Get-WmiObject win32_battery).EstimatedChargeRemaining" \
|
||||
| sed 's/\r//')
|
||||
if [ "" != "$raw_battery" ]; then
|
||||
battery="$(echo $raw_battery | awk '$battery ~ /.*/ {
|
||||
printf " %d%% %s\n", $battery, substr("", int($battery / 100 * 11), 1)
|
||||
}')"
|
||||
fi
|
||||
|
||||
echo "$cpu_temp$cpu_load$battery" > $cache_file
|
||||
# echo "$(locale)" > $cache_file
|
||||
sleep 2
|
||||
done
|
||||
@@ -1,47 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
cache_dir=~/.cache/tmux
|
||||
cache_file=$cache_dir/system-info
|
||||
|
||||
# Make sure the output directory exists.
|
||||
if [ ! -d $cache_dir ]; then
|
||||
mkdir -p $cache_dir
|
||||
fi
|
||||
|
||||
[ -f $cache_dir/cpu-temp ] && rm $cache_dir/cpu-temp
|
||||
|
||||
# Cleanup cache file when interrupted.
|
||||
trap '[ -f $cache_file ] && rm $cache_file; exit' INT
|
||||
trap '[ -f $cache_file ] && rm $cache_file; exit' TERM
|
||||
|
||||
# Check if a battery is installed.
|
||||
ioreg -w0 -l | grep BatteryInstalled &> /dev/null && \
|
||||
has_battery=true || has_battery=false
|
||||
|
||||
while true; do
|
||||
# Get the current CPU temperature.
|
||||
cpu_temp=$(
|
||||
~/.local/bin/iSMC -o json temp | jq '."PMU tdie1".quantity' | xargs printf "%.1f°C "
|
||||
)
|
||||
|
||||
cpu_load=$(sudo powermetrics --format text \
|
||||
--sample-rate 1200 --sample-count 1 --samplers cpu_power |
|
||||
grep --color=never -E 'CPU \d active residency:' |
|
||||
gawk '{print $5}' |
|
||||
gawk '$idle ~ /[-.0-9]*/ { printf "%s", substr(" ▁▂▃▄▅▆▇█", int($idle / 100 * 9), 1) }'
|
||||
)
|
||||
|
||||
# Parse the current battery charge percentage.
|
||||
if $has_battery; then
|
||||
raw_battery="$(pmset -g batt | \
|
||||
grep --color=never 'InternalBattery' | \
|
||||
grep --color=never -Eo '\d+%' | \
|
||||
grep --color=never -Eo '\d+')"
|
||||
battery="$(echo $raw_battery | gawk '$battery ~ /.*/ {
|
||||
printf " %d%% %s\n", $battery, substr("", int($battery / 100 * 11), 1)
|
||||
}')"
|
||||
fi
|
||||
|
||||
# Write to the cache file.
|
||||
echo "$cpu_temp$cpu_load$battery" > $cache_file
|
||||
done
|
||||
@@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>system-info</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Users/benie/.config/tmux/system-info/system-info-macOS.sh</string>
|
||||
</array>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
34
theme.tmux
34
theme.tmux
@@ -1,34 +0,0 @@
|
||||
# Left status style
|
||||
if -b '[ "$WSL_DISTRO_NAME" != "" ]' \
|
||||
'setw -g status-left " #(hostname)|#{WSL_DISTRO_NAME}|#{session_name}"' \
|
||||
'setw -g status-left " #(hostname -s)|#{session_name}"'
|
||||
setw -g status-left-style fg=colour240,bg=colour233
|
||||
setw -g status-left-length 32
|
||||
|
||||
# Centre status style
|
||||
setw -g status-style fg=colour240,bg=colour233
|
||||
|
||||
# Right status style shows system info, date, and time.
|
||||
setw -g status-right "#[fg=colour240]#(cat ~/.cache/tmux/system-info)#[fg=white] %a %d-%m-%y %H:%M "
|
||||
setw -g status-right-style fg=white,bg=colour233
|
||||
if -b '[ "`uname`" = "Darwin" ]' \
|
||||
'run "tmux setw -g status-right-length $((`sysctl -n hw.ncpu` + 48))"' \
|
||||
'run "tmux setw -g status-right-length $((`nproc --all` + 48))"'
|
||||
|
||||
# Active window status style
|
||||
setw -g window-status-current-format " #{window_index}: #{window_name}"
|
||||
setw -g window-status-current-style fg=white,bg=colour233
|
||||
|
||||
# Inactive window status style
|
||||
setw -g window-status-format " #{window_index}: #{window_name}"
|
||||
setw -g window-status-style fg=colour240,bg=colour233
|
||||
|
||||
# Pane border style
|
||||
set -g pane-border-style fg=colour233,bg=colour233
|
||||
set -g pane-active-border-style fg=colour235,bg=colour235
|
||||
|
||||
# Command line window list selection
|
||||
set-window-option -g mode-style fg=white,bg=colour237
|
||||
set-option -g message-style fg=white,bg=colour237
|
||||
|
||||
# vim: ft=tmux
|
||||
176
tmux.conf
176
tmux.conf
@@ -1,12 +1,3 @@
|
||||
# Address vim mode switching delay & garbage text on start
|
||||
set -s escape-time 1
|
||||
|
||||
# Set global hooks to perform actions when events occur
|
||||
set-hook -g session-created 'run ~/.config/tmux/hooks/session-create.sh'
|
||||
|
||||
# Set the tmux version to check for command support
|
||||
run 'tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-8)'
|
||||
|
||||
# Use vim keybindings in copy mode
|
||||
set -g mode-keys vi
|
||||
|
||||
@@ -15,27 +6,26 @@ unbind C-b
|
||||
set -g prefix C-Space
|
||||
bind Space send-prefix
|
||||
|
||||
# Address vim mode switching delay
|
||||
set -s escape-time 0
|
||||
|
||||
# Increase scrollback buffer size
|
||||
set -g history-limit 1000000
|
||||
set -g history-limit 50000
|
||||
|
||||
# Set tmux messages display time to 4 seconds
|
||||
set -g display-time 4000
|
||||
|
||||
# Refresh 'status-left' and 'status-right' more often
|
||||
set -g status-interval 2
|
||||
set -g status-interval 5
|
||||
|
||||
# Upgrade $TERM
|
||||
set -g default-terminal "tmux-256color"
|
||||
|
||||
# Enable true-color
|
||||
if '~/.config/tmux/check-version.sh "<" 3.2' \
|
||||
'set-option -as terminal-features ",xterm*:Tc"' \
|
||||
'set-option -as terminal-features ",xterm*:RGB"'
|
||||
|
||||
# Focus events enabled for terminals that support them
|
||||
set -g focus-events on
|
||||
|
||||
# Aggressively resize the chosen window to smallest/largest session
|
||||
# TODO: Change this comment to something that explains the setting
|
||||
# super useful when using "grouped sessions" and multi-monitor setup
|
||||
setw -g aggressive-resize on
|
||||
|
||||
# Start window & pane index at 1
|
||||
@@ -43,123 +33,79 @@ set -g pane-base-index 1
|
||||
|
||||
# Enable mouse support
|
||||
set-option -g mouse on
|
||||
# Prevent mouse click up events exiting copy mode
|
||||
unbind -T copy-mode-vi MouseDragEnd1Pane
|
||||
|
||||
# Enable changing cursor shape per pane, vim or zsh should emit escape
|
||||
# sequences to change cursor shape.
|
||||
# iTerm2 only requires this before tmux 2.9
|
||||
if '[ -n $ITERM_PROFILE ] && ~/.config/tmux/check-version.sh "<" 2.9' \
|
||||
'set -ga terminal-overrides "*:Ss=\E]1337;CursorShape=%p1%d\7"'
|
||||
# VTE compatible terminals.
|
||||
if '[ ! -n $ITERM_PROFILE ]' \
|
||||
'set -ga terminal-overrides "*:Ss=\E[%p1%d q:Se=\E[2 q"'
|
||||
# Enable changing cursor shape per pane in iTerm2 or VTE compatible terminals,
|
||||
# vim or zsh should emit VTE compatible escape sequences to change cursor shape
|
||||
if -b '[ -n $ITERM_PROFILE ]' \
|
||||
"set -ga terminal-overrides '*:Ss=\E]1337;CursorShape=%p1%d\7'" \
|
||||
"set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[2 q'"
|
||||
|
||||
# Enable strikethrough on VTE compatible terminals.
|
||||
set -ga terminal-overrides 'xterm*:smxx=\E[9m'
|
||||
|
||||
# Binding to create window-auto layout
|
||||
bind a run-shell ~/.local/share/tmux/layouts/window-auto
|
||||
# TODO: bind A run-shell ~/.local/share/tmux/layouts/window-auto --refresh
|
||||
|
||||
# Set only on macOS where it's required
|
||||
# Set only on OS X where it's required
|
||||
if -b '[ "`uname`" = "Darwin" ]' \
|
||||
'set -g default-command "reattach-to-user-namespace -l $SHELL"'
|
||||
|
||||
if -b '~/.config/tmux/check-version.sh ">" 3.2' {
|
||||
# Open a popup with running the default shell
|
||||
bind T display-popup -S fg=#54546D -b rounded -d '#{pane_current_path}' -E $SHELL
|
||||
# Open a popup with session creator/switcher
|
||||
bind S display-popup -B -w 60 -h 10 -E '~/.config/tmux/session.sh'
|
||||
# Open a popup with project selector
|
||||
bind P display-popup -B -w 60 -h 10 -E '~/.config/tmux/project.sh'
|
||||
# Open a popup to pick an interpreter then launch it
|
||||
bind I display-popup -S fg=#54546D -b rounded -d '#{pane_current_path}' -E '$SHELL -i ~/.config/tmux/interpreter.sh'
|
||||
# Open a popup with AI agent session for current directory
|
||||
bind A display-popup -S fg=#54546D -b rounded -w 90% -h 90% -E '~/.config/tmux/agent.sh "#{pane_current_path}"'
|
||||
}
|
||||
"set -g default-command 'reattach-to-user-namespace -l $SHELL'"
|
||||
|
||||
# Restore old next/previous window bindings
|
||||
bind C-n next-window
|
||||
bind C-p previous-window
|
||||
|
||||
# Kill current window
|
||||
bind W kill-window
|
||||
|
||||
# Make new splits open in current directory
|
||||
bind '"' split-window -c '#{pane_current_path}'
|
||||
bind '%' split-window -h -c '#{pane_current_path}'
|
||||
|
||||
# Change word separators to better match Vim.
|
||||
set -g word-separators "<>(){}[]/'\";@*+,.-_=!£$%^&:#~?`¬|\\ "
|
||||
bind "\"" split-window -c "#{pane_current_path}"
|
||||
bind "%" split-window -h -c "#{pane_current_path}"
|
||||
|
||||
# Integrate pane selection with vim
|
||||
in_vim='tmux show-window-options | grep -q "@vim#{pane_id}"'
|
||||
bind -n C-h if $in_vim 'send-keys C-h' 'select-pane -L'
|
||||
bind -n C-j if $in_vim 'send-keys C-j' 'select-pane -D'
|
||||
bind -n C-k if $in_vim 'send-keys C-k' 'select-pane -U'
|
||||
bind -n C-l if $in_vim 'send-keys C-l' 'select-pane -R'
|
||||
is_vim='echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(view|n?vim?)(diff)?$"'
|
||||
bind -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
|
||||
bind -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
|
||||
bind -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
|
||||
bind -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"
|
||||
bind -n C-\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l"
|
||||
|
||||
# Integrate urlscan or fallback to urlview
|
||||
if -b 'which urlscan' \
|
||||
'bind u capture-pane \; split-window "tmux show-buffer | urlscan"' \
|
||||
'bind u capture-pane \; split-window "tmux show-buffer | urlview -"'
|
||||
# Integrate urlview
|
||||
bind-key u capture-pane \; split-window "tmux show-buffer | urlview -"
|
||||
|
||||
# Unbind copy mode defaults so pane selection works
|
||||
unbind -T copy-mode-vi C-h
|
||||
unbind -T copy-mode-vi C-j
|
||||
# Enter copy mode with C-U
|
||||
bind C-u copy-mode -u
|
||||
bind-key C-u copy-mode -u
|
||||
# Begin selection in copy mode with v not Space
|
||||
bind -T copy-mode-vi v send -X begin-selection
|
||||
bind -T copy-mode-vi V send -X select-line
|
||||
bind -n C-v if-shell -F '#{pane_in_mode}' \
|
||||
'send -X rectangle-toggle' \
|
||||
'send-keys C-v'
|
||||
# Exit copy mode with i/a
|
||||
bind -T copy-mode-vi 'i' send -X cancel
|
||||
bind -T copy-mode-vi 'a' send -X cancel
|
||||
# Search without entering copy-mode first
|
||||
bind '/' 'copy-mode;send-keys /'
|
||||
bind '?' 'copy-mode;send-keys ?'
|
||||
bind-key -T copy-mode-vi v send-keys -X begin-selection
|
||||
# Yank to the system clipboard in copy mode
|
||||
if -b '[ "`uname`" = "Linux" ]' \
|
||||
"bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xsel -i -p && xsel -o -p | xsel -i -b'"
|
||||
|
||||
# Enable mouse scrolling up in alternate buffers.
|
||||
# If #{mouse_any_flag} is 1 the pane is running with mouse support, e.g. vim.
|
||||
# If #{alternate_on} is 1 the terminal is in alternate buffer mode, e.g. less.
|
||||
# If #{pane_in_mode} is 1 the pane is in copy-mode.
|
||||
bind -n WheelUpPane \
|
||||
if -Ft= "#{mouse_any_flag}" \
|
||||
"send-keys -M" \
|
||||
"if -Ft= \"#{alternate_on}\" \
|
||||
\"send-keys -t= Up ; \
|
||||
send-keys -t= Up ; \
|
||||
send-keys -t= Up ; \" \
|
||||
\"select-pane -t= ; \
|
||||
if -Ft= '#{pane_in_mode}' \
|
||||
'send-keys -M' \
|
||||
'copy-mode -e ; send-keys -M' \" "
|
||||
# Emulate mouse scrolling down in alternate buffers.
|
||||
bind -n WheelDownPane \
|
||||
if -Ft= "#{mouse_any_flag}" \
|
||||
"send-keys -M" \
|
||||
"if -Ft= \"#{alternate_on}\" \
|
||||
\"send-keys -t= Down ; \
|
||||
send-keys -t= Down ; \
|
||||
send-keys -t= Down ; \" \
|
||||
\"select-pane -t= ; \
|
||||
send-keys -M\" "
|
||||
# Left status style
|
||||
set-window-option -g status-left " #S"
|
||||
set-window-option -g status-left-fg colour240
|
||||
set-window-option -g status-left-bg colour233
|
||||
|
||||
# Enable setting clipboard with OSC-52 when in an SSH session
|
||||
if -b '[ "$SSH_TTY" != "" ]' \
|
||||
'set-option -g set-clipboard on'
|
||||
# Centre status style
|
||||
set-window-option -g status-fg colour240
|
||||
set-window-option -g status-bg colour233
|
||||
|
||||
# Yank to the system clipboard in copy mode.
|
||||
# TODO: reattach-to-user-namespace not necessary with tmux > 2.6
|
||||
if -b '[ "`uname`" = "Darwin" ]' \
|
||||
'bind -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy"'
|
||||
# When not in WSL2 use xsel, when in WSL use win32yank.exe to avoid UI lockups.
|
||||
if -b '[ "$WSLENV" = "" ]' \
|
||||
'bind -T copy-mode-vi y send-keys -X copy-pipe "xsel -i --clipboard"' \
|
||||
'bind -T copy-mode-vi y send-keys -X copy-pipe "win32yank.exe -i -crlf"'
|
||||
# Right status style
|
||||
set-window-option -g status-right "%a %d-%m-%y %H:%M "
|
||||
set-window-option -g status-right-fg white
|
||||
set-window-option -g status-right-bg colour233
|
||||
|
||||
source-file ~/.config/tmux/theme.tmux
|
||||
# Active window status style
|
||||
set-window-option -g window-status-current-format " #I: #W"
|
||||
set-window-option -g window-status-current-fg white
|
||||
set-window-option -g window-status-current-bg colour233
|
||||
|
||||
# Inactive window status style
|
||||
set-window-option -g window-status-format " #I: #W"
|
||||
set-window-option -g window-status-fg colour240
|
||||
set-window-option -g window-status-bg colour233
|
||||
|
||||
# Active pane border
|
||||
set-option -g pane-active-border-fg colour235
|
||||
set-option -g pane-active-border-bg colour235
|
||||
|
||||
# Inactive pane border
|
||||
set-option -g pane-border-fg colour233
|
||||
set-option -g pane-border-bg colour233
|
||||
|
||||
# Command line window list selection
|
||||
set-window-option -g mode-style fg=colour233,bg=colour30
|
||||
set-option -g message-style fg=colour233,bg=colour30
|
||||
|
||||
Reference in New Issue
Block a user