Introducing the fish-lsp, a Language Server Protocol (LSP) implementation for the fish shell language.
π¦ Efficiency: enhances the shell scripting experience with an extensive suite of intelligent text-editing features
π‘ Flexibility: allows for a highly customizable configuration
π Guidance: friendly hints and documentation to comfortably explore command line tooling
π¬ Community: improved by a vibrant user base, with supportive and insightful feedback
π Compatibility: integrates with a wide variety of tooling and language clients
π Reliability: produces an editor agnostic developer environment, ensuring all fish user's have access to a consistent set of features
Feature | Description | Status |
---|---|---|
Completion | Provides completions for commands, variables, and functions | β |
Hover | Shows documentation for commands, variables, and functions. Has special handlers for --flag , commands , functions , variables |
β |
Signature Help | Shows the signature of a command or function | β |
Goto Definition | Jumps to the definition of a command, variable, or function | β |
Find References | Shows all references to a command, variable, or function | β |
Rename | Rename within matching global && local scope | β |
Document Symbols | Shows all commands, variables, and functions in a document | β |
Workspace Symbols | Shows all commands, variables, and functions in a workspace | β |
Document Formatting | Formats a document, full & selection | β |
Document Highlight / Semantic Token | Highlights all references to a command, variable, or function. | β |
Command Execution | Executes a server command from the client | β |
Code Action | Shows all available code actions | β |
Code Lens | Shows all available code lenses | β |
Logger | Logs all server activity | β |
Diagnostic | Shows all diagnostics | β |
Folding Range | Toggle ranges to fold text | β |
Telescope Integration | Integrates with the telescope.nvim plugin | β |
CLI Interactivity | Provides a CLI for server interaction. Built by fish-lsp complete <option> |
β |
Client Tree | Shows the defined scope as a Tree | β |
Indexing | Indexes all commands, variables, and functions | β |
Recommended Dependencies:
yarn@1.22.22
,node@21.7.1
,fish@3.7.1
Building from source is the only currently recommended installation method, as we improve other methods of the installation process (Don't use releases or npm packages). Contributions to help enhance installation options are greatly appreciated!
Clone the repo
git clone https://github.com/ndonfris/fish-lsp
# cd fish-lsp
Install the dependencies & run the setup handler scripts
yarn install
Optional: Check that the project successfully compiled & linked
fish-lsp --help # ./bin/fish-lsp --help
To properly configure fish-lsp, you need to define a client configuration after
installing the language server. Client's typically only need the keys command
,
args/arguments
, and filetypes
to start a language server.
Theoretically, the language-server should generally be compatible with almost any text-editor or IDE you prefer using. Feel free to setup the project in any fish-lsp-client of your choice, or submit a PR for new configurations.
{
"fish-lsp": {
"command": "fish-lsp",
"filetypes": ["fish"],
"args": ["start"]
}
}
Neovim client using coc.nvim configuration, located inside coc-settings.json
"languageserver"
key
Specific functionality for the server can be set independently from the client. This allows for multiple
configurations, to be defined and chosen via specific startup requirements (i.e., using the bind
command
with the function edit_command_buffer
).
Generated by
fish-lsp env --create
# fish_lsp_enabled_handlers <ARRAY>
# enables the fish-lsp handlers (options: 'formatting', 'complete', 'hover', 'rename', 'definition', 'references', 'diagnostics', 'signatureHelp', 'codeAction', 'index')
set -gx fish_lsp_enabled_handlers
# fish_lsp_disabled_handlers <ARRAY>
# disables the fish-lsp handlers (options: 'formatting', 'complete', 'hover', 'rename', 'definition', 'references', 'diagnostics', 'signatureHelp', 'codeAction', 'index')
set -gx fish_lsp_disabled_handlers
# fish_lsp_commit_characters <ARRAY>
# array of the completion expansion characters. Single letter values only.
# Commit characters are used to select completion items, as shortcuts. (default: [])
set -gx fish_lsp_commit_characters
# fish_lsp_logfile <STRING>
# path to the logs.txt file (default: '')
# example locations could be: '~/path/to/fish-lsp/logs.txt' or '/tmp/fish_lsp_logs.txt'
set -gx fish_lsp_logfile
# fish_lsp_format_tabsize <NUMBER>
# amount of spaces in a tab character for the formatter provider (default: 4)
set -gx fish_lsp_format_tabsize
# fish_lsp_format_switch_case <BOOLEAN>
# keep case statements left aligned with switch block. (default: false)
set -gx fish_lsp_format_switch_case
# fish_lsp_all_indexed_paths <ARRAY>
# fish file paths/workspaces to include as workspaces (default: ['/usr/share/fish', "$HOME/.config/fish"])
set -gx fish_lsp_all_indexed_paths
# fish_lsp_modifiable_paths <ARRAY>
# fish file paths/workspaces that can be renamed by the user. (default: ["$HOME/.config/fish"])
set -gx fish_lsp_modifiable_paths
# fish_lsp_diagnostic_disable_error_codes <ARRAY>
# disable diagnostics for matching error codes (default: [])
# (options: 1001, 1002, 1003, 1004, 2001, 2002, 2003, 3001, 3002, 3003)
set -gx fish_lsp_diagnostic_disable_error_codes
# fish_lsp_max_background_files <NUMBER>
# maximum number of background files to read into buffer on startup (default: 1000)
set -gx fish_lsp_max_background_files
# fish_lsp_show_client_popups <BOOLEAN>
# show popup window notification in the connected client (default: true)
set -gx fish_lsp_show_client_popups
Both the flags --enable
and --disable
are provided on the fish-lsp start
subcommand. By default, all handlers will be enabled.
# displays what handlers are enabled. Removing the dump flag will run the server.
fish-lsp start --disable complete signature --dump
Any flags will overwrite their corresponding environment variables, if both are
seen for the fish-lsp
process. For this reason, it is encouraged to wrap any
non-standard behavior of the fish-lsp
in functions or aliases.
Due to the vast possibilities this project aims to support in the fish shell, sharing useful configurations is highly encouraged.
If you're new to the concept of the Language Server Protocol (LSP), this section should be useful to help you grasp its core purpose and benefits.
πΈ Check out this insightful video by TJ DeVries for an introduction to the subject.
The LSP is designed to create a uniform approach for supporting a programming language across various development tools, moving beyond the confines of specific Text-Editor/IDE ecosystems. This standardization enhances a language's appeal by allowing developers to maintain consistent tooling support without needing to switch developer environments.
The core of this system is the interaction between a 'language server', which provides language services, and a 'language client', which consumes these services. The protocol facilitates this interaction, ensuring that any language client can leverage a well-defined set of features provided by the server.
fish-lsp
processSpecial thanks to anyone who contributed to the project! Contributions of any kind are welcome!
nick π» |
mimikun π» |
Jaakko Paju π» |
Sean Perry π» |
Fabio Coatti π» |
Peter Cardenas π» |
Peter Tri Ho π» |
This project follows the all-contributors specification.