#!/bin/bash # Define paths and phrases path="${XDG_SOURCES_HOME:-${HOME}/.local/src}/suckless/dwm/thesiah" readme_file="${XDG_DATA_HOME:-${HOME}/.local/share}/thesiah/thesiah.mom" output_file="$path.mom" temp_file_before="$path.tmp.before" temp_file_after="$path.tmp.after" start_phrase="When config.def.h in DWM and ST is saved, key bindings will be extracted and updated below." end_phrase=".HEADING 2 \"Other buttons\"" [ -f "$path.mom" ] && source_file="$path.mom" || source_file="$path-default.mom" # Extract the section before the end marker sed "/$end_phrase/,\$d" "$source_file" >"$temp_file_before" # Extract the section from the end marker to the end of the file sed -n "/$end_phrase/,\$p" "$source_file" >"$temp_file_after" # Remove the contents between the start and end phrases, including the markers themselves sed -i "/$start_phrase/,/$end_phrase/d" "$temp_file_before" # Verify that the section has been removed echo "Section between markers removed. Check $temp_file_before for correctness." # Re-append the start marker since it was deleted echo "$start_phrase" >>"$temp_file_before" # Define your configuration files mapfile -t config_files <>"$temp_file_before" if [ "$project_name" == "DWM" ]; then printf ".PP\nTHESIAH's window manager. I do not use a desktop environment.\n" >>"$temp_file_before" elif [ "$project_name" == "ST" ]; then printf ".PP\nTHESIAH's default terminal in C. It is light, configurable, and fast.\n" >>"$temp_file_before" fi echo ".LI" >>"$temp_file_before" awk 'BEGIN {flag=0} /static[[:space:]]+(const[[:space:]]+)?(Keychord|Shortcut)[[:space:]]+(*keychords|shortcuts)[[:space:]]*\[\][[:space:]]*=[[:space:]]*{/ {flag=1} /\};/ {flag=0} flag' "$file_path" | while read -r line; do if [[ "$line" =~ \/\*.*\*\/ || "$line" =~ .*\"\\.* || "$line" =~ ^$ || "$line" =~ STACKKEYS || "$line" =~ TAGKEYS || "$line" =~ static\ Keychord\ \*keychords || "$line" =~ static\ Shortcut\ \shortcuts || "$line" =~ ^\#.* ]]; then continue fi if [[ "$line" =~ ^\/\/.* ]]; then echo ".LIST OFF" >>"$temp_file_before" line=$(echo "$line" | sed -e 's/\/\/\s*//g' | awk '{for (i=1; i<=NF; i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2)); print}') output_line=".HEADING 5 \"$line\"" echo "$output_line" >>"$temp_file_before" echo ".LI" >>"$temp_file_before" continue fi if echo "$line" | grep -q "Keychord"; then line=$(echo "$line" | sed -e "s/&((Keychord){[0-9], {{\(.*\)}),/\1/g;s/^0\(.*XF86XK_.*\)/MEDIA\1/g;/XF86XK_/!s/^0/Null/;s/\([MEDIA\|WIN\|ALT\|ULTRA\|EXTRA\|Shift\|Control]\w\+\),\s\(.*\)}},\s\+\(\w\+\),\s\([^,]*\)/\1|\2|\3|\4/g;s/},{0,//g;s/},{\(Shift\|Ctrl\),/\1/g;s/},{//g;s/Null//g") else line=$(echo "$line" | sed -e "s/^{ \(.*\) },/\1/g;s/{ \([^, ]*\), \([^, ]*\), \([^, ]*\), \([^}]*\) }/\1 \2 \3 \4/g;s/,/|/g") fi modkey=$(echo "$line" | awk -F'|' '{print $1}' | sed "s/\b0//g; s/WINKEY/WIN/g;s/WINMODALL/WIN+Ctrl+Shift/g;s/WINMOD2/WIN+Ctrl/g;s/WINMOD/WIN+Shift/g; s/ALTKEY/ALT/g;s/ALTMODALL/ALT+Ctrl+Shift/g;s/ALTMOD2/ALT+Ctrl/g;s/ALTMOD/ALT+Shift/g; s/ULTRAKEY/WIN+ALT/g;s/ULTRAMODALL/WIN+ALT+Ctrl+Shift/g;s/ULTRAMOD2/WIN+ALT+Ctrl/g;s/ULTRAMOD/WIN+ALT+Shift/g; s/EXTRAMOD/Ctrl+Shift/g; s/\(Shift\|Control\)Mask/\1/g; s/Control/Ctrl/g; s/ //g; s/XK_NO_MOD/NO_MOD/g; s/XK_ANY_MOD/ANY_MOD/g") key=$(echo "$line" | awk -F'|' '{print $2}' | sed "s/\b0//g; s/XF86XK_//g; s/XK_//g; s/\s*\(.*\)_R$/Right_\1/g; s/\s*\(.*\)_L$/Left_\1/g; s/MODKEY\(\d*\)/MOD\1/g; s/\(Shift\|Control\)Mask[?,]/\<\1\>/g; s/Control/Ctrl/g; s/space//g; s/BackSpace//g; s/apostrophe/\'/g; s/comma/,/g; s/bracketleft/[/g; s/bracketright/]/g; s/equal/=/g; s/grave/\`/g; s/minus/-/g; s/period/./g; s/slash/\//g; s/semicolon/;/g; s/|/+/g; s/ //g") func=$(echo "$line" | awk -F'|' '{print $3}' | grep -v "spawn" | sed "s/ //g") args=$(echo "$line" | cut -d'|' -f4- | sed -E 's/.*\.v\s*=\s*\(const\s*char\s*\*\[\]\)\s*\{\s*([^}]*)\s*\}.*/\1/g; s/.*\.v\s*=\s*\(int\s*\[\]\)\s*\{\s*([^}]*)\s*\}.*/\1/g; s/.*SHCMD\((.*)\).*/\1/g; s/.*\{\s*\.\w*\s*=\s*(.*)\s*\}.*/\1/g; s/\{0\}//g; s/\"//g; s/\,//g; s/NULL//g; s/TERMINAL\s*-e\s*//g; s/&layouts\[0\]/"[]="/g; s/&layouts\[1\]/"[M]"/g; s/&layouts\[2\]/"|||"/g; s/&layouts\[3\]/"[@]"/g; s/&layouts\[4\]/"[\\\\]"/g; s/&layouts\[5\]/"H[]"/g; s/&layouts\[6\]/"TTT"/g; s/&layouts\[7\]/"==="/g; s/&layouts\[8\]/"HHH"/g; s/&layouts\[9\]/"###"/g; s/&layouts\[10\]/"---"/g; s/&layouts\[11\]/":::"/g; s/&layouts\[12\]/"|M|"/g; s/&layouts\[13\]/">M>"/g; s/^\s*//g; /^\s*0\s*$/d ') # args=$(echo "$line" | cut -d',' -f4- | sed "s/\.v = (const char \*\[\])//g;s/{\s*\.v = (int \[\])//g;s/SHCMD(\(.*\))/\1/g;s/\.. = //g") if [[ -z "$modkey" ]]; then if [[ -z $func ]]; then output_line="\\f(CW${key}\\fP \\(en ${args}" else output_line="\\f(CW${key}\\fP \\(en ${func} ${args}" fi else if [[ -z $func ]]; then output_line="\\f(CW${modkey}+${key}\\fP \\(en ${args}" else output_line="\\f(CW${modkey}+${key}\\fP \\(en ${func} ${args}" fi fi echo ".ITEM" >>"$temp_file_before" echo "$output_line" >>"$temp_file_before" done echo ".LIST OFF" >>"$temp_file_before" done # Append the latter part of the document that follows the end marker cat "$temp_file_after" >>"$temp_file_before" # Replace the original file with the updated content mv -f "$temp_file_before" "$output_file" cp -f "$output_file" "$readme_file" # Clean up the temporary after-section file rm -f "$temp_file_after" notify-send "👍 Operation completed successfully."