# A cross-platform build utility based on Lua # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http:##www.apache.org#licenses#LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Copyright (C) 2022-present, Xmake Open Source Community. # # @author ruki, Dragon1573 # @homepage register-completions.fish # # fish parameter completion for xmake function _xmake_fish_complete # Read the current command line set -l raw_cmd (commandline) set -l words (commandline -o) # Get the current token set -l token (commandline -ot) # Call XMake built-in completion to get available results set -l result (XMAKE_SKIP_HISTORY=1 XMAKE_ROOT=y XMAKE_COLORTERM=nocolor xmake lua private.utils.complete 0 nospace "$raw_cmd" 2>/dev/null) if test (count $result) -lt 1 # When there are no available completions, the function ends immediately # Otherwise, the subsequent `contains` command will trigger an error return 1 end # Are there multiple selectable results? # When there are multiple options, the user's current token is definitely incomplete test (count $result) -gt 1 set -l is_multiple_choice $status # Is the only selectable option identical to the current token under the cursor (which may be empty)? # Identical means the user has already completed the process # Repeated option outputs are not completions at the current cursor position contains -- $token $result set -l is_token_incomplete $status # Is the only selectable option identical to the last visible token of the command line array? # When completing without a prefix in every token position, the current token is an empty string # The last item of the command line tokenized array is the token before the cursor # This is mainly used to handle completions triggered after a space without a prefix contains -- $words[-1] $result set -l not_token_completed $status test \( $is_token_incomplete -eq 1 \) -a \( $not_token_completed -eq 1 \) test \( $is_multiple_choice -eq 0 \) -o \( $status -eq 0 \) if test $status -eq 0 # When the completion list has more than one item, or the current token is different from the unique token in the completion list # The user must not have completed the token and needs to be provided with completion options for item in $result # Each result takes up a separate line, and for the "-a" parameter, it needs to be echoed separately # Although the result itself has a newline, "-a" still treats it as a whole, # Without tokenizing it as multiple parameters if not string match -- '*error*' "$item" > /dev/null echo $item end end end end complete -c xmake -f -a "(_xmake_fish_complete)"