Compare commits

...

96 Commits

Author SHA1 Message Date
df7a4d581b Implement macOS status-right-length increase 2025-12-04 16:44:50 +00:00
c2ff680dd3 Actually do version comparison for display-popup 2025-12-04 16:44:25 +00:00
9bce4090fa Use iSMC instead of custom cpu-temp tool
Fixes #10
2025-11-26 22:49:01 +00:00
e0537d5fd1 Don't use >= in TMUX_VERSION comparisons 2025-11-24 22:44:55 +00:00
effbc648f8 Use TMUX_LAYOUT_FULLSCREEN instead of heuristic
Only change `window-wide-left`/`window-wide-right` to 63%/37% split when
`TMUX_LAYOUT_FULLSCREEN=1`.
2025-11-23 10:42:36 +00:00
e500aaef7b Add binding to use window-auto layout 2025-11-23 10:42:11 +00:00
e59cea9249 Use bash not sh in wide window layouts 2025-11-18 10:39:22 +00:00
05c67a2e90 Adjust wide window layouts for wider configs 2025-11-18 10:38:20 +00:00
19e9306008 Fix indexing into icon char buffers 2025-11-11 21:44:54 +00:00
4635fc169d Add work session layout 2025-11-11 09:49:18 +00:00
60e95c36a6 Don't use display-popup in tmux 3.2 and lower 2025-11-09 20:08:05 +00:00
8c6231616c Change macOS CPU temp sensor 2025-11-06 21:15:51 +00:00
cc130f0c4d Add kill-window binding 2025-08-19 15:35:22 +01:00
e3dd81ed15 Add project bind to select ~/Projects 2025-08-19 15:35:18 +01:00
aa9ff89aa5 Don't use Ctrl in display-popup bindings 2025-08-19 15:27:34 +01:00
3d3a56e0ee Reintroduce cpu-temp in system-info on macOS 2025-07-29 15:37:16 +01:00
3444e1083b Use which not where 2025-07-08 15:09:16 +01:00
81378e08d0 Call exit in interpreter.sh 2025-07-01 11:04:35 +01:00
4f770fd649 Add popup to choose an interpreter and launch it 2025-06-28 12:21:26 +01:00
85ba6d45d1 Make popup terminal border match fzf style 2025-06-28 11:47:48 +01:00
002c2ba9b8 Add session switcher popup binding 2025-06-27 12:16:02 +01:00
8c92370420 Move theme into separate file 2025-06-27 12:14:00 +01:00
3ce1f3d43c Add C-<Space> C-t binding for shell popup 2025-06-24 13:58:10 +01:00
c3109181d6 Enable C-v for toggling rectangle selection in copy mode 2025-06-23 20:13:13 +01:00
09fdaebbe7 Add more vim like copy-mode bindings 2025-06-22 20:59:25 +01:00
d0bc106279 Use btop when available in visor session 2025-01-01 22:31:07 +00:00
38f5bb7f9c Make install.sh work on base 3.2 (for macOS) 2024-10-10 18:16:58 +01:00
9964392ee0 Fix session-config use of old local session name 2024-08-09 10:29:00 +01:00
6580e0b883 Rename local session to config 2024-08-06 10:48:09 +01:00
c18df0825b system-info: Always have a space before battery %age 2024-07-23 23:22:05 +01:00
2005b6140f Don't split home on local session layout 2024-07-03 23:47:06 +01:00
d874f095a4 Add infra session layout 2024-07-01 23:34:48 +01:00
360f5d0115 Don't specify %age in window-auto for 50% split 2024-06-19 18:38:16 +01:00
71f3ff3659 Fix install.sh where ~ does expand inside associative array 2024-04-28 16:33:20 +01:00
0924e6174e Fixup session-local layout 2024-04-20 15:26:57 +01:00
3391ae2eb5 Tune window-auto for smaller terminals 2024-04-16 19:17:21 +01:00
7fd94d4f10 Enable standalone install with install.sh
Move away from being dependant on Ansible task.yaml config setup and
move all login into install.sh to support installing tmux config just by
cloning and running the script.
2024-04-13 16:28:55 +01:00
896a9e09d3 Fix bug in window-auto layout 2024-04-12 23:45:56 +01:00
f02e0a20f6 Add work config to local layout if extant 2024-04-12 23:43:56 +01:00
85c11bc57c Fix window-auto session to use current pane directory 2024-04-12 23:39:45 +01:00
cc475b4400 Fix hardcoded use of /usr/bin/zsh instead of via env 2024-04-12 23:23:14 +01:00
2c859ddd93 Fix window-auto when using in session layouts 2024-04-12 22:10:56 +01:00
14894bdf47 Fix garbage on session start
Use the workaround mentioned in
https://github.com/microsoft/WSL/issues/5931 to stop garbage being
output when starting a new session.
2024-04-12 21:43:50 +01:00
b9a82c93d9 Use window-auto layout in session layouts 2024-04-12 21:06:03 +01:00
7bc20823de Add meta window layout that automatically chooses split 2024-04-12 21:06:03 +01:00
905460fee4 Make layouts executable scripts with shebangs 2024-04-12 20:57:32 +01:00
6aeadd4129 Update session-local to open more config repos 2024-04-12 00:00:17 +01:00
d4ec662477 Fix todo about describing aggressive-resize 2024-04-08 21:36:13 +01:00
48f8514939 Don't hide the + sign on Intel CPU temp 2024-04-05 23:04:56 +01:00
a4fe049859 Enable set-clipboard when in an SSH session 2024-04-04 21:09:03 +01:00
97a94ec036 Add bindings to search without being in copy mode first 2024-03-12 19:16:30 +00:00
cd9e6742f4 Enable TrueColor support 2024-03-02 10:53:51 +00:00
a84ede4494 Stop using deprecated -p on split-window 2023-11-24 20:50:46 +00:00
22fef1a533 Fix Nerd Font symbols on macOS 2023-08-04 15:57:05 +01:00
78afc517ba Potentially fix showing battery on desktops
The battery indicator should only be shown on devices with a battery
power supply. It should not be shown when a wireless USB device is
attached that happens to have a battery. This patch potentially fixes
the issue of showing a 0% battery reading on desktops.
2023-06-23 22:40:27 +01:00
201ba38b2a Fix acpi -b output check to define get_battery 2023-06-04 21:58:14 +01:00
41cb522d2c Switch between battery charging/not icons 2023-06-02 19:31:14 +01:00
b5c2f8343a Add battery support for Linux system-info script 2023-06-01 22:45:50 +01:00
d852c46bc8 Port system-info-WSL.sh to work when systemd is enabled 2023-05-12 22:18:56 +01:00
2525d437fe system-info: Change AMD temp sensor source
Use `k10temp-pci-00c3` sensor output instead of
`asus_wmi_sensors-virtual-0` to read the CPU temperature because on the
ASUS Prime x470 Pro the latter is buggy and can result in the UEFI fan
control either slamming at 100% or not registering a temperature change
at full load.
2023-05-10 11:35:39 +01:00
6dbd391a56 Strip domain from hostname on macOS
Fortunately this command also works on Linux but its not required there.

