Compare commits

...

104 Commits
future ... main

Author SHA1 Message Date
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 1e2c00aa32e97939d7d5cb447e8e2a5a8c30386e.
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
21a88edfaa Add system-info Linux systemd user unit
Update the `system-info` directory with the addition of a `systemd`
service file and an new Linux script to display current CPU temperature
and core/thread utilization. Update `.conduit.yaml` with addition
`apt` dependencies `sysstat` and `jq`. Update the install and remove
scripts to setup and tear down the `systemd` user unit. Lastly, decrease
the `tmux` status line update interval from 5 to 2 seconds.
2021-02-17 18:54:29 +00:00
d96a1b7438 Add system-info macOS user agent
The `system-info` directory contains scripts and configuration files to
install and remove a `launchd` user agent on macOS which collects
information about the system and outputs it to the file
`~/.cache/tmux/system-info`. This file is then read periodically by
`tmux` and the contents displayed in the status line.
2021-02-16 23:55:02 +00:00
1d2a5f249d Fix macOS battery percentage display 2021-02-16 22:11:05 +00:00
91118d58ac Don't map C-\ since I never use it 2021-02-08 22:36:26 +00:00
ed94650f54 Add Fedora support 2020-12-31 16:07:26 +00:00
ef4dddfd40 Add lightning bolt to macOS battery display 2020-12-03 22:36:30 +00:00
eda4a020bf Add visor.zsh for use with iTerm2
iTerm2 has tmux integration which I don't care for, this integration
mucks up using tmux as the shell for a profile. To work around this, the
`visor.zsh` script is used in the _Send text at start_ for the a Quake
style visor profile as follows:

```
source ~/.config/tmux/visor.zsh
```
2020-10-18 16:35:30 +01:00
24bdf7a404 Swap window-wide-left/window-wide-right 2020-05-06 11:19:46 +01:00
59bba33cf1 Add window-wide-{left,right} layouts 2020-05-06 10:56:22 +01:00
ee4e59b281 Improve vi mode word-separator settings 2020-04-02 15:08:00 +01:00
33e2f0f81b Fix unescaped backslash in binding config 2019-12-29 19:58:32 +00:00
d600c671ef Don't select pane first in layouts 2019-12-10 13:54:26 +00:00
0e67cca13b Add window-wide layout 2019-11-11 10:33:09 +00:00
20be7f3bcc Add urlscan as alternative to urlview
Since urlview is not available with pacman but urlscan is, first check
and integrate urlscan then fallback to urlview.
2019-09-17 22:13:02 +01:00
cabd57ae84 Add pacman package dependencies 2019-09-17 21:36:17 +01:00
cd1a73f304 Add battery percentage to status bar on macOS 2019-08-30 16:55:17 +01:00
b6ee1bb677 Emulate mouse scrolling for alternate buffers
For pagers such as `less` which don't support terminal mouse features
enable scrolling with the mouse wheel by emulating the behaviour using
`send-keys -t= {up,down}` when in alternate (fullscreen) mode.

These bindings retain the expected behaviour when using programs which
do support terminal mouse events and copy-mode.
2019-08-24 00:19:00 +01:00
720271baa5 Add session-main layout for basic sessions 2019-08-22 23:08:28 +01:00
6d07c00c2c Use xclip instead of xsel for yanking in copy mode
Sometimes when yanking large blocks of text from a pane larger than its
size in copy mode did not work. Switch to using `xclip` from `xsel` to
see if this works better.
2019-08-22 17:26:33 +01:00
28aa1795da Also install urlview
Ensure that the `C-u` binding works by installing `urlview` upon which
it depends.
2019-08-21 18:24:20 +01:00
b5526ca42b Remove zsh check from vim window flag
Make using the `@vim$TMUX_PANE` window flag much more robust by
unsetting it every time the zsh prompt is drawn and setting it again
using a `FocusGained` `autocmd` in vim. This removes the need for the
hacky check for zsh in the conditional defined in the `in_vim` variable.
2019-08-16 21:54:52 +01:00
43ce79c8c3 Fix in_vim to work on Linux Mint 18 2019-08-13 17:00:47 +01:00
56739ba2e7 Fix navigation annoyances
Fixes #6 by setting a window option called `vim$TMUX_PANE` during vim
setup, and removing it when vim exits:

```vim
if $TMUX !=# ''
  " Set tmux window option to detect when to change pane.
  let s:tmux_option = '@vim'.substitute($TMUX_PANE, '%', '\\%', 'g')
  call system('tmux set-window-option '.s:tmux_option.' 1')
  au VimLeave * call system('tmux set-window-option -u '.s:tmux_option)
endif
```

