diff --git a/files/fish/.gitignore b/files/fish/.gitignore index 057bdbd..23efee9 100644 --- a/files/fish/.gitignore +++ b/files/fish/.gitignore @@ -1,19 +1 @@ -completions -conf.d -themes fish_variables - - -functions/* -!functions/brewer.fish -!functions/dc.fish -!functions/dsp.fish -!functions/e.fish -!functions/k.fish -!functions/l.fish -!functions/n.fish -!functions/p.fish -!functions/pe.fish -!functions/px.fish -!functions/rsync.fish -!functions/nvm.fish diff --git a/files/fish/completions/buf.fish b/files/fish/completions/buf.fish new file mode 100644 index 0000000..d59fdfe --- /dev/null +++ b/files/fish/completions/buf.fish @@ -0,0 +1,177 @@ +# fish completion for buf -*- shell-script -*- + +function __buf_debug + set -l file "$BASH_COMP_DEBUG_FILE" + if test -n "$file" + echo "$argv" >> $file + end +end + +function __buf_perform_completion + __buf_debug "Starting __buf_perform_completion" + + # Extract all args except the last one + set -l args (commandline -opc) + # Extract the last arg and escape it in case it is a space + set -l lastArg (string escape -- (commandline -ct)) + + __buf_debug "args: $args" + __buf_debug "last arg: $lastArg" + + # Disable ActiveHelp which is not supported for fish shell + set -l requestComp "BUF_ACTIVE_HELP=0 $args[1] __complete $args[2..-1] $lastArg" + + __buf_debug "Calling $requestComp" + set -l results (eval $requestComp 2> /dev/null) + + # Some programs may output extra empty lines after the directive. + # Let's ignore them or else it will break completion. + # Ref: https://github.com/spf13/cobra/issues/1279 + for line in $results[-1..1] + if test (string trim -- $line) = "" + # Found an empty line, remove it + set results $results[1..-2] + else + # Found non-empty line, we have our proper output + break + end + end + + set -l comps $results[1..-2] + set -l directiveLine $results[-1] + + # For Fish, when completing a flag with an = (e.g., -n=) + # completions must be prefixed with the flag + set -l flagPrefix (string match -r -- '-.*=' "$lastArg") + + __buf_debug "Comps: $comps" + __buf_debug "DirectiveLine: $directiveLine" + __buf_debug "flagPrefix: $flagPrefix" + + for comp in $comps + printf "%s%s\n" "$flagPrefix" "$comp" + end + + printf "%s\n" "$directiveLine" +end + +# This function does two things: +# - Obtain the completions and store them in the global __buf_comp_results +# - Return false if file completion should be performed +function __buf_prepare_completions + __buf_debug "" + __buf_debug "========= starting completion logic ==========" + + # Start fresh + set --erase __buf_comp_results + + set -l results (__buf_perform_completion) + __buf_debug "Completion results: $results" + + if test -z "$results" + __buf_debug "No completion, probably due to a failure" + # Might as well do file completion, in case it helps + return 1 + end + + set -l directive (string sub --start 2 $results[-1]) + set --global __buf_comp_results $results[1..-2] + + __buf_debug "Completions are: $__buf_comp_results" + __buf_debug "Directive is: $directive" + + set -l shellCompDirectiveError 1 + set -l shellCompDirectiveNoSpace 2 + set -l shellCompDirectiveNoFileComp 4 + set -l shellCompDirectiveFilterFileExt 8 + set -l shellCompDirectiveFilterDirs 16 + + if test -z "$directive" + set directive 0 + end + + set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) % 2) + if test $compErr -eq 1 + __buf_debug "Received error directive: aborting." + # Might as well do file completion, in case it helps + return 1 + end + + set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) % 2) + set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) % 2) + if test $filefilter -eq 1; or test $dirfilter -eq 1 + __buf_debug "File extension filtering or directory filtering not supported" + # Do full file completion instead + return 1 + end + + set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) % 2) + set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) % 2) + + __buf_debug "nospace: $nospace, nofiles: $nofiles" + + # If we want to prevent a space, or if file completion is NOT disabled, + # we need to count the number of valid completions. + # To do so, we will filter on prefix as the completions we have received + # may not already be filtered so as to allow fish to match on different + # criteria than the prefix. + if test $nospace -ne 0; or test $nofiles -eq 0 + set -l prefix (commandline -t | string escape --style=regex) + __buf_debug "prefix: $prefix" + + set -l completions (string match -r -- "^$prefix.*" $__buf_comp_results) + set --global __buf_comp_results $completions + __buf_debug "Filtered completions are: $__buf_comp_results" + + # Important not to quote the variable for count to work + set -l numComps (count $__buf_comp_results) + __buf_debug "numComps: $numComps" + + if test $numComps -eq 1; and test $nospace -ne 0 + # We must first split on \t to get rid of the descriptions to be + # able to check what the actual completion will be. + # We don't need descriptions anyway since there is only a single + # real completion which the shell will expand immediately. + set -l split (string split --max 1 \t $__buf_comp_results[1]) + + # Fish won't add a space if the completion ends with any + # of the following characters: @=/:., + set -l lastChar (string sub -s -1 -- $split) + if not string match -r -q "[@=/:.,]" -- "$lastChar" + # In other cases, to support the "nospace" directive we trick the shell + # by outputting an extra, longer completion. + __buf_debug "Adding second completion to perform nospace directive" + set --global __buf_comp_results $split[1] $split[1]. + __buf_debug "Completions are now: $__buf_comp_results" + end + end + + if test $numComps -eq 0; and test $nofiles -eq 0 + # To be consistent with bash and zsh, we only trigger file + # completion when there are no other completions + __buf_debug "Requesting file completion" + return 1 + end + end + + return 0 +end + +# Since Fish completions are only loaded once the user triggers them, we trigger them ourselves +# so we can properly delete any completions provided by another script. +# Only do this if the program can be found, or else fish may print some errors; besides, +# the existing completions will only be loaded if the program can be found. +if type -q "buf" + # The space after the program name is essential to trigger completion for the program + # and not completion of the program name itself. + # Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. + complete --do-complete "buf " > /dev/null 2>&1 +end + +# Remove any pre-existing completions for the program since we will be handling all of them. +complete -c buf -e + +# The call to __buf_prepare_completions will setup __buf_comp_results +# which provides the program's completion choices. +complete -c buf -n '__buf_prepare_completions' -f -a '$__buf_comp_results' + diff --git a/files/fish/completions/fnm.fish b/files/fish/completions/fnm.fish new file mode 100644 index 0000000..d089eef --- /dev/null +++ b/files/fish/completions/fnm.fish @@ -0,0 +1,55 @@ +complete -c fnm -n "__fish_use_subcommand" -l node-dist-mirror -d 'https://nodejs.org/dist/ mirror' -r +complete -c fnm -n "__fish_use_subcommand" -l fnm-dir -d 'The root directory of fnm installations' -r +complete -c fnm -n "__fish_use_subcommand" -l multishell-path -d 'Where the current node version link is stored. This value will be populated automatically by evaluating `fnm env` in your shell profile. Read more about it using `fnm help env`' -r +complete -c fnm -n "__fish_use_subcommand" -l log-level -d 'The log level of fnm commands' -r -f -a "{quiet ,info ,all ,error }" +complete -c fnm -n "__fish_use_subcommand" -l arch -d 'Override the architecture of the installed Node binary. Defaults to arch of fnm binary' -r +complete -c fnm -n "__fish_use_subcommand" -l version-file-strategy -d 'A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` is called without a version, or when `--use-on-cd` is configured on evaluation' -r -f -a "{local ,recursive }" +complete -c fnm -n "__fish_use_subcommand" -l help -d 'Print help information' +complete -c fnm -n "__fish_use_subcommand" -l version -d 'Print version information' +complete -c fnm -n "__fish_use_subcommand" -f -a "list-remote" -d 'List all remote Node.js versions' +complete -c fnm -n "__fish_use_subcommand" -f -a "list" -d 'List all locally installed Node.js versions' +complete -c fnm -n "__fish_use_subcommand" -f -a "install" -d 'Install a new Node.js version' +complete -c fnm -n "__fish_use_subcommand" -f -a "use" -d 'Change Node.js version' +complete -c fnm -n "__fish_use_subcommand" -f -a "env" -d 'Print and set up required environment variables for fnm' +complete -c fnm -n "__fish_use_subcommand" -f -a "completions" -d 'Print shell completions to stdout' +complete -c fnm -n "__fish_use_subcommand" -f -a "alias" -d 'Alias a version to a common name' +complete -c fnm -n "__fish_use_subcommand" -f -a "unalias" -d 'Remove an alias definition' +complete -c fnm -n "__fish_use_subcommand" -f -a "default" -d 'Set a version as the default version' +complete -c fnm -n "__fish_use_subcommand" -f -a "current" -d 'Print the current Node.js version' +complete -c fnm -n "__fish_use_subcommand" -f -a "exec" -d 'Run a command within fnm context' +complete -c fnm -n "__fish_use_subcommand" -f -a "uninstall" -d 'Uninstall a Node.js version' +complete -c fnm -n "__fish_seen_subcommand_from list-remote" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from list-remote" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from list" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from list" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from install" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from install" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from install" -l lts -d 'Install latest LTS' +complete -c fnm -n "__fish_seen_subcommand_from install" -l latest -d 'Install latest version' +complete -c fnm -n "__fish_seen_subcommand_from use" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from use" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from use" -l install-if-missing -d 'Install the version if it isn\'t installed yet' +complete -c fnm -n "__fish_seen_subcommand_from use" -l silent-if-unchanged -d 'Don\'t output a message identifying the version being used if it will not change due to execution of this command' +complete -c fnm -n "__fish_seen_subcommand_from env" -l shell -d 'The shell syntax to use. Infers when missing' -r -f -a "{bash ,zsh ,fish ,powershell }" +complete -c fnm -n "__fish_seen_subcommand_from env" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from env" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from env" -l json -d 'Print JSON instead of shell commands' +complete -c fnm -n "__fish_seen_subcommand_from env" -l multi -d 'Deprecated. This is the default now' +complete -c fnm -n "__fish_seen_subcommand_from env" -l use-on-cd -d 'Print the script to change Node versions every directory change' +complete -c fnm -n "__fish_seen_subcommand_from completions" -l shell -d 'The shell syntax to use. Infers when missing' -r +complete -c fnm -n "__fish_seen_subcommand_from completions" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from completions" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from alias" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from alias" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from unalias" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from unalias" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from default" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from default" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from current" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from current" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from exec" -l using -d 'Either an explicit version, or a filename with the version written in it' -r +complete -c fnm -n "__fish_seen_subcommand_from exec" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from exec" -l version -d 'Print version information' +complete -c fnm -n "__fish_seen_subcommand_from exec" -l using-file -d 'Deprecated. This is the default now' +complete -c fnm -n "__fish_seen_subcommand_from uninstall" -l help -d 'Print help information' +complete -c fnm -n "__fish_seen_subcommand_from uninstall" -l version -d 'Print version information' diff --git a/files/fish/config.fish b/files/fish/config.fish index 8749ff5..1c01e59 100644 --- a/files/fish/config.fish +++ b/files/fish/config.fish @@ -24,4 +24,8 @@ set -gx PNPM_HOME "$HOME/Library/pnpm" set -gx PATH "$PNPM_HOME" $PATH # pnpm end +# Node +fnm env --use-on-cd | source + +# Theme oh-my-posh init fish --config ~/.config/omp/main.omp.yaml | source diff --git a/files/fish/fish_plugins b/files/fish/fish_plugins deleted file mode 100644 index 751556b..0000000 --- a/files/fish/fish_plugins +++ /dev/null @@ -1,3 +0,0 @@ -jorgebucaran/fisher -jethrokuan/z -edc/bass diff --git a/files/fish/functions/n.fish b/files/fish/functions/n.fish index 2606956..67178ab 100644 --- a/files/fish/functions/n.fish +++ b/files/fish/functions/n.fish @@ -1,4 +1,4 @@ function n - nvm install $argv; - nvm use $argv; + fnm install $argv; + fnm use $argv; end diff --git a/files/fish/functions/nvm.fish b/files/fish/functions/nvm.fish deleted file mode 100644 index 5761a36..0000000 --- a/files/fish/functions/nvm.fish +++ /dev/null @@ -1,3 +0,0 @@ -function nvm - bass source ~/.nvm/nvm.sh --no-use ';' nvm $argv -end