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