Then update the `is_vim` conditional shell statement to check if this
variables exists for the current pane to determine when to change tmux
pane or pass through the binding to vim.

```conf
in_vim='[[ "$(tmux show-window-options)" = *"@vim#{pane_id}"* ]] && \
        [[ "#{pane_current_command}" != zsh ]]'
```

Additionally check if the vim task has been backgrounded by comparing
the value of `#{pane_current_command}`, this is likely a bit brittle if
backgrounding is used heavily but works otherwise.
2019-08-11 18:42:57 +01:00
b47c74a33f Fix tmux 2.9 config issues & cleanup 2019-08-11 18:42:02 +01:00
25d7c10240 Fix pane navigation left in copy mode 2019-07-24 14:54:51 +01:00
943412c159 Increase terminal buffer limit 2019-07-24 14:21:36 +01:00
7cb6fec680 Fix C-h not selecting a pane in code-mode-vi 2019-07-14 21:20:27 +01:00
f9f72c13ba Use bind instead of bind-key 2018-08-28 21:48:14 +01:00
69ad546317 Use grey instead of blue for selection highlights 2018-08-26 20:28:05 +01:00
eafbe27379 Add symlink for window-tall layout 2018-08-26 18:37:30 +01:00
94ee8df2f9 Rename layout 2vt to window-tall 2018-08-26 18:34:08 +01:00
a180f60a98 Enable vi-mode yank on macOS 2018-08-26 17:35:48 +01:00
fdcf4c701c Add brew package 2018-08-25 15:10:40 +01:00
20 changed files with 472 additions and 64 deletions

View File

@ -1,7 +0,0 @@
---
- location: ~/.config/tmux
- apt:
- tmux
- xsel
- symlink:
- {src: tmux.conf, dst: ~/.tmux.conf}

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

43
install.sh Executable file
View File

@ -0,0 +1,43 @@
#!/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/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

View File

@ -1,4 +0,0 @@
# vim: ft=tmux
select-pane -t 0
split-window -v -p 34
select-pane -t 1

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

5
layouts/session-main Executable file
View File

@ -0,0 +1,5 @@
#!/usr/bin/env zsh
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

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

6
layouts/window-tall Executable file
View File

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

6
layouts/window-wide-left Executable file
View File

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

6
layouts/window-wide-right Executable file
View File

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

16
system-info/install.sh Executable file
View File

@ -0,0 +1,16 @@
#!/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

13
system-info/remove.sh Executable file
View File

@ -0,0 +1,13 @@
#!/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

View File

@ -0,0 +1,70 @@
#!/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 / 9), 1)
}'
else
echo $percentage | awk '$battery ~ /.*/ {
printf " %d%% %s\n", $battery, substr("󰂎󰁺󰁻󰁼󰁽󰁾󰁿󰂀󰂁󰂂󰁹", int($battery / 9), 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 / 11), 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

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 / 11), 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 / 9), 1)
}')"
fi
echo "$cpu_temp$cpu_load$battery" > $cache_file
# echo "$(locale)" > $cache_file
sleep 2
done

View File

@ -0,0 +1,43 @@
#!/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
# 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="`/usr/local/bin/osx-cpu-temp`"
cpu_load=$(sudo powermetrics --format text \
--sample-rate 1200 --sample-count 1 --samplers cpu_power |
grep --color=never -E 'CPU \d idle residency:' |
grep --color=never -Eo '\d+\.\d+' |
gawk '$idle ~ /[-.0-9]*/ { printf "%s", substr("█▇▆▅▄▃▂▁ ", int($idle / 10), 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 / 9), 1)
}')"
fi
# Write to the cache file.
echo "$cpu_temp$cpu_load$battery" > $cache_file
done

View File

@ -0,0 +1,14 @@
<?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>

163
tmux.conf
View File

