Merge branch 'master' into feature/eks-support

This commit is contained in:
Ethan Edwards 2023-09-25 13:23:00 -04:00 committed by GitHub
commit c200b96b2f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 571 additions and 3 deletions

View file

@ -48,7 +48,7 @@ To enable plugins set up the `@dracula-plugins` option in you `.tmux.conf` file,
The order that you define the plugins will be the order on the status bar left to right. The order that you define the plugins will be the order on the status bar left to right.
```bash ```bash
# available plugins: battery, cpu-usage, git, gpu-usage, ram-usage, network, network-bandwidth, network-ping, attached-clients, network-vpn, weather, time, spotify-tui, kubernetes-context # available plugins: battery, cpu-usage, git, gpu-usage, ram-usage, tmux-ram-usage, network, network-bandwidth, network-ping, attached-clients, network-vpn, weather, time, spotify-tui, kubernetes-context, synchronize-panes
set -g @dracula-plugins "cpu-usage gpu-usage ram-usage" set -g @dracula-plugins "cpu-usage gpu-usage ram-usage"
``` ```
@ -161,6 +161,14 @@ Customize label
set -g @dracula-ram-usage-label "RAM" set -g @dracula-ram-usage-label "RAM"
``` ```
#### tmux-ram-usage options
Customize label
```bash
set -g @dracula-tmux-ram-usage-label "MEM"
```
#### network-bandwidth #### network-bandwidth
You can configure which network interface you want to view the bandwidth, You can configure which network interface you want to view the bandwidth,
@ -202,6 +210,12 @@ Enable military time
set -g @dracula-military-time true set -g @dracula-military-time true
``` ```
Set custom time format e.g (2023-01-01 14:00)
```bash
set -g @dracula-time-format "%F %R"
```
See [[this page]](https://man7.org/linux/man-pages/man1/date.1.html) for other format symbols.
#### git options #### git options
Hide details of git changes Hide details of git changes
@ -239,6 +253,37 @@ Show remote tracking branch together with diverge/sync state
set -g @dracula-git-show-remote-status true set -g @dracula-git-show-remote-status true
``` ```
#### hg options
Hide details of hg changes
```bash
set -g @dracula-hg-disable-status true
```
Set symbol to use for when branch is up to date with HEAD
```bash
#default is ✓.Avoid using non unicode characters that bash uses like $, * and !
set -g @dracula-hg-show-current-symbol ✓
```
Set symbol to use for when branch diverges from HEAD
```bash
#default is unicode !.Avoid bash special characters
set -g @dracula-hg-show-diff-symbol !
```
Set symbol or message to use when the current pane has no hg repo
```bash
#default is unicode no message
set -g @dracula-hg-no-repo-message ""
```
Hide untracked files from being displayed as local changes
```bash
#default is false
set -g @dracula-hg-no-untracked-files false
```
#### weather options #### weather options
Switch from default fahrenheit to celsius Switch from default fahrenheit to celsius
@ -259,6 +304,13 @@ Hide your location
set -g @dracula-show-location false set -g @dracula-show-location false
``` ```
#### synchronize-panes options
Customize label
```bash
set -g @dracula-synchronize-panes-label "Sync"
```
#### attached-clients options #### attached-clients options
Set the minimum number of clients to show (otherwise, show nothing) Set the minimum number of clients to show (otherwise, show nothing)
@ -298,4 +350,21 @@ Extract the account as a prefix to the cluster name - Available for EKS only (on
``` ```
set -g @dracula-kubernetes-eks-extract-account true set -g @dracula-kubernetes-eks-extract-account true
#### continuum options
Set the output mode. Options are:
- **countdown**: Show a T- countdown to the next save (default)
- **time**: Show the time since the last save
- **alert**: Hide output if no save has been performed recently
- **interval**: Show the continuum save interval
```bash
set -g @dracula-continuum-mode countdown
```
Show if the last save was performed less than 60 seconds ago (default threshold is 15 seconds)
```bash
set -g @dracula-continuum-time-threshold 60
``` ```

View file

@ -22,7 +22,7 @@ Configuration and options can be found at [draculatheme.com/tmux](https://dracul
- Battery percentage and AC power connection status - Battery percentage and AC power connection status
- Refresh rate control - Refresh rate control
- CPU usage (percentage or load average) - CPU usage (percentage or load average)
- RAM usage - RAM usage (system and/or tmux server)
- GPU usage - GPU usage
- Custom status texts from external scripts - Custom status texts from external scripts
- GPU VRAM usage - GPU VRAM usage
@ -32,8 +32,10 @@ Configuration and options can be found at [draculatheme.com/tmux](https://dracul
- When prefix is enabled smiley face turns from green to yellow - When prefix is enabled smiley face turns from green to yellow
- When charging, 'AC' is displayed - When charging, 'AC' is displayed
- If forecast information is available, a ☀, ☁, ☂, or ❄ unicode character corresponding with the forecast is displayed alongside the temperature - If forecast information is available, a ☀, ☁, ☂, or ❄ unicode character corresponding with the forecast is displayed alongside the temperature
- Info if the Panes are synchronized
- Spotify playback (needs the tool spotify-tui installed) - Spotify playback (needs the tool spotify-tui installed)
- Current kubernetes context - Current kubernetes context
- Countdown to tmux-continuum save
- Current working directory of tmux pane - Current working directory of tmux pane
## Compatibility ## Compatibility

161
scripts/continuum.sh Executable file
View file

@ -0,0 +1,161 @@
#!/usr/bin/env bash
# setting the locale, some users have issues with different locales, this forces the correct one
export LC_ALL=en_US.UTF-8
# configuration
# @dracula-continuum-mode default (countdown|time|alert|interval)
# @dracula-continuum-time-threshold 15
alert_mode="@dracula-continuum-mode"
time_threshold="@dracula-continuum-time-threshold"
warn_threshold=360
first_save="@dracula-continuum-first-save"
# tmux-resurrect and tmux-continuum options
if [ -d "$HOME/.tmux/resurrect" ]; then
default_resurrect_dir="$HOME/.tmux/resurrect"
else
default_resurrect_dir="${XDG_DATA_HOME:-$HOME/.local/share}"/tmux/resurrect
fi
resurrect_dir_option="@resurrect-dir"
last_auto_save_option="@continuum-save-last-timestamp"
auto_save_interval_option="@continuum-save-interval"
auto_save_interval_default="15"
current_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source $current_dir/utils.sh
current_timestamp() {
echo "$(date +%s)"
}
file_mtime() {
if [ ! -f "$1" ]; then
echo -1
return
fi
case $(uname -s) in
Linux|Darwin)
date -r "$1" +%s
;;
FreeBSD)
stat -f %m "$1"
;;
CYGWIN*|MINGW32*|MSYS*|MINGW*)
# TODO - windows compatability
;;
esac
}
timestamp_date() {
case $(uname -s) in
Linux)
date -d "@$1" "$2"
;;
Darwin|FreeBSD)
date -r "$1" "$2"
;;
CYGWIN*|MINGW32*|MSYS*|MINGW*)
# TODO - windows compatability
;;
esac
}
set_tmux_option() {
local option="$1"
local value="$2"
tmux set-option -gq "$option" "$value"
}
# tmux-resurrect dir
resurrect_dir() {
if [ -z "$_RESURRECT_DIR" ]; then
local path="$(get_tmux_option "$resurrect_dir_option" "$default_resurrect_dir")"
# expands tilde, $HOME and $HOSTNAME if used in @resurrect-dir
echo "$path" | sed "s,\$HOME,$HOME,g; s,\$HOSTNAME,$(hostname),g; s,\~,$HOME,g"
else
echo "$_RESURRECT_DIR"
fi
}
_RESURRECT_DIR="$(resurrect_dir)"
last_resurrect_file() {
echo "$(resurrect_dir)/last"
}
last_saved_timestamp() {
local last_saved_timestamp="$(get_tmux_option "$last_auto_save_option" "")"
local first_save_timestamp="$(get_tmux_option "$first_save" "")"
# continuum sets the last save timestamp to the current time on first load if auto_save_option is not set
# so we can outrace it and detect that last_uato_save_option is empty and the timestamp is a dummy save
if [ -z "$first_save_timestamp" ]; then
last_saved_timestamp="$(file_mtime "$(last_resurrect_file)")" || last_saved_timestamp=-1
set_tmux_option "$first_save" "$last_saved_timestamp"
elif [ "$first_save_timestamp" != "done" ]; then
last_saved_timestamp="$(file_mtime "$(last_resurrect_file)")" || last_saved_timestamp=-1
if [ "$last_saved_timestamp" -gt "$first_save_timestamp" ]; then
set_tmux_option "$first_save" "done"
else
last_saved_timestamp="$first_save_timestamp"
fi
fi
echo "$last_saved_timestamp"
}
print_status() {
local mode="$(get_tmux_option "$alert_mode" "countdown")"
local info_threshold="$(get_tmux_option "$time_threshold" "15")"
local save_int="$(get_tmux_option "$auto_save_interval_option" "$auto_save_interval_default")"
local interval_seconds="$((save_int * 60))"
local status=""
local last_timestamp="$(last_saved_timestamp)"
local time_delta="$(($(current_timestamp) - last_timestamp))"
local time_delta_minutes="$((time_delta / 60))"
if [[ $save_int -gt 0 ]]; then
if [[ "$time_delta" -gt $((interval_seconds + warn_threshold)) ]]; then
if [[ "$last_timestamp" == -1 ]]; then
status="no save"
else
status="last save: $(timestamp_date "$last_timestamp" '+%F %T')"
fi
if [[ "$mode" == "countdown" ]]; then
# continuum timestamp may be different than file timestamp on first load
local last_continuum_timestamp="$(get_tmux_option "$last_auto_save_option" "")"
time_delta="$(($(current_timestamp) - last_continuum_timestamp))"
time_delta_minutes="$((time_delta / 60))"
status="$status; T$(printf '%+d' "$((time_delta_minutes - save_int))")min"
fi
elif [[ "$time_delta" -le "$info_threshold" ]]; then
status="saved"
else
case "$mode" in
countdown)
status="T$(printf '%+d' "$((time_delta_minutes - save_int))")min";
;;
time)
status="$time_delta_minutes";
;;
alert)
status=""
;;
interval)
status="$save_int"
;;
esac
fi
else
status="off"
fi
echo "$status"
}
print_status

View file

@ -27,6 +27,7 @@ main()
show_border_contrast=$(get_tmux_option "@dracula-border-contrast" false) show_border_contrast=$(get_tmux_option "@dracula-border-contrast" false)
show_day_month=$(get_tmux_option "@dracula-day-month" false) show_day_month=$(get_tmux_option "@dracula-day-month" false)
show_refresh=$(get_tmux_option "@dracula-refresh-rate" 5) show_refresh=$(get_tmux_option "@dracula-refresh-rate" 5)
show_synchronize_panes_label=$(get_tmux_option "@dracula-synchronize-panes-label" "Sync")
time_format=$(get_tmux_option "@dracula-time-format" "") time_format=$(get_tmux_option "@dracula-time-format" "")
IFS=' ' read -r -a plugins <<< $(get_tmux_option "@dracula-plugins" "battery network weather") IFS=' ' read -r -a plugins <<< $(get_tmux_option "@dracula-plugins" "battery network weather")
show_empty_plugins=$(get_tmux_option "@dracula-show-empty-plugins" true) show_empty_plugins=$(get_tmux_option "@dracula-show-empty-plugins" true)
@ -148,6 +149,11 @@ main()
tmux set-option -g status-right-length 250 tmux set-option -g status-right-length 250
script="#($current_dir/git.sh)" script="#($current_dir/git.sh)"
elif [ $plugin = "hg" ]; then
IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-hg-colors" "green dark_gray")
tmux set-option -g status-right-length 250
script="#($current_dir/hg.sh)"
elif [ $plugin = "battery" ]; then elif [ $plugin = "battery" ]; then
IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-battery-colors" "pink dark_gray") IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-battery-colors" "pink dark_gray")
script="#($current_dir/battery.sh)" script="#($current_dir/battery.sh)"
@ -172,6 +178,10 @@ main()
IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-ram-usage-colors" "cyan dark_gray") IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-ram-usage-colors" "cyan dark_gray")
script="#($current_dir/ram_info.sh)" script="#($current_dir/ram_info.sh)"
elif [ $plugin = "tmux-ram-usage" ]; then
IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-tmux-ram-usage-colors" "cyan dark_gray")
script="#($current_dir/tmux_ram_info.sh)"
elif [ $plugin = "network" ]; then elif [ $plugin = "network" ]; then
IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-network-colors" "cyan dark_gray") IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-network-colors" "cyan dark_gray")
script="#($current_dir/network.sh)" script="#($current_dir/network.sh)"
@ -205,6 +215,10 @@ main()
IFS=' ' read -r -a colors <<<$(get_tmux_option "@dracula-terraform-colors" "light_purple dark_gray") IFS=' ' read -r -a colors <<<$(get_tmux_option "@dracula-terraform-colors" "light_purple dark_gray")
script="#($current_dir/terraform.sh $terraform_label)" script="#($current_dir/terraform.sh $terraform_label)"
elif [ $plugin = "continuum" ]; then
IFS=' ' read -r -a colors <<<$(get_tmux_option "@dracula-continuum-colors" "cyan dark_gray")
script="#($current_dir/continuum.sh)"
elif [ $plugin = "weather" ]; then elif [ $plugin = "weather" ]; then
IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-weather-colors" "orange dark_gray") IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-weather-colors" "orange dark_gray")
script="#($current_dir/weather_wrapper.sh $show_fahrenheit $show_location $fixed_location)" script="#($current_dir/weather_wrapper.sh $show_fahrenheit $show_location $fixed_location)"
@ -224,7 +238,9 @@ main()
script="%a %m/%d %I:%M %p ${timezone} " script="%a %m/%d %I:%M %p ${timezone} "
fi fi
fi fi
elif [ $plugin = "synchronize-panes" ]; then
IFS=' ' read -r -a colors <<< $(get_tmux_option "@dracula-synchronize-panes-colors" "cyan dark_gray")
script="#($current_dir/synchronize_panes.sh $show_synchronize_panes_label)"
else else
continue continue
fi fi

163
scripts/hg.sh Executable file
View file

@ -0,0 +1,163 @@
#!/usr/bin/env bash
current_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $current_dir/utils.sh
IFS=' ' read -r -a hide_status <<< $(get_tmux_option "@dracula-hg-disable-status" "false")
IFS=' ' read -r -a current_symbol <<< $(get_tmux_option "@dracula-hg-show-current-symbol" "✓")
IFS=' ' read -r -a diff_symbol <<< $(get_tmux_option "@dracula-hg-show-diff-symbol" "!")
IFS=' ' read -r -a no_repo_message <<< $(get_tmux_option "@dracula-hg-no-repo-message" "")
IFS=' ' read -r -a no_untracked_files <<< $(get_tmux_option "@dracula-hg-no-untracked-files" "false")
# Get added, modified, and removed files from hg status
getChanges()
{
declare -i added=0;
declare -i deleted=0;
declare -i modified=0;
declare -i removed=0;
declare -i untracked=0;
for i in $(hg -R $path status -admru)
do
case $i in
'A')
added+=1
;;
'!')
deleted+=1
;;
'M')
modified+=1
;;
'R')
removed+=1
;;
'?')
untracked+=1
;;
esac
done
output=""
[ $added -gt 0 ] && output+="${added}A"
[ $modified -gt 0 ] && output+=" ${modified}M"
[ $deleted -gt 0 ] && output+=" ${deleted}D"
[ $removed -gt 0 ] && output+=" ${removed}R"
[ $no_untracked_files == "false" -a $untracked -gt 0 ] && output+=" ${untracked}?"
echo $output
}
# getting the #{pane_current_path} from dracula.sh is no longer possible
getPaneDir()
{
nextone="false"
for i in $(tmux list-panes -F "#{pane_active} #{pane_current_path}");
do
if [ "$nextone" == "true" ]; then
echo $i
return
fi
if [ "$i" == "1" ]; then
nextone="true"
fi
done
}
# check if the current or diff symbol is empty to remove ugly padding
checkEmptySymbol()
{
symbol=$1
if [ "$symbol" == "" ]; then
echo "true"
else
echo "false"
fi
}
# check to see if the current repo is not up to date with HEAD
checkForChanges()
{
[ $no_untracked_files == "false" ] && no_untracked="-u" || no_untracked=""
if [ "$(checkForHgDir)" == "true" ]; then
if [ "$(hg -R $path status -admr $no_untracked)" != "" ]; then
echo "true"
else
echo "false"
fi
else
echo "false"
fi
}
# check if a hg repo exists in the directory
checkForHgDir()
{
if [ "$(hg -R $path branch)" != "" ]; then
echo "true"
else
echo "false"
fi
}
# return branch name if there is one
getBranch()
{
if [ $(checkForHgDir) == "true" ]; then
echo $(hg -R $path branch)
else
echo $no_repo_message
fi
}
# return the final message for the status bar
getMessage()
{
if [ $(checkForHgDir) == "true" ]; then
branch="$(getBranch)"
output=""
if [ $(checkForChanges) == "true" ]; then
changes="$(getChanges)"
if [ "${hide_status}" == "false" ]; then
if [ $(checkEmptySymbol $diff_symbol) == "true" ]; then
output=$(echo "${changes} $branch")
else
output=$(echo "$diff_symbol ${changes} $branch")
fi
else
if [ $(checkEmptySymbol $diff_symbol) == "true" ]; then
output=$(echo "$branch")
else
output=$(echo "$diff_symbol $branch")
fi
fi
else
if [ $(checkEmptySymbol $current_symbol) == "true" ]; then
output=$(echo "$branch")
else
output=$(echo "$current_symbol $branch")
fi
fi
echo "$output"
else
echo $no_repo_message
fi
}
main()
{
path=$(getPaneDir)
getMessage
}
#run main driver program
main

26
scripts/synchronize_panes.sh Executable file
View file

@ -0,0 +1,26 @@
#!/usr/bin/env bash
# setting the locale, some users have issues with different locales, this forces the correct one
export LC_ALL=en_US.UTF-8
label=$1
current_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $current_dir/utils.sh
get_synchronize_panes_status() {
current_synchronize_panes_status=$(get_tmux_window_option "synchronize-panes" "off")
echo $current_synchronize_panes_status
}
main()
{
# storing the refresh rate in the variable RATE, default is 5
RATE=$(get_tmux_option "@dracula-refresh-rate" 5)
synchronize_panes_label=$label
synchronize_panes_status=$(get_synchronize_panes_status)
echo "$synchronize_panes_label $synchronize_panes_status"
sleep $RATE
}
# run main driver
main

120
scripts/tmux_ram_info.sh Executable file
View file

@ -0,0 +1,120 @@
#!/usr/bin/env bash
# setting the locale, some users have issues with different locales, this forces the correct one
export LC_ALL=en_US.UTF-8
current_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "$current_dir/utils.sh"
get_cpids_linux() {
local ppid="$1"
local cpids
local cpid
echo "$ppid"
cpids="$(pgrep -P "$ppid")"
for cpid in $cpids; do
get_cpids_linux "$cpid"
done
}
get_cpids_unix() {
local ppid="$1"
local cpids
local cpid
echo "$ppid"
cpids="$(pgrep -aP "$ppid")"
for cpid in $cpids; do
get_cpids_unix "$cpid"
done
}
kb_to_mb() {
if [ $# == 0 ]; then
read -r num
else
num="$1"
fi
bc <<< "scale=3;$num/1024"
}
kb_to_gb() {
if [ $# == 0 ]; then
read -r num
else
num="$1"
fi
bc <<< "scale=6;$num/1048576"
}
round() {
if [ $# == 1 ]; then
read -r num
scale="$1"
elif [ $# == 2 ]; then
num="$1"
scale="$2"
fi
printf "%.${scale}f" "${num}"
}
get_tmux_ram_usage()
{
local pid
local pids
local total_mem_kb=0
local total_mem_mb=0
local total_mem_gb=0
pid="$(tmux display-message -pF '#{pid}')"
case $(uname -s) in
Linux)
if command -v pstree > /dev/null; then
pids="$(pstree -p "$pid" | tr -d '\n' | sed -rn -e 's/[^()]*\(([0-9]+)\)[^()]*/\1,/g' -e 's/,$//p')"
else
pids="$(get_cpids_linux "$pid" | tr '\n' ',')"
fi
total_mem_kb="$(ps -o rss= -p "$pids" | paste -sd+ | bc)"
;;
Darwin)
if command -v pstree > /dev/null; then
pids="$(pstree "$pid" | sed -En 's/[^0-9]+([0-9]+) .*/\1/p' | tr '\n' ',')"
else
pids="$(get_cpids_unix "$pid" | tr '\n' ',')"
fi
total_mem_kb="$(ps -o rss= -p "$pids" | paste -sd+ - | bc)"
;;
FreeBSD)
# TODO check FreeBSD compatibility
if command -v pstree > /dev/null; then
pids="$(pstree "$pid" | sed -En 's/[^0-9]+([0-9]+) .*/\1/p' | tr '\n' ',')"
else
pids="$(get_cpids_unix "$pid" | tr '\n' ',')"
fi
total_mem_kb="$(ps -o rss= -p "$pids" | paste -sd+ - | bc)"
;;
CYGWIN*|MINGW32*|MSYS*|MINGW*)
# TODO - windows compatability
;;
esac
total_mem_mb=$(kb_to_mb "$total_mem_kb" | round 0)
total_mem_gb=$(kb_to_gb "$total_mem_kb" | round 0)
if (( total_mem_gb > 0)); then
echo "${total_mem_gb}GB"
elif (( total_mem_mb > 0 )); then
echo "${total_mem_mb}MB"
else
echo "${total_mem_kb}kB"
fi
}
main()
{
ram_label=$(get_tmux_option "@dracula-tmux-ram-usage-label" "MEM")
ram_usage=$(get_tmux_ram_usage)
echo "$ram_label $ram_usage"
}
#run main driver
main

View file

@ -11,6 +11,17 @@ get_tmux_option() {
fi fi
} }
get_tmux_window_option() {
local option=$1
local default_value=$2
local option_value=$(tmux show-window-options -v "$option")
if [ -z "$option_value" ]; then
echo $default_value
else
echo $option_value
fi
}
# normalize the percentage string to always have a length of 5 # normalize the percentage string to always have a length of 5
normalize_percent_len() { normalize_percent_len() {
# the max length that the percent can reach, which happens for a two digit number with a decimal house: "99.9%" # the max length that the percent can reach, which happens for a two digit number with a decimal house: "99.9%"