aboutsummaryrefslogtreecommitdiffstats
path: root/modules/scripts/i3-keybindings.sh
blob: 22ddef47c446dc54c6290864e9ab42ddd1069eab (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
# Path to your i3 config file
I3_CONFIG="$HOME/.config/i3/config"

# Function to wrap text
wrap_text() {
  local text="$1"
  local width="$2"
  echo "$text" | fold -s -w "$width"
}

# Get terminal width and calculate columns
terminal_width=$(tput cols)
table_width=$((terminal_width - 4))
max_keybinding_length=$((table_width / 3)) # Keybindings are usually shorter in i3
max_keybinding_content_length=$((max_keybinding_length - 2))
description_width=$((table_width - max_keybinding_length - 1))
description_content_width=$((description_width - 2))

# Border lines
top_border="┌$(printf '%.0s─' $(seq 1 $max_keybinding_length))┬$(printf '%.0s─' $(seq 1 $description_width))┐"
row_sep="├$(printf '%.0s─' $(seq 1 $max_keybinding_length))┼$(printf '%.0s─' $(seq 1 $description_width))┤"
bottom_border="└$(printf '%.0s─' $(seq 1 $max_keybinding_length))┴$(printf '%.0s─' $(seq 1 $description_width))┘"

{
  echo "$top_border"
  printf "│ %-*s │ %-*s │\n" "$max_keybinding_content_length" "KEYBINDING" "$description_content_width" "DESCRIPTION"

  last_comment=""

  # Read i3 config line by line
  while IFS= read -r line; do
    # If line is a comment, store it as a potential description
    if [[ $line =~ ^#\ (.*) ]]; then
      last_comment="${BASH_REMATCH[1]}"

    # If line contains a bindsym
    elif [[ $line =~ ^bindsym ]]; then
      # Extract the key combo (the parts between 'bindsym' and the start of the command/exec)
      # This regex captures bindsym [options] <keysym> <command>
      keybinding=$(echo "$line" | awk '{print $2}')

      # If the comment is empty, use the command itself as the description
      if [[ -z "$last_comment" ]]; then
          display_desc=$(echo "$line" | cut -d' ' -f3-)
      else
          display_desc="$last_comment"
      fi

      wrapped_description=$(wrap_text "$display_desc" "$description_content_width")

      echo "$row_sep"

      # Print first line of binding and description
      printf "│ %-*s │ %-*s │\n" "$max_keybinding_content_length" "$keybinding" "$description_content_width" "$(echo "$wrapped_description" | head -n 1)"

      # Print subsequent lines of wrapped description
      echo "$wrapped_description" | sed '1d' | while read -r continuation; do
        printf "│ %-*s │ %-*s │\n" "$max_keybinding_content_length" "" "$description_content_width" "$continuation"
      done

      # Reset comment after use
      last_comment=""
    fi
  done < "$I3_CONFIG"

  echo "$bottom_border"
} | less -R