hyprctl: Add shell completions (#5404)

This commit is contained in:
LOSEARDES77 2024-04-04 09:21:20 +02:00 committed by GitHub
parent b7d71bc0e1
commit 1b43cd5231
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 770 additions and 1 deletions

View File

@ -36,15 +36,21 @@ install:
mkdir -p ${PREFIX}/share/wayland-sessions
mkdir -p ${PREFIX}/bin
mkdir -p ${PREFIX}/share/hyprland
mkdir -p ${PREFIX}/share/bash-completion
mkdir -p ${PREFIX}/share/fish/completions
mkdir -p ${PREFIX}/share/zsh/site-functions
cp -f ./build/Hyprland ${PREFIX}/bin
cp -f ./build/hyprctl/hyprctl ${PREFIX}/bin
cp -f ./build/hyprpm/hyprpm ${PREFIX}/bin
cp -f ./hyprctl/hyprctl.bash ${PREFIX}/share/bash-completion/hyprctl
cp -f ./hyprctl/hyprctl.fish ${PREFIX}/share/fish/completions/hyprctl.fish
cp -f ./hyprctl/hyprctl.zsh ${PREFIX}/share/zsh/site-functions/_hyprctl
chmod 755 ${PREFIX}/bin/Hyprland
chmod 755 ${PREFIX}/bin/hyprctl
chmod 755 ${PREFIX}/bin/hyprpm
cd ${PREFIX}/bin && ln -sf Hyprland hyprland
if [ ! -f ${PREFIX}/share/wayland-sessions/hyprland.desktop ]; then cp ./example/hyprland.desktop ${PREFIX}/share/wayland-sessions; fi
mkdir -p ${PREFIX}/share/hyprland
cp ./assets/wall* ${PREFIX}/share/hyprland
mkdir -p ${PREFIX}/share/xdg-desktop-portal
cp ./assets/hyprland-portals.conf ${PREFIX}/share/xdg-desktop-portal

132
hyprctl/hyprctl.bash Normal file
View File

@ -0,0 +1,132 @@
_hyprctl_cmd_3 () {
hyprctl monitors | grep Monitor | awk '{ print $2 }'
}
_hyprctl_cmd_2 () {
hyprpm list | grep "Plugin" | awk '{print $4}'
}
_hyprctl_cmd_0 () {
hyprctl devices | sed -n '/Keyboard at/{n; s/^\s\+//; p}'
}
_hyprctl_cmd_1 () {
hyprctl clients | grep class | awk '{print $2}'
}
_hyprctl () {
if [[ $(type -t _get_comp_words_by_ref) != function ]]; then
echo _get_comp_words_by_ref: function not defined. Make sure the bash-completions system package is installed
return 1
fi
local words cword
_get_comp_words_by_ref -n "$COMP_WORDBREAKS" words cword
local -a literals=("focusmonitor" "exit" "global" "forceallowsinput" "::=" "movecursortocorner" "movewindowpixel" "activeworkspace" "monitors" "movecurrentworkspacetomonitor" "togglespecialworkspace" "all" "animationstyle" "closewindow" "setprop" "clients" "denywindowfromgroup" "create" "moveoutofgroup" "headless" "activebordercolor" "rollinglog" "wayland" "movewindoworgroup" "setcursor" "fakefullscreen" "moveactive" "prev" "hyprpaper" "alpha" "inactivebordercolor" "-i" "--instance" "togglefloating" "settiled" "swapwindow" "dimaround" "setignoregrouplock" "layouts" "0" "forcenoborder" "notify" "binds" "focuswindow" "seterror" "1" "systeminfo" "exec" "cyclenext" "nomaxsize" "reload" "rounding" "layers" "setfloating" "5" "lockactivegroup" "movetoworkspace" "swapactiveworkspaces" "changegroupactive" "forcenodim" "0" "configerrors" "4" "forceopaque" "forcenoshadow" "workspaces" "1" "swapnext" "minsize" "alphaoverride" "toggleopaque" "decorations" "alterzorder" "bordersize" "-1" "focuscurrentorlast" "workspacerules" "splitratio" "remove" "renameworkspace" "movetoworkspacesilent" "killactive" "pass" "getoption" "switchxkblayout" "2" "auto" "pin" "version" "nofocus" "togglegroup" "workspace" "lockgroups" "-r" "movewindow" "cursorpos" "focusworkspaceoncurrentmonitor" "execr" "windowdancecompat" "globalshortcuts" "3" "keyword" "movefocus" "movecursor" "instances" "dpms" "x11" "moveintogroup" "resizewindowpixel" "kill" "moveworkspacetomonitor" "forceopaqueoverriden" "dispatch" "-j" "forcenoblur" "devices" "disable" "-b" "activewindow" "fullscreen" "keepaspectratio" "output" "plugin" "alphainactiveoverride" "alphainactive" "resizeactive" "centerwindow" "splash" "focusurgentorlast" "submap" "next" "movegroupwindow" "forcenoanims" "forcerendererreload" "maxsize" "dismissnotify")
declare -A literal_transitions
literal_transitions[0]="([44]=31 [115]=3 [46]=3 [84]=21 [83]=3 [117]=11 [50]=3 [52]=3 [118]=3 [7]=3 [8]=28 [121]=25 [14]=7 [88]=3 [15]=3 [122]=24 [61]=3 [93]=11 [21]=3 [24]=3 [65]=3 [95]=3 [28]=3 [99]=3 [127]=3 [101]=30 [71]=18 [104]=3 [38]=3 [109]=3 [76]=3 [113]=11 [112]=27 [41]=1 [42]=3 [135]=2)"
literal_transitions[6]="([86]=3 [19]=3 [106]=3 [22]=3)"
literal_transitions[7]="([124]=3 [63]=8 [64]=8 [49]=8 [98]=8 [30]=3 [29]=3 [51]=2 [3]=8 [68]=3 [69]=8 [120]=8 [12]=3 [73]=2 [36]=8 [132]=8 [89]=8 [59]=8 [111]=8 [40]=8 [20]=3 [123]=8 [134]=3 [114]=8)"
literal_transitions[8]="([39]=3 [45]=3)"
literal_transitions[9]="([4]=10)"
literal_transitions[10]="([32]=11 [31]=11)"
literal_transitions[12]="([27]=3 [130]=3)"
literal_transitions[15]="([4]=4)"
literal_transitions[16]="([4]=17)"
literal_transitions[17]="([60]=3)"
literal_transitions[18]="([62]=3 [85]=3 [100]=3 [66]=3 [74]=3 [54]=3)"
literal_transitions[20]="([4]=13)"
literal_transitions[25]="([17]=6 [78]=26)"
literal_transitions[27]="([0]=3 [1]=3 [47]=3 [48]=3 [2]=3 [80]=3 [81]=3 [82]=3 [5]=3 [6]=3 [53]=3 [55]=3 [10]=3 [9]=3 [56]=3 [119]=3 [13]=3 [87]=3 [16]=3 [57]=3 [18]=3 [58]=3 [90]=3 [94]=3 [96]=3 [91]=3 [23]=3 [92]=3 [25]=3 [26]=3 [67]=3 [97]=3 [125]=3 [126]=3 [33]=3 [70]=3 [102]=3 [34]=3 [103]=3 [72]=3 [35]=3 [128]=3 [129]=3 [75]=3 [37]=3 [105]=3 [107]=3 [108]=3 [77]=3 [110]=3 [131]=3 [43]=3 [133]=3 [79]=3)"
literal_transitions[28]="([11]=3)"
literal_transitions[29]="([42]=3 [115]=3 [44]=31 [50]=3 [83]=3 [84]=21 [52]=3 [118]=3 [7]=3 [8]=28 [121]=25 [14]=7 [88]=3 [15]=3 [122]=24 [61]=3 [21]=3 [24]=3 [65]=3 [95]=3 [28]=3 [99]=3 [127]=3 [101]=30 [71]=18 [104]=3 [38]=3 [109]=3 [76]=3 [112]=27 [41]=1 [46]=3 [135]=2)"
literal_transitions[31]="([116]=3)"
literal_transitions[32]="([4]=22)"
declare -A match_anything_transitions
match_anything_transitions=([0]=29 [4]=5 [23]=15 [2]=3 [18]=19 [28]=9 [31]=9 [24]=3 [29]=29 [13]=14 [14]=32 [1]=2 [22]=23 [19]=20 [5]=16 [12]=3 [30]=3 [3]=9 [21]=12 [26]=3)
declare -A subword_transitions
local state=0
local word_index=1
while [[ $word_index -lt $cword ]]; do
local word=${words[$word_index]}
if [[ -v "literal_transitions[$state]" ]]; then
declare -A state_transitions
eval "state_transitions=${literal_transitions[$state]}"
local word_matched=0
for literal_id in $(seq 0 $((${#literals[@]} - 1))); do
if [[ ${literals[$literal_id]} = "$word" ]]; then
if [[ -v "state_transitions[$literal_id]" ]]; then
state=${state_transitions[$literal_id]}
word_index=$((word_index + 1))
word_matched=1
break
fi
fi
done
if [[ $word_matched -ne 0 ]]; then
continue
fi
fi
if [[ -v "match_anything_transitions[$state]" ]]; then
state=${match_anything_transitions[$state]}
word_index=$((word_index + 1))
continue
fi
return 1
done
local prefix="${words[$cword]}"
local shortest_suffix="$word"
for ((i=0; i < ${#COMP_WORDBREAKS}; i++)); do
local char="${COMP_WORDBREAKS:$i:1}"
local candidate="${word##*$char}"
if [[ ${#candidate} -lt ${#shortest_suffix} ]]; then
shortest_suffix=$candidate
fi
done
local superfluous_prefix=""
if [[ "$shortest_suffix" != "$word" ]]; then
local superfluous_prefix=${word%$shortest_suffix}
fi
if [[ -v "literal_transitions[$state]" ]]; then
local state_transitions_initializer=${literal_transitions[$state]}
declare -A state_transitions
eval "state_transitions=$state_transitions_initializer"
for literal_id in "${!state_transitions[@]}"; do
local literal="${literals[$literal_id]}"
if [[ $literal = "${prefix}"* ]]; then
local completion=${literal#"$superfluous_prefix"}
COMPREPLY+=("$completion ")
fi
done
fi
declare -A commands
commands=([4]=0 [13]=2 [22]=3 [18]=1)
if [[ -v "commands[$state]" ]]; then
local command_id=${commands[$state]}
local completions=()
mapfile -t completions < <(_hyprctl_cmd_${command_id} "$prefix" | cut -f1)
for item in "${completions[@]}"; do
if [[ $item = "${prefix}"* ]]; then
COMPREPLY+=("$item")
fi
done
fi
return 0
}
complete -o nospace -F _hyprctl hyprctl

221
hyprctl/hyprctl.fish Normal file
View File

@ -0,0 +1,221 @@
function _hyprctl_4
set 1 $argv[1]
hyprctl monitors | grep Monitor | awk '{ print $2 }'
end
function _hyprctl_3
set 1 $argv[1]
hyprpm list | grep "Plugin" | awk '{print $4}'
end
function _hyprctl_1
set 1 $argv[1]
hyprctl devices | sed -n '/Keyboard at/{n; s/^\s\+//; p}'
end
function _hyprctl_2
set 1 $argv[1]
hyprctl clients | grep class | awk '{print $2}'
end
function _hyprctl
set COMP_LINE (commandline --cut-at-cursor)
set COMP_WORDS
echo $COMP_LINE | read --tokenize --array COMP_WORDS
if string match --quiet --regex '.*\s$' $COMP_LINE
set COMP_CWORD (math (count $COMP_WORDS) + 1)
else
set COMP_CWORD (count $COMP_WORDS)
end
set --local literals "focusmonitor" "exit" "global" "forceallowsinput" "::=" "movecursortocorner" "movewindowpixel" "activeworkspace" "monitors" "movecurrentworkspacetomonitor" "togglespecialworkspace" "all" "animationstyle" "closewindow" "setprop" "clients" "denywindowfromgroup" "create" "moveoutofgroup" "headless" "activebordercolor" "rollinglog" "wayland" "movewindoworgroup" "setcursor" "fakefullscreen" "moveactive" "prev" "hyprpaper" "alpha" "inactivebordercolor" "-i" "--instance" "togglefloating" "settiled" "swapwindow" "dimaround" "setignoregrouplock" "layouts" "0" "forcenoborder" "notify" "binds" "focuswindow" "seterror" "1" "systeminfo" "exec" "cyclenext" "nomaxsize" "reload" "rounding" "layers" "setfloating" "5" "lockactivegroup" "movetoworkspace" "swapactiveworkspaces" "changegroupactive" "forcenodim" "0" "configerrors" "4" "forceopaque" "forcenoshadow" "workspaces" "1" "swapnext" "minsize" "alphaoverride" "toggleopaque" "decorations" "alterzorder" "bordersize" "-1" "focuscurrentorlast" "workspacerules" "splitratio" "remove" "renameworkspace" "movetoworkspacesilent" "killactive" "pass" "getoption" "switchxkblayout" "2" "auto" "pin" "version" "nofocus" "togglegroup" "workspace" "lockgroups" "-r" "movewindow" "cursorpos" "focusworkspaceoncurrentmonitor" "execr" "windowdancecompat" "globalshortcuts" "3" "keyword" "movefocus" "movecursor" "instances" "dpms" "x11" "moveintogroup" "resizewindowpixel" "kill" "moveworkspacetomonitor" "forceopaqueoverriden" "dispatch" "-j" "forcenoblur" "devices" "disable" "-b" "activewindow" "fullscreen" "keepaspectratio" "output" "plugin" "alphainactiveoverride" "alphainactive" "resizeactive" "centerwindow" "splash" "focusurgentorlast" "submap" "next" "movegroupwindow" "forcenoanims" "forcerendererreload" "maxsize" "dismissnotify"
set --local descriptions
set descriptions[1] "focuses a monitor"
set descriptions[2] "exits the compositor with no questions asked"
set descriptions[3] "Executes a Global Shortcut using the GlobalShortcuts portal"
set descriptions[6] "moves the cursor to the corner of the active window"
set descriptions[7] "moves a selected window resizeparams"
set descriptions[8] "Gets the active workspace name and its properties"
set descriptions[9] "lists active outputs with their properties"
set descriptions[10] "Moves the active workspace to a monitor"
set descriptions[11] "toggles a special workspace on/off"
set descriptions[14] "closes a specified window"
set descriptions[15] "Sets a property of a window"
set descriptions[16] "Lists all windows with their properties"
set descriptions[17] "Prohibit the active window from becoming or being inserted into group"
set descriptions[19] "Moves the active window out of a group"
set descriptions[22] "Prints tail of the log"
set descriptions[24] "Behaves as moveintogroup"
set descriptions[25] "Sets the cursor theme and reloads the cursor manager"
set descriptions[26] "toggles the focused windows internal fullscreen state"
set descriptions[27] "moves the active window resizeparams"
set descriptions[29] "Interact with hyprpaper if present"
set descriptions[32] "Specify the Hyprland instalnce"
set descriptions[33] "Specify the Hyprland instalnce"
set descriptions[34] "toggles the current windows floating state"
set descriptions[35] "sets the current windows floating state to false"
set descriptions[36] "swaps the active window with another window"
set descriptions[38] "Temporarily enable or disable binds:ignore_group_lock"
set descriptions[39] "lists all layouts available (including plugin'd ones)"
set descriptions[42] "Sends a notification using the built-in Hyprland notification system"
set descriptions[43] "Lists all registered binds"
set descriptions[44] "focuses the first window matching"
set descriptions[45] "Sets the hyprctl error string"
set descriptions[47] "Prints system info"
set descriptions[48] "executes a shell command"
set descriptions[49] "focuses the next window on a workspace"
set descriptions[51] "Force reloads the config"
set descriptions[53] "List the layers"
set descriptions[54] "sets the current windows floating state to true"
set descriptions[55] "OK"
set descriptions[56] "Lock the focused group"
set descriptions[57] "moves the focused window to a workspace"
set descriptions[58] "Swaps the active workspaces between two monitors"
set descriptions[59] "switches to the next window in a group"
set descriptions[61] "WARNING"
set descriptions[62] "Lists all current config parsing errors"
set descriptions[63] "CONFISED"
set descriptions[66] "Lists all workspaces with their properties"
set descriptions[67] "INFOROR"
set descriptions[68] "swaps the focused window with the next window"
set descriptions[71] "toggles the current window to always be opaque"
set descriptions[72] "Lists all decorations and their info"
set descriptions[73] "Modify the window stack order of the active or specified window"
set descriptions[75] "No Icon"
set descriptions[76] "Switch focus from current to previously focused window"
set descriptions[77] "Gets the list of defined workspace rules"
set descriptions[78] "changes the split ratio"
set descriptions[80] "rename a workspace"
set descriptions[81] "move window doesnt switch to the workspace"
set descriptions[82] "closes the active window"
set descriptions[83] "passes the key to a specified window"
set descriptions[84] "Gets the config option status (values)"
set descriptions[85] "Sets the xkb layout index for a keyboard"
set descriptions[86] "HINT"
set descriptions[88] "pins a window"
set descriptions[89] "Prints the Hyprland version, meaning flags, commit and branch of build"
set descriptions[91] "toggles the current active window into a group"
set descriptions[92] "changes the workspace"
set descriptions[93] "Locks the groups"
set descriptions[94] "Refresh state befor issuing the command"
set descriptions[95] "moves the active window in a direction or to a monitor"
set descriptions[96] "Gets the current cursor pos in global layout coordinates"
set descriptions[97] "Focuses the requested workspace"
set descriptions[98] "executes a raw shell command"
set descriptions[101] "ERROR"
set descriptions[102] "Issue a keyword to call a config keyword dynamically"
set descriptions[103] "moves the focus in a direction"
set descriptions[104] "moves the cursor to a specified position"
set descriptions[105] "Lists all running instances of Hyprland with thir info"
set descriptions[106] "sets all monitors DPMS status"
set descriptions[108] "Moves the active window into a group"
set descriptions[109] "resizes a selected window"
set descriptions[110] "Get into a kill mode, where you can kill an app by clicking on it"
set descriptions[111] "Moves a workspace to a monitor"
set descriptions[113] "Issue a dispatch to call a keybind dispatcher with an arg"
set descriptions[114] "Output in JSON format"
set descriptions[116] "Lists all connected keyboards and mice"
set descriptions[118] "Execute a batch of commands separated by ;"
set descriptions[119] "Gets the active window name and its properties"
set descriptions[120] "toggles the focused windows fullscreen state"
set descriptions[122] "Allows you to add and remove fake outputs to your preferred backend"
set descriptions[123] "Interact with a plugin"
set descriptions[126] "resizes the active window"
set descriptions[127] "center the active window"
set descriptions[128] "Prints the current random splash"
set descriptions[129] "Focuses the urgent window or the last window"
set descriptions[130] "Change the current mapping group"
set descriptions[132] "Swaps the active window with the next or previous in a group"
set descriptions[134] "forces the renderer to reload all resources and outputs"
set descriptions[136] "Dismisses all or up to amount of notifications"
set --local literal_transitions
set literal_transitions[1] "set inputs 45 116 47 85 84 118 51 53 119 8 9 122 15 89 16 123 62 94 22 25 66 96 29 100 128 102 72 105 39 110 77 114 113 42 43 136; set tos 32 4 4 22 4 12 4 4 4 4 29 26 8 4 4 25 4 12 4 4 4 4 4 4 4 31 19 4 4 4 4 12 28 2 4 3"
set literal_transitions[7] "set inputs 87 20 107 23; set tos 4 4 4 4"
set literal_transitions[8] "set inputs 125 64 65 50 99 31 30 52 4 69 70 121 13 74 37 133 90 60 112 41 21 124 135 115; set tos 4 9 9 9 9 4 4 3 9 4 9 9 4 3 9 9 9 9 9 9 4 9 4 9"
set literal_transitions[9] "set inputs 40 46; set tos 4 4"
set literal_transitions[10] "set inputs 5; set tos 11"
set literal_transitions[11] "set inputs 33 32; set tos 12 12"
set literal_transitions[13] "set inputs 28 131; set tos 4 4"
set literal_transitions[16] "set inputs 5; set tos 5"
set literal_transitions[17] "set inputs 5; set tos 18"
set literal_transitions[18] "set inputs 61; set tos 4"
set literal_transitions[19] "set inputs 63 86 101 67 75 55; set tos 4 4 4 4 4 4"
set literal_transitions[21] "set inputs 5; set tos 14"
set literal_transitions[26] "set inputs 18 79; set tos 7 27"
set literal_transitions[28] "set inputs 1 2 48 49 3 81 82 83 6 7 54 56 11 10 57 120 14 88 17 58 19 59 91 95 97 92 24 93 26 27 68 98 126 127 34 71 103 35 104 73 36 129 130 76 38 106 108 109 78 111 132 44 134 80; set tos 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4"
set literal_transitions[29] "set inputs 12; set tos 4"
set literal_transitions[30] "set inputs 43 116 45 51 84 85 53 119 8 9 122 15 89 16 123 62 22 25 66 96 29 100 128 102 72 105 39 110 77 113 42 47 136; set tos 4 4 32 4 4 22 4 4 4 29 26 8 4 4 25 4 4 4 4 4 4 4 4 31 19 4 4 4 4 28 2 4 3"
set literal_transitions[32] "set inputs 117; set tos 4"
set literal_transitions[33] "set inputs 5; set tos 23"
set --local match_anything_transitions_from 1 5 24 3 19 29 32 25 30 14 15 2 23 20 6 13 31 4 22 27
set --local match_anything_transitions_to 30 6 16 4 20 10 10 4 30 15 33 3 24 21 17 4 4 10 13 4
set --local state 1
set --local word_index 2
while test $word_index -lt $COMP_CWORD
set --local -- word $COMP_WORDS[$word_index]
if set --query literal_transitions[$state] && test -n $literal_transitions[$state]
set --local --erase inputs
set --local --erase tos
eval $literal_transitions[$state]
if contains -- $word $literals
set --local literal_matched 0
for literal_id in (seq 1 (count $literals))
if test $literals[$literal_id] = $word
set --local index (contains --index -- $literal_id $inputs)
set state $tos[$index]
set word_index (math $word_index + 1)
set literal_matched 1
break
end
end
if test $literal_matched -ne 0
continue
end
end
end
if set --query match_anything_transitions_from[$state] && test -n $match_anything_transitions_from[$state]
set --local index (contains --index -- $state $match_anything_transitions_from)
set state $match_anything_transitions_to[$index]
set word_index (math $word_index + 1)
continue
end
return 1
end
if set --query literal_transitions[$state] && test -n $literal_transitions[$state]
set --local --erase inputs
set --local --erase tos
eval $literal_transitions[$state]
for literal_id in $inputs
if test -n $descriptions[$literal_id]
printf '%s\t%s\n' $literals[$literal_id] $descriptions[$literal_id]
else
printf '%s\n' $literals[$literal_id]
end
end
end
set command_states 5 14 23 19
set command_ids 1 3 4 2
if contains $state $command_states
set --local index (contains --index $state $command_states)
set --local function_id $command_ids[$index]
set --local function_name _hyprctl_$function_id
set --local --erase inputs
set --local --erase tos
$function_name "$COMP_WORDS[$COMP_CWORD]"
end
return 0
end
complete --command hyprctl --no-files --arguments "(_hyprctl)"

146
hyprctl/hyprctl.usage Normal file
View File

@ -0,0 +1,146 @@
# This is a file feeded to complgen to generate bash/fish/zsh completions
# Repo: https://github.com/adaszko/complgen
# Generate completion scripts: "complgen aot --bash-script hyprctl.bash --fish-script hyprctl.fish --zsh-script hyprctl.zsh ./hyprctl.usage"
hyprctl [<OPTIONS>]... <ARGUMENTS>
<OPTIONS> ::= (-i | --instance) "Specify the Hyprland instalnce"
| (-j) "Output in JSON format"
| (-r) "Refresh state befor issuing the command"
| (-b) "Execute a batch of commands separated by ;"
;
<WINDOWS> ::= {{{ hyprctl clients | grep class | awk '{print $2}' }}}
<AVIABLE_PLUGINS> ::= {{{ hyprpm list | grep "Plugin" | awk '{print $4}' }}}
<MONITORS> ::= {{{ hyprctl monitors | grep Monitor | awk '{ print $2 }' }}}
<KEYWORDS> ::= {{{ hyprctl devices | sed -n '/Keyboard at/{n; s/^\s\+//; p}' }}}
<NOTIFICATION_TYPES> ::= (0) "WARNING"
| (1) "INFOROR"
| (2) "HINT"
| (3) "ERROR"
| (4) "CONFISED"
| (5) "OK"
| (-1) "No Icon"
;
<PROPS> ::= (animationstyle)
| (rounding <NUM>)
| (bordersize <NUM>)
| (forcenoblur (0 | 1))
| (forceopaque (0 | 1))
| (forceopaqueoverriden (0 | 1))
| (forceallowsinput (0 | 1))
| (forcenoanims (0 | 1))
| (forcenoborder (0 | 1))
| (forcenodim (0 | 1))
| (forcenoshadow (0 | 1))
| (nofocus (0 | 1))
| (windowdancecompat (0 | 1))
| (nomaxsize (0 | 1))
| (minsize)
| (maxsize)
| (dimaround (0 | 1))
| (keepaspectratio (0 | 1))
| (alphaoverride (0 | 1))
| (alpha)
| (alphainactiveoverride (0 | 1))
| (alphainactive)
| (activebordercolor)
| (inactivebordercolor)
;
<ARGUMENTS> ::= (activewindow) "Gets the active window name and its properties"
| (activeworkspace) "Gets the active workspace name and its properties"
| (binds) "Lists all registered binds"
| (clients) "Lists all windows with their properties"
| (configerrors) "Lists all current config parsing errors"
| (cursorpos) "Gets the current cursor pos in global layout coordinates"
| (decorations <WINDOWS>) "Lists all decorations and their info"
| (devices) "Lists all connected keyboards and mice"
| (dismissnotify <NUM>) "Dismisses all or up to amount of notifications"
| (dispatch <DISPATCHERS>) "Issue a dispatch to call a keybind dispatcher with an arg"
| (getoption) "Gets the config option status (values)"
| (globalshortcuts) ""
| (hyprpaper) "Interact with hyprpaper if present"
| (instances) "Lists all running instances of Hyprland with thir info"
| (keyword <KEYWORDS>) "Issue a keyword to call a config keyword dynamically"
| (kill) "Get into a kill mode, where you can kill an app by clicking on it"
| (layers) "List the layers"
| (layouts) "lists all layouts available (including plugin'd ones)"
| (monitors [all]) "lists active outputs with their properties"
| (notify <NOTIFICATION_TYPES> <NUM>) "Sends a notification using the built-in Hyprland notification system"
| (output (create (wayland | x11 | headless | auto) | remove <MONITORS>)) "Allows you to add and remove fake outputs to your preferred backend"
| (plugin <AVIABLE_PLUGINS>) "Interact with a plugin"
| (reload) "Force reloads the config"
| (rollinglog) "Prints tail of the log"
| (setcursor) "Sets the cursor theme and reloads the cursor manager"
| (seterror [disable]) "Sets the hyprctl error string"
| (setprop <PROPS>) "Sets a property of a window"
| (splash) "Prints the current random splash"
| (switchxkblayout <KEYBOARDS> (next | prev | <NUM>)) "Sets the xkb layout index for a keyboard"
| (systeminfo) "Prints system info"
| (version) "Prints the Hyprland version, meaning flags, commit and branch of build"
| (workspacerules) "Gets the list of defined workspace rules"
| (workspaces) "Lists all workspaces with their properties"
;
<DISPATCHERS> ::= (exec) "executes a shell command"
| (execr) "executes a raw shell command"
| (pass) "passes the key to a specified window"
| (killactive) "closes the active window"
| (closewindow) "closes a specified window"
| (workspace) "changes the workspace"
| (movetoworkspace) "moves the focused window to a workspace"
| (movetoworkspacesilent) "move window doesnt switch to the workspace"
| (togglefloating) "toggles the current windows floating state"
| (setfloating) "sets the current windows floating state to true"
| (settiled) "sets the current windows floating state to false"
| (fullscreen) "toggles the focused windows fullscreen state"
| (fakefullscreen) "toggles the focused windows internal fullscreen state"
| (dpms) "sets all monitors DPMS status"
| (pin) "pins a window"
| (movefocus) "moves the focus in a direction"
| (movewindow) "moves the active window in a direction or to a monitor"
| (swapwindow) "swaps the active window with another window"
| (centerwindow) "center the active window"
| (resizeactive) "resizes the active window"
| (moveactive) "moves the active window resizeparams"
| (resizewindowpixel) "resizes a selected window"
| (movewindowpixel) "moves a selected window resizeparams"
| (cyclenext) "focuses the next window on a workspace"
| (swapnext) "swaps the focused window with the next window"
| (focuswindow) "focuses the first window matching"
| (focusmonitor) "focuses a monitor"
| (splitratio) "changes the split ratio"
| (toggleopaque) "toggles the current window to always be opaque"
| (movecursortocorner) "moves the cursor to the corner of the active window"
| (movecursor) "moves the cursor to a specified position"
| (renameworkspace) "rename a workspace"
| (exit) "exits the compositor with no questions asked"
| (forcerendererreload) "forces the renderer to reload all resources and outputs"
| (movecurrentworkspacetomonitor) "Moves the active workspace to a monitor"
| (focusworkspaceoncurrentmonitor) "Focuses the requested workspace"
| (moveworkspacetomonitor) "Moves a workspace to a monitor"
| (swapactiveworkspaces) "Swaps the active workspaces between two monitors"
| (alterzorder) "Modify the window stack order of the active or specified window"
| (togglespecialworkspace) "toggles a special workspace on/off"
| (focusurgentorlast) "Focuses the urgent window or the last window"
| (togglegroup) "toggles the current active window into a group"
| (changegroupactive) "switches to the next window in a group"
| (focuscurrentorlast) "Switch focus from current to previously focused window"
| (lockgroups) "Locks the groups"
| (lockactivegroup) "Lock the focused group"
| (moveintogroup) "Moves the active window into a group"
| (moveoutofgroup) "Moves the active window out of a group"
| (movewindoworgroup) "Behaves as moveintogroup"
| (movegroupwindow) "Swaps the active window with the next or previous in a group"
| (denywindowfromgroup) "Prohibit the active window from becoming or being inserted into group"
| (setignoregrouplock) "Temporarily enable or disable binds:ignore_group_lock"
| (global) "Executes a Global Shortcut using the GlobalShortcuts portal"
| (submap) "Change the current mapping group"
;

260
hyprctl/hyprctl.zsh Normal file
View File

@ -0,0 +1,260 @@
#compdef hyprctl
_hyprctl_cmd_3 () {
hyprctl monitors | grep Monitor | awk '{ print $2 }'
}
_hyprctl_cmd_2 () {
hyprpm list | grep "Plugin" | awk '{print $4}'
}
_hyprctl_cmd_0 () {
hyprctl devices | sed -n '/Keyboard at/{n; s/^\s\+//; p}'
}
_hyprctl_cmd_1 () {
hyprctl clients | grep class | awk '{print $2}'
}
_hyprctl () {
local -a literals=("focusmonitor" "exit" "global" "forceallowsinput" "::=" "movecursortocorner" "movewindowpixel" "activeworkspace" "monitors" "movecurrentworkspacetomonitor" "togglespecialworkspace" "all" "animationstyle" "closewindow" "setprop" "clients" "denywindowfromgroup" "create" "moveoutofgroup" "headless" "activebordercolor" "rollinglog" "wayland" "movewindoworgroup" "setcursor" "fakefullscreen" "moveactive" "prev" "hyprpaper" "alpha" "inactivebordercolor" "-i" "--instance" "togglefloating" "settiled" "swapwindow" "dimaround" "setignoregrouplock" "layouts" "0" "forcenoborder" "notify" "binds" "focuswindow" "seterror" "1" "systeminfo" "exec" "cyclenext" "nomaxsize" "reload" "rounding" "layers" "setfloating" "5" "lockactivegroup" "movetoworkspace" "swapactiveworkspaces" "changegroupactive" "forcenodim" "0" "configerrors" "4" "forceopaque" "forcenoshadow" "workspaces" "1" "swapnext" "minsize" "alphaoverride" "toggleopaque" "decorations" "alterzorder" "bordersize" "-1" "focuscurrentorlast" "workspacerules" "splitratio" "remove" "renameworkspace" "movetoworkspacesilent" "killactive" "pass" "getoption" "switchxkblayout" "2" "auto" "pin" "version" "nofocus" "togglegroup" "workspace" "lockgroups" "-r" "movewindow" "cursorpos" "focusworkspaceoncurrentmonitor" "execr" "windowdancecompat" "globalshortcuts" "3" "keyword" "movefocus" "movecursor" "instances" "dpms" "x11" "moveintogroup" "resizewindowpixel" "kill" "moveworkspacetomonitor" "forceopaqueoverriden" "dispatch" "-j" "forcenoblur" "devices" "disable" "-b" "activewindow" "fullscreen" "keepaspectratio" "output" "plugin" "alphainactiveoverride" "alphainactive" "resizeactive" "centerwindow" "splash" "focusurgentorlast" "submap" "next" "movegroupwindow" "forcenoanims" "forcerendererreload" "maxsize" "dismissnotify")
local -A descriptions
descriptions[1]="focuses a monitor"
descriptions[2]="exits the compositor with no questions asked"
descriptions[3]="Executes a Global Shortcut using the GlobalShortcuts portal"
descriptions[6]="moves the cursor to the corner of the active window"
descriptions[7]="moves a selected window resizeparams"
descriptions[8]="Gets the active workspace name and its properties"
descriptions[9]="lists active outputs with their properties"
descriptions[10]="Moves the active workspace to a monitor"
descriptions[11]="toggles a special workspace on/off"
descriptions[14]="closes a specified window"
descriptions[15]="Sets a property of a window"
descriptions[16]="Lists all windows with their properties"
descriptions[17]="Prohibit the active window from becoming or being inserted into group"
descriptions[19]="Moves the active window out of a group"
descriptions[22]="Prints tail of the log"
descriptions[24]="Behaves as moveintogroup"
descriptions[25]="Sets the cursor theme and reloads the cursor manager"
descriptions[26]="toggles the focused windows internal fullscreen state"
descriptions[27]="moves the active window resizeparams"
descriptions[29]="Interact with hyprpaper if present"
descriptions[32]="Specify the Hyprland instalnce"
descriptions[33]="Specify the Hyprland instalnce"
descriptions[34]="toggles the current windows floating state"
descriptions[35]="sets the current windows floating state to false"
descriptions[36]="swaps the active window with another window"
descriptions[38]="Temporarily enable or disable binds:ignore_group_lock"
descriptions[39]="lists all layouts available (including plugin'd ones)"
descriptions[42]="Sends a notification using the built-in Hyprland notification system"
descriptions[43]="Lists all registered binds"
descriptions[44]="focuses the first window matching"
descriptions[45]="Sets the hyprctl error string"
descriptions[47]="Prints system info"
descriptions[48]="executes a shell command"
descriptions[49]="focuses the next window on a workspace"
descriptions[51]="Force reloads the config"
descriptions[53]="List the layers"
descriptions[54]="sets the current windows floating state to true"
descriptions[55]="OK"
descriptions[56]="Lock the focused group"
descriptions[57]="moves the focused window to a workspace"
descriptions[58]="Swaps the active workspaces between two monitors"
descriptions[59]="switches to the next window in a group"
descriptions[61]="WARNING"
descriptions[62]="Lists all current config parsing errors"
descriptions[63]="CONFISED"
descriptions[66]="Lists all workspaces with their properties"
descriptions[67]="INFOROR"
descriptions[68]="swaps the focused window with the next window"
descriptions[71]="toggles the current window to always be opaque"
descriptions[72]="Lists all decorations and their info"
descriptions[73]="Modify the window stack order of the active or specified window"
descriptions[75]="No Icon"
descriptions[76]="Switch focus from current to previously focused window"
descriptions[77]="Gets the list of defined workspace rules"
descriptions[78]="changes the split ratio"
descriptions[80]="rename a workspace"
descriptions[81]="move window doesnt switch to the workspace"
descriptions[82]="closes the active window"
descriptions[83]="passes the key to a specified window"
descriptions[84]="Gets the config option status (values)"
descriptions[85]="Sets the xkb layout index for a keyboard"
descriptions[86]="HINT"
descriptions[88]="pins a window"
descriptions[89]="Prints the Hyprland version, meaning flags, commit and branch of build"
descriptions[91]="toggles the current active window into a group"
descriptions[92]="changes the workspace"
descriptions[93]="Locks the groups"
descriptions[94]="Refresh state befor issuing the command"
descriptions[95]="moves the active window in a direction or to a monitor"
descriptions[96]="Gets the current cursor pos in global layout coordinates"
descriptions[97]="Focuses the requested workspace"
descriptions[98]="executes a raw shell command"
descriptions[101]="ERROR"
descriptions[102]="Issue a keyword to call a config keyword dynamically"
descriptions[103]="moves the focus in a direction"
descriptions[104]="moves the cursor to a specified position"
descriptions[105]="Lists all running instances of Hyprland with thir info"
descriptions[106]="sets all monitors DPMS status"
descriptions[108]="Moves the active window into a group"
descriptions[109]="resizes a selected window"
descriptions[110]="Get into a kill mode, where you can kill an app by clicking on it"
descriptions[111]="Moves a workspace to a monitor"
descriptions[113]="Issue a dispatch to call a keybind dispatcher with an arg"
descriptions[114]="Output in JSON format"
descriptions[116]="Lists all connected keyboards and mice"
descriptions[118]="Execute a batch of commands separated by ;"
descriptions[119]="Gets the active window name and its properties"
descriptions[120]="toggles the focused windows fullscreen state"
descriptions[122]="Allows you to add and remove fake outputs to your preferred backend"
descriptions[123]="Interact with a plugin"
descriptions[126]="resizes the active window"
descriptions[127]="center the active window"
descriptions[128]="Prints the current random splash"
descriptions[129]="Focuses the urgent window or the last window"
descriptions[130]="Change the current mapping group"
descriptions[132]="Swaps the active window with the next or previous in a group"
descriptions[134]="forces the renderer to reload all resources and outputs"
descriptions[136]="Dismisses all or up to amount of notifications"
local -A literal_transitions
literal_transitions[1]="([45]=32 [116]=4 [47]=4 [85]=22 [84]=4 [118]=12 [51]=4 [53]=4 [119]=4 [8]=4 [9]=29 [122]=26 [15]=8 [89]=4 [16]=4 [123]=25 [62]=4 [94]=12 [22]=4 [25]=4 [66]=4 [96]=4 [29]=4 [100]=4 [128]=4 [102]=31 [72]=19 [105]=4 [39]=4 [110]=4 [77]=4 [114]=12 [113]=28 [42]=2 [43]=4 [136]=3)"
literal_transitions[7]="([87]=4 [20]=4 [107]=4 [23]=4)"
literal_transitions[8]="([125]=4 [64]=9 [65]=9 [50]=9 [99]=9 [31]=4 [30]=4 [52]=3 [4]=9 [69]=4 [70]=9 [121]=9 [13]=4 [74]=3 [37]=9 [133]=9 [90]=9 [60]=9 [112]=9 [41]=9 [21]=4 [124]=9 [135]=4 [115]=9)"
literal_transitions[9]="([40]=4 [46]=4)"
literal_transitions[10]="([5]=11)"
literal_transitions[11]="([33]=12 [32]=12)"
literal_transitions[13]="([28]=4 [131]=4)"
literal_transitions[16]="([5]=5)"
literal_transitions[17]="([5]=18)"
literal_transitions[18]="([61]=4)"
literal_transitions[19]="([63]=4 [86]=4 [101]=4 [67]=4 [75]=4 [55]=4)"
literal_transitions[21]="([5]=14)"
literal_transitions[26]="([18]=7 [79]=27)"
literal_transitions[28]="([1]=4 [2]=4 [48]=4 [49]=4 [3]=4 [81]=4 [82]=4 [83]=4 [6]=4 [7]=4 [54]=4 [56]=4 [11]=4 [10]=4 [57]=4 [120]=4 [14]=4 [88]=4 [17]=4 [58]=4 [19]=4 [59]=4 [91]=4 [95]=4 [97]=4 [92]=4 [24]=4 [93]=4 [26]=4 [27]=4 [68]=4 [98]=4 [126]=4 [127]=4 [34]=4 [71]=4 [103]=4 [35]=4 [104]=4 [73]=4 [36]=4 [129]=4 [130]=4 [76]=4 [38]=4 [106]=4 [108]=4 [109]=4 [78]=4 [111]=4 [132]=4 [44]=4 [134]=4 [80]=4)"
literal_transitions[29]="([12]=4)"
literal_transitions[30]="([43]=4 [116]=4 [45]=32 [51]=4 [84]=4 [85]=22 [53]=4 [119]=4 [8]=4 [9]=29 [122]=26 [15]=8 [89]=4 [16]=4 [123]=25 [62]=4 [22]=4 [25]=4 [66]=4 [96]=4 [29]=4 [100]=4 [128]=4 [102]=31 [72]=19 [105]=4 [39]=4 [110]=4 [77]=4 [113]=28 [42]=2 [47]=4 [136]=3)"
literal_transitions[32]="([117]=4)"
literal_transitions[33]="([5]=23)"
local -A match_anything_transitions
match_anything_transitions=([1]=30 [5]=6 [24]=16 [3]=4 [19]=20 [29]=10 [32]=10 [25]=4 [30]=30 [14]=15 [15]=33 [2]=3 [23]=24 [20]=21 [6]=17 [13]=4 [31]=4 [4]=10 [22]=13 [27]=4)
declare -A subword_transitions
local state=1
local word_index=2
while [[ $word_index -lt $CURRENT ]]; do
if [[ -v "literal_transitions[$state]" ]]; then
local -A state_transitions
eval "state_transitions=${literal_transitions[$state]}"
local word=${words[$word_index]}
local word_matched=0
for ((literal_id = 1; literal_id <= $#literals; literal_id++)); do
if [[ ${literals[$literal_id]} = "$word" ]]; then
if [[ -v "state_transitions[$literal_id]" ]]; then
state=${state_transitions[$literal_id]}
word_index=$((word_index + 1))
word_matched=1
break
fi
fi
done
if [[ $word_matched -ne 0 ]]; then
continue
fi
fi
if [[ -v "match_anything_transitions[$state]" ]]; then
state=${match_anything_transitions[$state]}
word_index=$((word_index + 1))
continue
fi
return 1
done
completions_no_description_trailing_space=()
completions_no_description_no_trailing_space=()
completions_trailing_space=()
suffixes_trailing_space=()
descriptions_trailing_space=()
completions_no_trailing_space=()
suffixes_no_trailing_space=()
descriptions_no_trailing_space=()
if [[ -v "literal_transitions[$state]" ]]; then
local -A state_transitions
eval "state_transitions=${literal_transitions[$state]}"
for literal_id in ${(k)state_transitions}; do
if [[ -v "descriptions[$literal_id]" ]]; then
completions_trailing_space+=("${literals[$literal_id]}")
suffixes_trailing_space+=("${literals[$literal_id]}")
descriptions_trailing_space+=("${descriptions[$literal_id]}")
else
completions_no_description_trailing_space+=("${literals[$literal_id]}")
fi
done
fi
local -A commands=([5]=0 [14]=2 [23]=3 [19]=1)
if [[ -v "commands[$state]" ]]; then
local command_id=${commands[$state]}
local output=$(_hyprctl_cmd_${command_id} "${words[$CURRENT]}")
local -a command_completions=("${(@f)output}")
for line in ${command_completions[@]}; do
local parts=(${(@s: :)line})
if [[ -v "parts[2]" ]]; then
completions_trailing_space+=("${parts[1]}")
suffixes_trailing_space+=("${parts[1]}")
descriptions_trailing_space+=("${parts[2]}")
else
completions_no_description_trailing_space+=("${parts[1]}")
fi
done
fi
local maxlen=0
for suffix in ${suffixes_trailing_space[@]}; do
if [[ ${#suffix} -gt $maxlen ]]; then
maxlen=${#suffix}
fi
done
for suffix in ${suffixes_no_trailing_space[@]}; do
if [[ ${#suffix} -gt $maxlen ]]; then
maxlen=${#suffix}
fi
done
for ((i = 1; i <= $#suffixes_trailing_space; i++)); do
if [[ -z ${descriptions_trailing_space[$i]} ]]; then
descriptions_trailing_space[$i]="${(r($maxlen)( ))${suffixes_trailing_space[$i]}}"
else
descriptions_trailing_space[$i]="${(r($maxlen)( ))${suffixes_trailing_space[$i]}} -- ${descriptions_trailing_space[$i]}"
fi
done
for ((i = 1; i <= $#suffixes_no_trailing_space; i++)); do
if [[ -z ${descriptions_no_trailing_space[$i]} ]]; then
descriptions_no_trailing_space[$i]="${(r($maxlen)( ))${suffixes_no_trailing_space[$i]}}"
else
descriptions_no_trailing_space[$i]="${(r($maxlen)( ))${suffixes_no_trailing_space[$i]}} -- ${descriptions_no_trailing_space[$i]}"
fi
done
compadd -Q -a completions_no_description_trailing_space
compadd -Q -S ' ' -a completions_no_description_no_trailing_space
compadd -l -Q -a -d descriptions_trailing_space completions_trailing_space
compadd -l -Q -S '' -a -d descriptions_no_trailing_space completions_no_trailing_space
return 0
}
if [[ $ZSH_EVAL_CONTEXT =~ :file$ ]]; then
compdef _hyprctl hyprctl
else
_hyprctl
fi

View File

@ -1,3 +1,7 @@
executable('hyprctl', 'main.cpp',
install: true
)
install_data('hyprctl.bash', install_dir: join_paths(get_option('datadir'), 'bash-completions'), install_tag: 'runtime', rename: 'hyprctl')
install_data('hyprctl.fish', install_dir: join_paths(get_option('datadir'), 'fish/completions'), install_tag: 'runtime')
install_data('hyprctl.zsh', install_dir: join_paths(get_option('datadir'), 'zsh/site-functions'), install_tag: 'runtime', rename: '_hyprctl')