blob: e7134158ac06baea3ce89f85cbec8c69ca0e5268 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#!/bin/sh
# Path to your sxhkd config file
SXHKD_FILE="$HOME/.config/sxhkd/sxhkdrc"
# Function to wrap text to a specified width
wrap_text() {
local text="$1"
local width="$2"
echo "$text" | fold -s -w "$width"
}
# Get terminal width
terminal_width=$(tput cols)
# Set the table width to the full terminal width, leaving space for borders
table_width=$((terminal_width - 4)) # 4 for the borders and space between columns
# Set keybinding column width to half of the available width
max_keybinding_length=$((table_width / 2))
# Length of the cotent inside the cell (2 spaces are substracted for padding)
max_keybinding_content_length=$((max_keybinding_length - 2))
# Set the description column width to the other half
description_width=$((table_width - max_keybinding_length - 1)) # 1 for the separator between columns
# Length of the cotent inside the cell (2 spaces are substracted for padding)
description_content_width=$((description_width - 2))
# Generate the top border line and row separator
border_line="├$(printf '%.0s─' $(seq 1 $max_keybinding_length))┼$(printf '%.0s─' $(seq 1 $description_width))┤"
# Pipe all output to less
{
# Print table header with borders
echo "┌$(printf '%.0s─' $(seq 1 $max_keybinding_length))┬$(printf '%.0s─' $(seq 1 $description_width))┐"
printf "│ %-*s │ %-*s │\n" "$max_keybinding_content_length" "KEYBINDING" "$description_content_width" "DESCRIPTION"
description=""
# Load the sxhkd file into an array
mapfile -t lines < "$SXHKD_FILE"
# Loop through lines for output
for line in "${lines[@]}"; do
# Check if the line is a comment
if [[ $line =~ ^# ]]; then
# Remove the "#" and any leading/trailing whitespace to capture the description
description="${line#\# }"
elif [[ $line =~ ^[^#[:space:]] ]]; then
# If it's a keybinding line, store it
keybinding="$line"
# Move to the next line for the command
command="${lines[((++i))]}"
# Wrap the description to the calculated width
wrapped_description=$(wrap_text "$description" "$description_width")
# Print the keybinding with a border line above and below it
echo "$border_line"
printf "│ %-*s │ %-*s │\n" "$max_keybinding_content_length" "$keybinding" "$description_content_width" "$(echo "$wrapped_description" | head -n 1)"
# Print wrapped description lines with empty keybinding column
echo "$wrapped_description" | sed '1d' | while read -r continuation; do
printf "│ %-*s │ %-*s │\n" "$max_keybinding_content_length" "" "$description_content_width" "$continuation"
done
# Reset description for the next keybinding
description=""
fi
done
# Print the final border line
echo "└$(printf '%.0s─' $(seq 1 $max_keybinding_length))┴$(printf '%.0s─' $(seq 1 $description_width))┘"
} | less
|