aboutsummaryrefslogtreecommitdiffstats
path: root/modules/desktop/sxhkd/scripts/keybindings.sh
blob: 1548f1c634d3a9b11112ad6b3c55fbc2e8a6496d (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