Compare commits
97 Commits
e36b069ad2
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| df7a4d581b | |||
| c2ff680dd3 | |||
| 9bce4090fa | |||
| e0537d5fd1 | |||
| effbc648f8 | |||
| e500aaef7b | |||
| e59cea9249 | |||
| 05c67a2e90 | |||
| 19e9306008 | |||
| 4635fc169d | |||
| 60e95c36a6 | |||
| 8c6231616c | |||
| cc130f0c4d | |||
| e3dd81ed15 | |||
| aa9ff89aa5 | |||
| 3d3a56e0ee | |||
| 3444e1083b | |||
| 81378e08d0 | |||
| 4f770fd649 | |||
| 85ba6d45d1 | |||
| 002c2ba9b8 | |||
| 8c92370420 | |||
| 3ce1f3d43c | |||
| c3109181d6 | |||
| 09fdaebbe7 | |||
| d0bc106279 | |||
| 38f5bb7f9c | |||
| 9964392ee0 | |||
| 6580e0b883 | |||
| c18df0825b | |||
| 2005b6140f | |||
| d874f095a4 | |||
| 360f5d0115 | |||
| 71f3ff3659 | |||
| 0924e6174e | |||
| 3391ae2eb5 | |||
| 7fd94d4f10 | |||
| 896a9e09d3 | |||
| f02e0a20f6 | |||
| 85c11bc57c | |||
| cc475b4400 | |||
| 2c859ddd93 | |||
| 14894bdf47 | |||
| b9a82c93d9 | |||
| 7bc20823de | |||
| 905460fee4 | |||
| 6aeadd4129 | |||
| d4ec662477 | |||
| 48f8514939 | |||
| a4fe049859 | |||
| 97a94ec036 | |||
| cd9e6742f4 | |||
| a84ede4494 | |||
| 22fef1a533 | |||
| 78afc517ba | |||
| 201ba38b2a | |||
| 41cb522d2c | |||
| b5c2f8343a | |||
| d852c46bc8 | |||
| 2525d437fe | |||
| 6dbd391a56 | |||
| 09379eebc0 | |||
| 235bf058e5 | |||
| f4aed11002 | |||
| b2158b5f93 | |||
| 6c3c7d7373 | |||
| 1e2c00aa32 | |||
| 6beb81f972 | |||
| 6629046ec2 | |||
| 2bb99ee369 | |||
| 9a65f59273 | |||
| fa263fb95e | |||
| d4c2af545d | |||
| d4ab398e3b | |||
| 1e14c8f9c6 | |||
| 27025bffbd | |||
| 2050f4f130 | |||
| fcb2b02eac | |||
| fd76c97c85 | |||
| 37e1195d66 | |||
| bcc6dac2cc | |||
| 206aa05eee | |||
| 054b347595 | |||
| 32d0935e1c | |||
| 2a1453a061 | |||
| 1d5b0ed6aa | |||
| aa010cbce6 | |||
| e912a5902b | |||
| 1389817cb4 | |||
| 19ec5794b6 | |||
| f7b5a6259f | |||
| a52bd76906 | |||
| 21d1935ef3 | |||
| 4b2e867721 | |||
| f440e0c04d | |||
| 67dc3dffaf | |||
| 21a88edfaa |
@@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
- location: ~/.config/tmux
|
|
||||||
- apt:
|
|
||||||
- tmux
|
|
||||||
- xclip
|
|
||||||
- urlview
|
|
||||||
- sysstat
|
|
||||||
- jq
|
|
||||||
- brew:
|
|
||||||
- tmux
|
|
||||||
- urlview
|
|
||||||
- reattach-to-user-namespace
|
|
||||||
- pacman:
|
|
||||||
- tmux
|
|
||||||
- xclip
|
|
||||||
- urlscan
|
|
||||||
- dnf:
|
|
||||||
- tmux
|
|
||||||
- xclip
|
|
||||||
- urlscan
|
|
||||||
- symlink:
|
|
||||||
- src: tmux.conf
|
|
||||||
dst: ~/.tmux.conf
|
|
||||||
- src: layouts/session-main
|
|
||||||
dst: ~/.local/share/tmux/layouts/session-main
|
|
||||||
- src: layouts/window-tall
|
|
||||||
dst: ~/.local/share/tmux/layouts/window-tall
|
|
||||||
- src: layouts/window-wide-left
|
|
||||||
dst: ~/.local/share/tmux/layouts/window-wide-left
|
|
||||||
- src: layouts/window-wide-right
|
|
||||||
dst: ~/.local/share/tmux/layouts/window-wide-right
|
|
||||||
- command:
|
|
||||||
- install: system-info/install.sh
|
|
||||||
- remove: system-info/remove.sh
|
|
||||||
9
hooks/session-create.sh
Executable file
9
hooks/session-create.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/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
|
||||||
|
else
|
||||||
|
tmux rename-window home
|
||||||
|
fi
|
||||||
45
install.sh
Executable file
45
install.sh
Executable file
@@ -0,0 +1,45 @@
|
|||||||
|
#!/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
|
||||||
32
interpreter.sh
Executable file
32
interpreter.sh
Executable file
@@ -0,0 +1,32 @@
|
|||||||
|
#!/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
|
||||||
28
layouts/session-config
Executable file
28
layouts/session-config
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
#!/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
|
||||||
12
layouts/session-infra
Executable file
12
layouts/session-infra
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/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
|
||||||
7
layouts/session-main
Normal file → Executable file
7
layouts/session-main
Normal file → Executable file
@@ -1,4 +1,5 @@
|
|||||||
rename-session main
|
#!/usr/bin/env zsh
|
||||||
rename-window home
|
|
||||||
|
|
||||||
# vim: filetype=tmux
|
tmux rename-session main
|
||||||
|
tmux rename-window home
|
||||||
|
`dirname $0`/window-auto
|
||||||
|
|||||||
9
layouts/session-visor
Executable file
9
layouts/session-visor
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/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
|
||||||
9
layouts/session-work
Executable file
9
layouts/session-work
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
#!/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
|
||||||
27
layouts/window-auto
Executable file
27
layouts/window-auto
Executable file
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
cols=`tmux display -p "#{pane_width}"`
|
||||||
|
lines=`tmux display -p "#{pane_height}"`
|
||||||
|
width=$(( $cols / 2 )).0
|
||||||
|
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
|
||||||
7
layouts/window-tall
Normal file → Executable file
7
layouts/window-tall
Normal file → Executable file
@@ -1,3 +1,6 @@
|
|||||||
# vim: ft=tmux
|
#!/usr/bin/env -S tmux source-file
|
||||||
split-window -v -p 34
|
|
||||||
|
split-window -v -l 34% -c '#{pane_current_path}'
|
||||||
select-pane -t 1
|
select-pane -t 1
|
||||||
|
|
||||||
|
# vim: ft=tmux
|
||||||
|
|||||||
14
layouts/window-wide-left
Normal file → Executable file
14
layouts/window-wide-left
Normal file → Executable file
@@ -1,3 +1,11 @@
|
|||||||
# vim: ft=tmux
|
#!/usr/bin/env bash
|
||||||
split-window -h -p 43
|
|
||||||
select-pane -t 1
|
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
|
||||||
|
|||||||
14
layouts/window-wide-right
Normal file → Executable file
14
layouts/window-wide-right
Normal file → Executable file
@@ -1,3 +1,11 @@
|
|||||||
# vim: ft=tmux
|
#!/usr/bin/env bash
|
||||||
split-window -h -p 57
|
|
||||||
select-pane -t 1
|
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
Executable file
20
project.sh
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/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
Executable file
26
session.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/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
|
||||||
@@ -6,7 +6,11 @@ if [ `uname` = Darwin ]; then
|
|||||||
cp $script_dir/system-info.plist ~/Library/LaunchAgents/system-info.plist
|
cp $script_dir/system-info.plist ~/Library/LaunchAgents/system-info.plist
|
||||||
launchctl load -w ~/Library/LaunchAgents/system-info.plist
|
launchctl load -w ~/Library/LaunchAgents/system-info.plist
|
||||||
else
|
else
|
||||||
|
if [ "$WSL_DISTRO_NAME" = "" ]; then
|
||||||
cp $script_dir/system-info.service ~/.config/systemd/user/system-info.service
|
cp $script_dir/system-info.service ~/.config/systemd/user/system-info.service
|
||||||
systemctl --user enable system-info
|
systemctl --user enable system-info
|
||||||
systemctl --user start system-info
|
systemctl --user start system-info
|
||||||
|
else
|
||||||
|
echo -e "\033[0;33mwarning:\033[0m WSL detected, system-info systemd service disabled"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ if [ `uname` = Darwin ]; then
|
|||||||
launchctl unload ~/Library/LaunchAgents/system-info.plist
|
launchctl unload ~/Library/LaunchAgents/system-info.plist
|
||||||
rm ~/Library/LaunchAgents/system-info.plist
|
rm ~/Library/LaunchAgents/system-info.plist
|
||||||
else
|
else
|
||||||
|
if [ "$WSL_DISTRO_NAME" = "" ]; then
|
||||||
systemctl --user stop system-info
|
systemctl --user stop system-info
|
||||||
systemctl --user disable system-info
|
systemctl --user disable system-info
|
||||||
|
else
|
||||||
|
echo -e "\033[0;33mwarning:\033[0m WSL detected, system-info systemd service disabled"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -8,17 +8,63 @@ if [ ! -d $cache_dir ]; then
|
|||||||
mkdir -p $cache_dir
|
mkdir -p $cache_dir
|
||||||
fi
|
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.
|
# Cleanup cache file when interrupted.
|
||||||
trap '[ -f $cache_file ] && rm $cache_file;' INT
|
trap '[ -f $cache_file ] && rm $cache_file; exit' INT
|
||||||
|
trap '[ -f $cache_file ] && rm $cache_file; exit' TERM
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
# Parse the current CPU load on all cores/threads.
|
# Parse the current CPU load on all cores/threads.
|
||||||
cpu_load=`mpstat -P ALL -n 1 -u 1 -o JSON | \
|
cpu_load=" `mpstat -P ALL -n 1 -u 1 -o JSON | \
|
||||||
jq '.sysstat.hosts[0].statistics[0]["cpu-load"][1:]|.[].idle' | \
|
jq '.sysstat.hosts[0].statistics[0]["cpu-load"][1:]|.[].idle' | \
|
||||||
awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 11), 1) }'`
|
awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 100 * 9), 1) }'`"
|
||||||
|
|
||||||
# Parse the current CPU package temperature.
|
# Parse the current CPU package temperature.
|
||||||
cpu_temp=`sensors coretemp-isa-0000 | head -3 | tail -1 | \
|
cpu_temp=$(get_cpu_temp)
|
||||||
awk '{ print substr($4, 2) }'`
|
|
||||||
|
# Get the battery status if present.
|
||||||
|
battery=$(get_battery)
|
||||||
|
|
||||||
# Write to the cache file.
|
# Write to the cache file.
|
||||||
echo "$cpu_temp $cpu_load" > $cache_file
|
echo "$cpu_temp$cpu_load$battery" > $cache_file
|
||||||
done
|
done
|
||||||
|
|||||||
49
system-info/system-info-WSL.sh
Executable file
49
system-info/system-info-WSL.sh
Executable file
@@ -0,0 +1,49 @@
|
|||||||
|
#!/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
|
||||||
@@ -8,12 +8,40 @@ if [ ! -d $cache_dir ]; then
|
|||||||
mkdir -p $cache_dir
|
mkdir -p $cache_dir
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
[ -f $cache_dir/cpu-temp ] && rm $cache_dir/cpu-temp
|
||||||
|
|
||||||
# Cleanup cache file when interrupted.
|
# Cleanup cache file when interrupted.
|
||||||
trap '[ -f $cache_file ] && rm $cache_file; exit' INT
|
trap '[ -f $cache_file ] && rm $cache_file; exit' INT
|
||||||
trap '[ -f $cache_file ] && rm $cache_file; exit' TERM
|
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
|
while true; do
|
||||||
battery="`pmset -g batt | grep --color=never -Eo '\d+%'` ↯"
|
# Get the current CPU temperature.
|
||||||
echo "$battery" > $cache_file
|
cpu_temp=$(
|
||||||
sleep 2
|
~/.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
|
done
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=System Info
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
ExecStart=/home/benie/.config/tmux/system-info/system-info-Linux.sh
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=default.target
|
|
||||||
34
theme.tmux
Normal file
34
theme.tmux
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# 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
|
||||||
92
tmux.conf
92
tmux.conf
@@ -1,3 +1,9 @@
|
|||||||
|
# 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
|
# Set the tmux version to check for command support
|
||||||
run 'tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-8)'
|
run 'tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-8)'
|
||||||
|
|
||||||
@@ -9,9 +15,6 @@ unbind C-b
|
|||||||
set -g prefix C-Space
|
set -g prefix C-Space
|
||||||
bind Space send-prefix
|
bind Space send-prefix
|
||||||
|
|
||||||
# Address vim mode switching delay
|
|
||||||
set -s escape-time 0
|
|
||||||
|
|
||||||
# Increase scrollback buffer size
|
# Increase scrollback buffer size
|
||||||
set -g history-limit 1000000
|
set -g history-limit 1000000
|
||||||
|
|
||||||
@@ -24,11 +27,15 @@ set -g status-interval 2
|
|||||||
# Upgrade $TERM
|
# Upgrade $TERM
|
||||||
set -g default-terminal "tmux-256color"
|
set -g default-terminal "tmux-256color"
|
||||||
|
|
||||||
|
# Enable true-color
|
||||||
|
if '[[ "$TMUX_VERSION" < "3.2" ]]' \
|
||||||
|
'set-option -as terminal-features ",xterm*:Tc"' \
|
||||||
|
'set-option -as terminal-features ",xterm*:RGB"'
|
||||||
|
|
||||||
# Focus events enabled for terminals that support them
|
# Focus events enabled for terminals that support them
|
||||||
set -g focus-events on
|
set -g focus-events on
|
||||||
|
|
||||||
# TODO: Change this comment to something that explains the setting
|
# Aggressively resize the chosen window to smallest/largest session
|
||||||
# super useful when using "grouped sessions" and multi-monitor setup
|
|
||||||
setw -g aggressive-resize on
|
setw -g aggressive-resize on
|
||||||
|
|
||||||
# Start window & pane index at 1
|
# Start window & pane index at 1
|
||||||
@@ -36,6 +43,8 @@ set -g pane-base-index 1
|
|||||||
|
|
||||||
# Enable mouse support
|
# Enable mouse support
|
||||||
set-option -g mouse on
|
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
|
# Enable changing cursor shape per pane, vim or zsh should emit escape
|
||||||
# sequences to change cursor shape.
|
# sequences to change cursor shape.
|
||||||
@@ -49,14 +58,32 @@ if '[ ! -n $ITERM_PROFILE ]' \
|
|||||||
# Enable strikethrough on VTE compatible terminals.
|
# Enable strikethrough on VTE compatible terminals.
|
||||||
set -ga terminal-overrides 'xterm*:smxx=\E[9m'
|
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 macOS where it's required
|
||||||
if -b '[ "`uname`" = "Darwin" ]' \
|
if -b '[ "`uname`" = "Darwin" ]' \
|
||||||
'set -g default-command "reattach-to-user-namespace -l $SHELL"'
|
'set -g default-command "reattach-to-user-namespace -l $SHELL"'
|
||||||
|
|
||||||
|
if -b '[[ "$TMUX_VERSION" > "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'
|
||||||
|
}
|
||||||
|
|
||||||
# Restore old next/previous window bindings
|
# Restore old next/previous window bindings
|
||||||
bind C-n next-window
|
bind C-n next-window
|
||||||
bind C-p previous-window
|
bind C-p previous-window
|
||||||
|
|
||||||
|
# Kill current window
|
||||||
|
bind W kill-window
|
||||||
|
|
||||||
# Make new splits open in current directory
|
# Make new splits open in current directory
|
||||||
bind '"' split-window -c '#{pane_current_path}'
|
bind '"' split-window -c '#{pane_current_path}'
|
||||||
bind '%' split-window -h -c '#{pane_current_path}'
|
bind '%' split-window -h -c '#{pane_current_path}'
|
||||||
@@ -82,7 +109,17 @@ unbind -T copy-mode-vi C-j
|
|||||||
# Enter copy mode with C-U
|
# Enter copy mode with C-U
|
||||||
bind C-u copy-mode -u
|
bind C-u copy-mode -u
|
||||||
# Begin selection in copy mode with v not Space
|
# Begin selection in copy mode with v not Space
|
||||||
bind -T copy-mode-vi v send-keys -X begin-selection
|
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 ?'
|
||||||
|
|
||||||
# Enable mouse scrolling up in alternate buffers.
|
# Enable mouse scrolling up in alternate buffers.
|
||||||
# If #{mouse_any_flag} is 1 the pane is running with mouse support, e.g. vim.
|
# If #{mouse_any_flag} is 1 the pane is running with mouse support, e.g. vim.
|
||||||
@@ -110,36 +147,17 @@ bind -n WheelDownPane \
|
|||||||
\"select-pane -t= ; \
|
\"select-pane -t= ; \
|
||||||
send-keys -M\" "
|
send-keys -M\" "
|
||||||
|
|
||||||
# Yank to the system clipboard in copy mode
|
# Enable setting clipboard with OSC-52 when in an SSH session
|
||||||
|
if -b '[ "$SSH_TTY" != "" ]' \
|
||||||
|
'set-option -g set-clipboard on'
|
||||||
|
|
||||||
|
# Yank to the system clipboard in copy mode.
|
||||||
|
# TODO: reattach-to-user-namespace not necessary with tmux > 2.6
|
||||||
if -b '[ "`uname`" = "Darwin" ]' \
|
if -b '[ "`uname`" = "Darwin" ]' \
|
||||||
'bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel \
|
'bind -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy"'
|
||||||
"reattach-to-user-namespace pbcopy"' \
|
# When not in WSL2 use xsel, when in WSL use win32yank.exe to avoid UI lockups.
|
||||||
'bind -T copy-mode-vi y send -X copy-pipe-and-cancel \
|
if -b '[ "$WSLENV" = "" ]' \
|
||||||
"xclip -i -sel p -f | xclip -i -sel c"'
|
'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"'
|
||||||
|
|
||||||
# Left status style
|
source-file ~/.config/tmux/theme.tmux
|
||||||
setw -g status-left " #{session_name}"
|
|
||||||
setw -g status-left-style fg=colour240,bg=colour233
|
|
||||||
|
|
||||||
# Centre status style
|
|
||||||
setw -g status-style fg=colour240,bg=colour233
|
|
||||||
|
|
||||||
# Right status style shows system info, date, and time.
|
|
||||||
setw -g status-right "#(cat ~/.cache/tmux/system-info) %a %d-%m-%y %H:%M "
|
|
||||||
setw -g status-right-style fg=white,bg=colour233
|
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|||||||
Reference in New Issue
Block a user