ROADMAP
September 25, 2025 · View on GitHub
High-level overview of the project’s goals, tasks, and milestones for future releases.
Any new ideas related to the content here are welcome.
Sections:
- Current Prioritized Changes - tasks that might are not yet supported, but are being looked into for the next major release.
- General Codebase Changes - tasks useful for future additions
- Server Features and Providers - future general features that the server provides
- Automation and Pipelines - CI/CD or tooling related to the project
- Documentation - modifications for the project's documentation (wiki, README, site, etc.)
Current Prioritized Changes
-
abbr parser to build expandable
CompletionItemsnippets that insert the cursor in theabbr --set-cursor=%output.- Normal case without
--set-cursorwould just directly insert the abbr and add moreCompletionItem.commitCharactersto these specific items. - Special case using
--set-cursorwould get the output of the abbr, and then replace the--set-cursor=%token with the snippet expansion token. Lots to consider here -- do we read this from a subshell? Performance could be a concern here if we do use a subshell.
- Normal case without
-
Add code actions to replace absolute paths w/ variable that points to the previous location
- inefficient path diagnostics (inefficient meaning, things like absolute paths that could be replaced with relative paths, or variables that point to the same location)
- checking if a symbol is a path (could be
isString(),isConcatenation(),...). Currently considering a simple check for/in thenode.text, to solve this
-
make
__fish_contains_opt optbe considered as aargparsereference to the variableopt-
__fish_contains_opt -s o optwould match theargparse o/optdefinition in the matching function/completion file -
complete -c cmd -n '__fish_contains_opt opt'would be a common usage
-
-
add support for hovering a
~/some/file/pathand show the expanded result- add info diagnostics for replacing absolute paths with expandable paths
- allow disabling this feature
-
add support for renaming ALL autoloaded files (currently requires atleast two code-actions to be used)
- when a code-action changes an autoloaded function, also rename its completions file, and vice versa
-
Add virtual document support for
go-to-definitionof a manpage -
Server Command to display
fish_configin a browser -
add headless mode for the server (allows for using the server via the commandline, without opening any client).
- for example,
fish-lsp headless --code-action='generate.completions' --file=~/.config/fish/functions/foo.fishwould create a completions file for thefoo.fishfunction, if it has an argparse in its body.-
fish-lsp headless --show-tree --file=~/.config/fish/functions/foo.fishwould show the client tree of the file -
fish-lsp headless --get-references --file=~/.config/fish/functions/foo.fish --function=foowould show the references for the symbol defined in the file with the namefoo- allow passing options for which scope to match the definition symbol, to search for specific references
-
--scope=localwould only match references in the current file -
--scope=globalwould match references in the current file and all files in the workspace
-
- allow passing options for which scope to match the definition symbol, to search for specific references
-
fish-lsp headless --show-tree --file=~/.config/fish/functions/foo.fish --scope=globalwould show all global symbols in the file -
fish-lsp headless --get-references --file=~/.config/fish/functions/foo.fish --function=foo --scope=globalwould show all references to the symbolfooin the file and all files in the workspace -
fish-lsp headless --diagnosticswould show all diagnostics for the current workspace, or a specific file if passed with--file=~/.config/fish/functions/foo.fish -
fish-lsp headless --workspace-symbolswould show all symbols in the current workspace, or a specific file if passed with--file=~/.config/fish/functions/foo.fish - add completions for using the headless mode, so that the user does not have to remember how to use each subcommand
-
- for example,
-
add support for a document to contain changes to the server's settings, and the server to update its settings based on the document changes
- cli command to generate the default settings file with default values
- cli command to show the current settings file of the directory
$PWD - server command to create a new settings file in the current workspace
- server command to update the server's settings file in the current workspace
- server command to show the current server's settings file inside of the current workspace
- create a schema for the server's settings file, so that a json-lsp client can validate the settings file and provide completions
- allow the user to specify custom fish file paths in the current workspace that should be treated like they were autoloaded files
- consider allowing converting the server's settings file to its equivalent fish source code
- allow any code-action that uses
# @fish-lsp-disableto also be specified in the server's settings file. (NEED TO THINK ABOUT BEST WAY TO STORE THIS)
-
allow function definitions with
--no-scope-shadowingor other flags that would change how the caller's scope is used, to be recognized as references relative to the request position.function foo set -l baz 1 # ^^^---------- getReferences() to this variable [TOTAL: 2] (CASE 1) bar # since we call bar from the same scope as the getReferences() definition symbol # and bar has the `--no-scope-shadowing` flag, the reference to `baz` would be # considered a matching reference to the `baz` variable in the `foo` function end function bar --no-scope-shadowing echo $baz # ^^^----------- getReferences() to this variable [TOTAL: 0] (CASE 2) end # Summary: # # When baz references are requested from inside the foo function, # we check all commands called inside of the foo function. if any of them # inherit the scope of the foo function, add the local references from the # called function to the references of the foo function. # # # When we check the references for `baz` inside of the `bar` function, we # only show references that are used inside of the `bar` function.NOTE: You could also try to find all references to the parent function and then add the caller scopes to the references of the parent function. This way, Case 2 would include the references to
$bazinfoo -
allow functions with
--argument-namesto provide inlay hints for the arguments that are passed into the function calls, so that named arguments are shown in the client as inlay hints. -
add support for expanding
concatenationSyntaxNode: definitions, references and hoversfor opt in fish_lsp_{enabled_handlers,disabled_handlers,commit_characters,log_file,log_level,all_indexed_paths,modifiable_paths,diagnostic_disable_error_codes,enable_experimental_diagnostics,max_background_files,show_client_popups,single_workspace_support} # ^^^^^^^^^^---------------------- Hovering here would show the expansion if not contains -- $opt $features_to_skip echo -e "$opt\t'fish-lsp env variable'" end end -
Inline Value provider (debugger for current line of script)
-
Allow formatting of files without using
fish_indentcommand -
Write server handler for
Call Hierarchyrequests -
Allow server to support registering a capability for the client to check the
type -apa command under the current location. -
Support options to enable from client configuration
-
if_statementmust be silent:if command -s->if command -sq - prefer
command _prefix for ambiguous commands - default case for
switch_statement -
testnumber/string flags from condition argument's - function requires returning a status number
-
fish_add_pathinstead ofset -gx PATH _ - logger location
- private functions need underscore prefix
- prefer
universalscope, or preferglobalscope - prefer specific
redirectto/dev/null - hover documentation fallback: tldr, cht.sh, ...
- format specific options
- remove showing
lsp kindin completions list
-
-
Add server handler for
onSemanticTokensupport -
Add server handler for
textDocument/publishDiagnosticsto allow project wide diagnostics -
Add code action to convert shebangs
-
#!/usr/bin/fishto#!/usr/bin/env fish -
#!/usr/local/bin/fishto#!/usr/bin/env fish
-
-
add hover support to end stdin token
-- -
add code-action to convert external shell commands to fish builtins (where applicable)
-
add
fish-lsp info --time-startup --use-workspace $PWDsupport, to time how long it takes to start the server with only the current workspace -
consider if exported variables should not be included in the unused
FishSymbol[]reported by diagnostic4004
General Codebase Changes
- Add binary releases for common platforms
-
fish-lspbinary formacOS -
fish-lspbinary forLinux -
fish-lspbinary forWindows
-
- Improve filtering of tokens between renaming and referencing (tricky issue because
the lsif.dev specification does not support renaming
symbols that don't have exact matching names
-
argparse h/helpvs$_flag_{h,help}vsset -lq _flag_helpvscomplete -s h -l helpvscmd --help/cmd -h -
set -gx fish_lsp_*vs$_fish_lsp_{var_name} -
alias foo='bar'vsfoovsfunction foo --wraps=bar;...end; -
function baz --wraps=foovsfoovsfunction foo; end; -
complete -n 'foo' ...vsfunction foo; end; -
bind ... foovsbind ... 'foo'vsfunction foo; end; -
abbr ... --function foovsfunction foo; end;vsabbr ... foo
-
- update
src/references.tsw/ agetReferences()function that supports passing general behavior changes - Add
$__fish_**auto-loaded environment variables to the server's startup configuration. An example auto-loaded variable would be$__fish_config_dir - Improve parsing of specific DocumentSymbols (now
FishSymbol) by using more verbose rules for excluding certain tokens fromweb-tree-sitter - Add better workspace support for non-standard/small fish workspaces.
THE
serverFILE LIKELY NEEDS workspace handlers- Supporting
/tmp/*.fishbuffers from things likeedit_command_buffer/alt-e - Supporting
fisherworkspaces (consider a workspace like~/repo/fisher-plugin, as its own workspace without$fish_lps_all_indexed_paths)NOTE:
fish_lsp_single_workspace_supportwas an attempt at specifying that the user has opted into this feature - Supporting sourced files outside of workspace, and adding them to the workspace
- Supporting
- Go-to-Definition && Hover support for
source some_file.fishcommand - Improving completions for
set -gx fish_lsp_*env variables- adding better hover documentation to
fish_lsp_*env variables, using theoptionsproperty
- adding better hover documentation to
- Comparing already generated
complete -c cmd -s _ -l _completions to the a function with anargparsechild definition, so that duplicate completions are not generated-
argparse 'n/name=' -- $argvcommand could generatecomplete -c cmd -s n -l name -a ' '- Key difference being the-aflag is outputted There is also the-xand-rflags that could be used.
-
- General plumbing
- Add more test coverage for heavily used files.
- Remove unused/deprecated files and/or functions
- Consider allowing the user to specify configuring the
fish_indentcommand behavior-
fish v3.7.1tofish v4.0.0changesfish_indentbehavior specifically for;characters to be replaced with\n, creating potentially unwanted formatting changes - Allow option to specify either
fish_indent --only-indentorfish_indentfor formatting a file.
-
- Update docs for using
initializationParamsin the client configuration - remove
fish-lsp logger- remove
fish-lsp loggerfrom thesrc/cli.tsfile - remove
fish-lsp loggerfrom the completions - remove
fish-lsp loggerutilities from thesrc/logger.tsfile
- remove
- Refactor unused files & data-structures
- Read a user's specific configuration they have set
-
env_variablescould be set via zod - set options via cli flags,
fish-lsp start --enable ... --disable ... - use builtin fish variables for generating defaults:
$__fish_config_dir,$fish_function_path,$__fish_user_data_dir- some documentation on the subject
- example use for functions:
fish -c 'string split " " -- $fish_function_path' $__fish_user_data_diris usually/usr/share/fish
-
- Supporting fish feature flags and handling proper syntax changes
Server Features and Providers
- Add
src/parsing/emit.tsfile for emitting aFishSymbolto call aFunction. This would disable diagnostics causing false positives for users who like to use a lot of event handlers in their fish config - Add
Diagnostics-
add a
diagnostic queueto store diagnostics -
enable/disable specific features (more info available here):
- Error - missing
endto block - Error - missing
switch/casefall through checkcase '*'orcase \* - Warning - prefer
command/builtinprefix for commands or builtins - Warning - missing completions file from a
functions/<file>.fish - Test different message formats
- disable/enable via env variables
- ...add more features...
- Error - missing
-
write verbose tests for each new diagnostic
-
- Add
CodeActions- Create
completionsfile -
Quickfixdiagnostic error - Rename autoloaded filename (for a fish
function), that doesn't have a matching function name - Prefer
commandprefix for possible aliased shell commands. - Move function in
~/.config/fish/config.fishto it's own file,~/.config/fish/functions/<file>.fishand call it inline. -
ifstatement toand/orequivalent, combiner NEEDS TO BE REMOVED ACCORDING TO FISH V4.0.0 DOCS
- Create
- Add
CodeLenssupport (CURRENTLY WE USE INLAY HINTS INSTEAD OF CodeLens)- Decide what would be useful to display
- Local reference count
-
return $statusvalues for functions -
type -t
- Decide what would be useful to display
- Add
CommandExecutorprovider - Add function
SignatureHelpprovider.- semi complete, needs more support. (Specifically struggles with determining what the current token type is)
- add support to enable via
CompletionItem - add
function _ -a first second third -d 'a function description'support for parsing the values out of the options, to then be used as a more traditional signature handler
- Add
set_colorColor Presentation to the server, for displaying how the shell would render output.- Could be toggled via a server command
- color theme variables as well
-
FormatOnTypeprovider (useful for small files)- add to
config
- add to
- Enable server via shebang's:
-
#!/usr/bin/fish -
#!/usr/local/bin/fish -
#!/usr/bin/env fish
-
- Add
DocumentHighlightprovider - Extend symbol definitions recognized by the server (DONE BY ./src/parsing/):
- variables created by
fish_opt -
argparsecommands -
aliasnames -
setnames -
readnames -
aliasnames -
sourcenames -
forloop variable names -
functionnames (both variables and functions) -
abbrnames (would theoretically need to be able to parse aabbr --set-cursor --function) - include theme variables
- event handlers for
function _ --on-event event - universal variables
- variables created by
- Descriptions for array indexing:
echo $PATH[-1..2]- ensure array indexes are:
1 >= idx <= -1
- ensure array indexes are:
- status variable documentation
0 is generally the exit status of commands if they successfully performed the requested operation. 1 is generally the exit status of commands if they failed to perform the requested operation. 121 is generally the exit status of commands if they were supplied with invalid arguments. 123 means that the command was not executed because the command name contained invalid characters. 124 means that the command was not executed because none of the wildcards in the command produced any matches. 125 means that while an executable with the specified name was located, the operating system could not actually execute the command. 126 means that while a file with the specified name was located, it was not executable. 127 means that no function, builtin or command with the given name could be located.
-
argparsesupport- if autoloaded function has
argparsethen use values to create completions - check if all args from
argparseare included in completion - check if all args from
argparsehave been used_flag_arg - use
argparsevalues as definition
- if autoloaded function has
- disable/enable server features through
fish-lsp.commandoptions - virtual text -
fish_promptinedit_command_buffer.- The general idea here is when an
edit_command_bufferis opened, we could use thefish_promptto display the prompt as virtual text inside the buffer. fish_promptare just ascii charactersedit_command_bufferopens an interactive buffer in the/tmpfolder, we could either consider all/tmp/*.fishfiles to have this behavior, or wrap theedit_command_bufferfunction in another function with variables exported to specify when this should be used.
- The general idea here is when an
- inlay hints - add references or some other feature
-
return $statusvalues for functions -
exitvalues?
-
-
breakpointsupport - improve conf.d/*.fish support
-
conf.d/*.fishfiles are really just treated the same asconfig.fishfiles, but are sourced before theconfig.fishfile. This means, that something defined in aconf.d/*.fishfile will be available everywhere, but might need to called/referenced to use it in an interactive shell.
-
- add
completionsnippets for builtins
Automation and pipelines
- (POTENTIALLY) Use pnpm instead of yarn
- Minimize
test-suitefor master branch's PR compatibility- run via:
yarn test-hook
- run via:
- Include refactoring/tree-shaking help to scripts:
yarn refactor - Release binary downloadable files, per machine OS
- need a build pipeline as well
- handle scope specific dependencies
NOTE: used bun to complete this, but the binary files are huge so it currently
- Action for updating fish-lsp.dev documentation on new publishes
- write script for generating
fish-lsp --helpscreenshot
- write script for generating
- add action testing
fish-lsp --helpis successfully built on os matrix (would be mac and unix)
Documentation
- Add new editor configurations:
- Monaco support (Could be used to demo project on fish-lsp.dev)
- helix support
- vscode support
- Add fish-lsp.dev website
- add monaco support -- testing lsp in web-editor
- Add improved
giffile, showcasing lsp's capabilities to README.md - include
tree-sitter-fish.wasmin downloaded project- build from fork: @esdmr/tree-sitter-fish
- universal
*.wasmfile
- README.md changes:
- improve contributing section (add authors icons)
- license include only MIT
- add
CodeActiongifs for a section in the README (specifically the completion GIF since its already recorded) - use a screenshot of the
# @fish-lsp-disablefeature, instead of the shell code version given - add go-to implementation to README.md
- Extend documentation provided via wiki
- workflows - guide for creating new workflows
- testing - guide for writing tests
- layout - guide for project layout & design patterns via mermaid charts