@ -1,3 +1,12 @@
# 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 # Use vim keybindings in copy mode
set -g mode-keys vi set -g mode-keys vi
@ -6,26 +15,27 @@ 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 50000 set -g history-limit 1000000
# Set tmux messages display time to 4 seconds # Set tmux messages display time to 4 seconds
set -g display-time 4000 set -g display-time 4000
# Refresh 'status-left' and 'status-right' more often # Refresh 'status-left' and 'status-right' more often
set -g status-interval 5 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
@ -33,79 +43,126 @@ 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 in iTerm2 or VTE compatible terminals, # Enable changing cursor shape per pane, vim or zsh should emit escape
# vim or zsh should emit VTE compatible escape sequences to change cursor shape # sequences to change cursor shape.
if -b '[ -n $ITERM_PROFILE ]' \ # iTerm2 only requires this before tmux 2.9
"set -ga terminal-overrides '*:Ss=\E]1337;CursorShape=%p1%d\7'" \ if '[ -n $ITERM_PROFILE ] && [[ "$TMUX_VERSION" < "2.9" ]]' \
"set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[2 q'" '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 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'
# Set only on OS X 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"'
# 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
# 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}'
# Change word separators to better match Vim.
set -g word-separators "<>(){}[]/'\";@*+,.-_=!£$%^&:#~?`¬|\\ "
# Integrate pane selection with vim # Integrate pane selection with vim
is_vim='echo "#{pane_current_command}" | grep -iqE "(^|\/)g?(view|n?vim?)(diff)?$"' in_vim='tmux show-window-options | grep -q "@vim#{pane_id}"'
bind -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L" bind -n C-h if $in_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-j if $in_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-k if $in_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-l if $in_vim 'send-keys C-l' 'select-pane -R'
bind -n C-\ if-shell "$is_vim" "send-keys C-\\" "select-pane -l"
# Integrate urlview # Integrate urlscan or fallback to urlview
bind-key u capture-pane \; split-window "tmux show-buffer | 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 -"'
# 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 # Enter copy mode with C-U
bind-key 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-key -T copy-mode-vi v send-keys -X begin-selection bind -T copy-mode-vi v send-keys -X begin-selection
# Yank to the system clipboard in copy mode # Search without entering copy-mode first
if -b '[ "`uname`" = "Linux" ]' \ bind '/' 'copy-mode;send-keys /'
"bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xsel -i -p && xsel -o -p | xsel -i -b'" 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.
# 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\" "
# 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 "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 # Left status style
set-window-option -g status-left " #S" if -b '[ "$WSL_DISTRO_NAME" != "" ]' \
set-window-option -g status-left-fg colour240 'setw -g status-left " #(hostname)|#{WSL_DISTRO_NAME}|#{session_name}"' \
set-window-option -g status-left-bg colour233 '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 # Centre status style
set-window-option -g status-fg colour240 setw -g status-style fg=colour240,bg=colour233
set-window-option -g status-bg colour233
# Right status style # Right status style shows system info, date, and time.
set-window-option -g status-right "%a %d-%m-%y %H:%M " setw -g status-right "#[fg=colour240]#(cat ~/.cache/tmux/system-info)#[fg=white] %a %d-%m-%y %H:%M "
set-window-option -g status-right-fg white setw -g status-right-style fg=white,bg=colour233
set-window-option -g status-right-bg colour233 if -b '[ "`uname`" != "Darwin" ]' \
'run "tmux setw -g status-right-length $((`nproc --all` + 48))"'
# Active window status style # Active window status style
set-window-option -g window-status-current-format " #I: #W" setw -g window-status-current-format " #{window_index}: #{window_name}"
set-window-option -g window-status-current-fg white setw -g window-status-current-style fg=white,bg=colour233
set-window-option -g window-status-current-bg colour233
# Inactive window status style # Inactive window status style
set-window-option -g window-status-format " #I: #W" setw -g window-status-format " #{window_index}: #{window_name}"
set-window-option -g window-status-fg colour240 setw -g window-status-style fg=colour240,bg=colour233
set-window-option -g window-status-bg colour233
# Active pane border # Pane border style
set-option -g pane-active-border-fg colour235 set -g pane-border-style fg=colour233,bg=colour233
set-option -g pane-active-border-bg colour235 set -g pane-active-border-style fg=colour235,bg=colour235
# Inactive pane border
set-option -g pane-border-fg colour233
set-option -g pane-border-bg colour233
# Command line window list selection # Command line window list selection
set-window-option -g mode-style fg=colour233,bg=colour30 set-window-option -g mode-style fg=white,bg=colour237
set-option -g message-style fg=colour233,bg=colour30 set-option -g message-style fg=white,bg=colour237

6
visor.zsh Executable file
View File

@ -0,0 +1,6 @@
if ! tmux list-sessions -F '#{session_name}' | grep 'visor' > /dev/null; then
tmux new-session -d -s visor
tmux rename-window -t visor:0 home
fi
tmux attach-session -t visor
exit