```console
$ hostname -s
```
2023-04-26 17:11:55 +01:00
09379eebc0 Handle AMD CPU temp on ASUS motherboards 2023-04-14 20:13:48 +01:00
235bf058e5 system-info: Enable CPU load and battery icon on macOS 2023-01-06 21:44:05 +00:00
f4aed11002 Add battery icon in system-info-WSL.sh 2022-12-30 17:52:36 +00:00
b2158b5f93 Revert "Change default term"
This reverts commit 1e2c00aa32.
2022-12-10 22:15:00 +00:00
6c3c7d7373 system-info clean up cache file in WSL too 2022-12-10 17:35:39 +00:00
1e2c00aa32 Change default term
While using `tmux-256color` has been working great for the longest time,
`git` on macOS Venture with Apple Silicon does not like it. Complaints
of incorrectly configured terminal are resolved in this config by
removing this custom termdb entry. Alternative would be to install it
again but it doesn't seem to be necessary anymore.
2022-12-10 15:30:10 +00:00
6beb81f972 Switch to win32yank.exe for clipboard in WSL2
Using `xclip` or `xsel` in WSL2 started causing Windows GUI applications
to hang when pasting from the clipboard set by `xclip`/`xsel` waiting on
input from a clipboard process which had already exited. When WSL is
detected, use `win32yank.exe` instead. This is available via Chocolatey
but is also shipped with the Neovim Windows installation.

For more context, see https://github.com/microsoft/terminal/issues/11945
2022-12-03 18:40:25 +00:00
6629046ec2 Don't display battery %age on WSL system with no battery 2022-10-29 13:28:27 +01:00
2bb99ee369 Add battery %age reporting in system-info-WSL.sh 2022-10-03 22:26:18 +01:00
9a65f59273 Split some long lines in system-info-WSL.sh 2022-10-03 22:25:53 +01:00
fa263fb95e Use powershell for system-info CPU temp on WSL
Replace the query of CPU temp from the OpenHardwareMonitor's JSON served
via the network on the Windows host with a call to powershell to instead
read the WMI objects that OpenHardwareMonitor also emits. This is more
robust since powershell.exe is always available and does not require
Windows Defender firewall rules to allow connections from WSL2's VM to
the Windows host.
2022-10-01 13:21:12 +01:00
d4c2af545d Add layout for the visor sessions 2022-09-20 18:56:25 +01:00
d4ab398e3b Reduce duplication in tasks file 2022-09-20 18:40:20 +01:00
1e14c8f9c6 Add session-created hook to automate session layouts 2022-09-20 13:37:51 +01:00
27025bffbd Remove tasks which now live externally 2022-09-20 13:31:42 +01:00
2050f4f130 Prevent mouse click release events from existing copy mode 2022-09-13 10:38:10 +01:00
fcb2b02eac Create system-info cache directory in WSL 2022-05-22 10:32:33 +01:00
fd76c97c85 Update logic for enabling WSL in left status 2022-03-06 17:17:17 +00:00
37e1195d66 Install gawk on Debian distros 2022-02-13 21:13:28 +00:00
bcc6dac2cc Add more info in WSL to left status 2022-02-10 22:25:36 +00:00
206aa05eee Fix increasing right status length in Linux 2022-02-08 23:49:59 +00:00
054b347595 Add hostname to left status and increase its length 2022-02-08 23:49:40 +00:00
32d0935e1c Don't exit copy-mode on yank with y 2022-01-07 13:10:23 +00:00
2a1453a061 Fix package become & use package name lists 2021-12-15 00:30:26 +00:00
1d5b0ed6aa Create layouts directory 2021-12-15 00:01:44 +00:00
aa010cbce6 Become when installing Debian packages 2021-12-14 23:56:34 +00:00
e912a5902b Begin adding WSL2 support for system-info 2021-11-28 11:40:23 +00:00
1389817cb4 Make system-info right status grey not white 2021-11-28 11:02:42 +00:00
19ec5794b6 Move main.yaml to tasks.yaml 2021-11-19 21:58:25 +00:00
f7b5a6259f Remove conduit config 2021-11-06 16:46:35 +00:00
a52bd76906 Start using Ansible for config management 2021-11-05 11:35:40 +00:00
21d1935ef3 Disable system-info service when WSL is detected 2021-07-11 14:06:22 +01:00
4b2e867721 Install sysstat and jq with dnf 2021-04-09 21:46:08 +01:00
f440e0c04d Fix system-info conduit command 2021-02-21 20:46:39 +00:00
67dc3dffaf Update system-info macOS user agent
Add CPU temperature to `status-info`, conditionally display battery
charge percentage, and documents the commands.
2021-02-17 20:49:29 +00:00
23 changed files with 480 additions and 102 deletions

View File

@@ -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
View 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
View 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
View 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
View 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
View 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
View File

@@ -1,4 +1,5 @@
rename-session main
rename-window home
#!/usr/bin/env zsh
# vim: filetype=tmux
tmux rename-session main
tmux rename-window home
`dirname $0`/window-auto

9
layouts/session-visor Executable file
View 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
View 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
View 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
View File

@@ -1,3 +1,6 @@
# vim: ft=tmux
split-window -v -p 34
#!/usr/bin/env -S tmux source-file
split-window -v -l 34% -c '#{pane_current_path}'
select-pane -t 1
# vim: ft=tmux

14
layouts/window-wide-left Normal file → Executable file
View File

@@ -1,3 +1,11 @@
# vim: ft=tmux
split-window -h -p 43
select-pane -t 1
#!/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

14
layouts/window-wide-right Normal file → Executable file
View File

@@ -1,3 +1,11 @@
# vim: ft=tmux
split-window -h -p 57
select-pane -t 1
#!/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 Executable file
View 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
View 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

View File

@@ -6,7 +6,11 @@ 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

View File

@@ -4,6 +4,10 @@ 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

View File

@@ -8,17 +8,63 @@ 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 | \
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 / 11), 1) }'`
awk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 100 * 9), 1) }'`"
# Parse the current CPU package temperature.
cpu_temp=`sensors coretemp-isa-0000 | awk 'NR == 3 { print substr($4, 2) }'`
cpu_temp=$(get_cpu_temp)
# Get the battery status if present.
battery=$(get_battery)
# Write to the cache file.
echo "$cpu_temp $cpu_load" > $cache_file
echo "$cpu_temp$cpu_load$battery" > $cache_file
done

49
system-info/system-info-WSL.sh Executable file
View 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

View File

@@ -8,12 +8,40 @@ 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
battery="`pmset -g batt | grep --color=never -Eo '\d+%'` ↯"
echo "$battery" > $cache_file
sleep 2
# 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

View File

@@ -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
View 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

View File

@@ -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
run 'tmux setenv -g TMUX_VERSION $(tmux -V | cut -c 6-8)'
@@ -9,9 +15,6 @@ 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
@@ -24,11 +27,15 @@ set -g status-interval 2
# Upgrade $TERM
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
set -g focus-events on
# TODO: Change this comment to something that explains the setting
# super useful when using "grouped sessions" and multi-monitor setup
# Aggressively resize the chosen window to smallest/largest session
setw -g aggressive-resize on
# Start window & pane index at 1
@@ -36,6 +43,8 @@ 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.
@@ -49,14 +58,32 @@ if '[ ! -n $ITERM_PROFILE ]' \
# 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
if -b '[ "`uname`" = "Darwin" ]' \
'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
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}'
@@ -82,7 +109,17 @@ unbind -T copy-mode-vi C-j
# Enter copy mode with C-U
bind C-u copy-mode -u
# 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.
# 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= ; \
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" ]' \
'bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel \
"reattach-to-user-namespace pbcopy"' \
'bind -T copy-mode-vi y send -X copy-pipe-and-cancel \
"xclip -i -sel p -f | xclip -i -sel c"'
'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"'
# Left status style
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
source-file ~/.config/tmux/theme.tmux