
/\ /\___| |_ __ ___ / / ___
/ /_/ / _ \ | '_ ` _ \ / / / __|
/ __ / __/ | | | | | / /__\__ \
\/ /_/ \___|_|_| |_| |_\____/___/
Helm Language Server
Helm-ls is a helm language server protocol LSP implementation.
Demo

Getting Started
Installation with a package manager
Helm-ls is currently available as a package for some package managers.

These are some of the supported package managers. Thanks to everyone who packaged it!
Homebrew
If you are using MacOS or Linux with Homebrew you can install it with brew.
brew install helm-ls
Nix
nix-shell -p helm-ls
Arch Linux
You can install it from the aur using your preferred aur helper, e.g. yay:
yay -S helm-ls
# or
yay -S helm-ls-bin
Windows
You can use scoop to install it:
scoop bucket add extras
scoop install extras/helm-ls
mason (neovim)
If you are using neovim with mason you can also install it with mason.
:MasonInstall helm-ls
Manual download
-
Download the latest helm_ls executable file from here and move it to your binaries directory
-
You can download it with curl, replace the {os} and {arch} variables
curl -L https://github.com/mrjosh/helm-ls/releases/download/master/helm_ls_{os}_{arch} --output /usr/local/bin/helm_ls
Make it executable
chmod +x /usr/local/bin/helm_ls
Helm-ls will use yaml-language-server to provide additional capabilities, if it is installed.
Template files
Helm-ls will convert the gotemplate files in the templates directory to yaml and process them with yaml-language-server.
[!WARNING]
This feature is experimental, you can disable it in the config (see) if you are getting a lot of errors beginning with Yamlls:.
Having a broken template syntax (e.g. while your are still typing) will also cause diagnostics from yaml-language-server to be shown as errors.
Values files
Helm-ls will generate json-schemas for all values.*yaml files and use yaml-language-server to provide autocompletion.
This feature is currently in beta, see this discussion for details.
Install
npm install --global yaml-language-server
To install it using npm run (or use your preferred package manager):
The default kubernetes schema of yaml-language-server will be used for all files. You can overwrite which schema to use in the config (see).
If you are for example using CRDs that are not included in the default schema, you can overwrite the schema using a comment
to use the schemas from the CRDs-catalog.
Custom Schemas
# yaml-language-server: $schema=https://raw.githubusercontent.com/datreeio/CRDs-catalog/main/keda.sh/scaledobject_v1alpha1.json
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
Dependency Charts
Helm-ls can process dependency charts to provide autocompletion, hover etc. with values from the dependencies.
For this the dependency charts have to be downloaded. Run the following command in your project to download them:
helm dependency build
Configuration options
You can configure helm-ls with lsp workspace configurations.
General
- Log Level: Adjust log verbosity.
Values Files
- Main Values File: Path to the main values file (values.yaml per default)
- Lint Overlay Values File: Path to the lint overlay values file, which will be merged with the main values file for linting
- Additional Values Files Glob Pattern: Pattern for additional values files, which will be shown for completion and hover
Helm Lint
- Enabled: Allows to disable the diagnostics gathered with helm lint.
- ignoredMessages: A list of lint messages to ignore. You can for example add "icon is recommended" here.
yaml-language-server config
-
Enable yaml-language-server: Toggle support of this feature.
-
EnabledForFilesGlob: A glob pattern defining for which files yaml-language-server should be enabled.
-
Path to yaml-language-server: Specify the executable location. Can be a string or an array. Can also be set with the environment variable YAMLLS_PATH using a comma separated list or a JSON array.
-
initTimeoutSeconds: The timeout in seconds for the initialization of yamlls. (Increase if you get an error log like "Error initializing yamlls context deadline exceeded")
-
Diagnostics Settings:
- Limit: Number of displayed diagnostics per file. Set this to 0 to disable all diagnostics from yaml-language-server but keep other features such as hover.
- Show Directly: Show diagnostics while typing.
-
Additional Settings (see yaml-language-server):
- Schemas: Define YAML schemas.
- Completion: Enable code completion.
- Hover Information: Enable hover details.
Default Configuration
settings = {
['helm-ls'] = {
logLevel = "info",
valuesFiles = {
mainValuesFile = "values.yaml",
lintOverlayValuesFile = "values.lint.yaml",
additionalValuesFilesGlobPattern = "values*.yaml"
},
helmLint = {
enabled = true,
ignoredMessages = {},
},
yamlls = {
enabled = true,
enabledForFilesGlob = "*.{yaml,yml}",
diagnosticsLimit = 50,
showDiagnosticsDirectly = false,
path = "yaml-language-server", -- or something like { "node", "yaml-language-server.js" }
initTimeoutSeconds = 3,
config = {
schemas = {
kubernetes = "templates/**",
},
completion = true,
hover = true,
-- any other config from https://github.com/redhat-developer/yaml-language-server#language-server-settings
}
}
}
}
Editor Config examples
Neovim
Filetype detection
To get filetype detection working, you can use one of the folowing plugins:
- helm-ls.nvim: recommended, requires tree-sitter for syntax highlighting. Also provides some additional features.
- vim-helm: known to cause problems with yaml-language-server when used with another plugin manger than lazy
install it using lazy (or use your preferred plugin manager):
{ "qvalentin/helm-ls.nvim", ft = "helm" }
-- or { "towolf/vim-helm", ft = "helm" },
-- or even both if you do not want to use tree-sitter for syntax highlighting
nvim-lspconfig setup
Add the following to your neovim lua config:
local lspconfig = require('lspconfig')
lspconfig.helm_ls.setup {
settings = {
['helm-ls'] = {
yamlls = {
path = "yaml-language-server",
}
}
}
}
See examples/nvim/init.lua for an
complete example using lazy, or examples/vim-plug/init.lua for vim-plug.
The examples also include the setup for yaml-language-server.
[!TIP]
If you are using AstroNvim you can just install the astrocommunity helm pack
or if using LazyVim its LazyVimHelm plugin.
coc.nvim setup
You can also use coc.nvim to set up the language server.
You will need to configure the use of helm_ls in the langageserver section of your coc-settings.json file.
Open Neovim and type the command :CocConfig to access the configuration file. Find the langageserver section and add this configuration:
"languageserver": {
"helm": {
"command": "helm_ls",
"args": ["serve"],
"filetypes": ["helm", "helmfile"],
"rootPatterns": ["Chart.yaml"]
}
}
Save the configuration file and then either restart Neovim or type :CocRestart to restart the language server.
VSCode
Check out the helm-ls-vscode extension for more details.
Zed
Setup filetypes as described in the Zed Docs and install the helm.zed extension.
Emacs eglot setup
Integrating helm-ls with eglot for emacs consists of two steps: wiring up Helm template files into a specific major mode and then associating that major mode with helm_ls via the eglot-server-programs variable.
The first step is necessary because without a Helm-specific major mode, using an existing major mode like yaml-mode for helm_ls in eglot-server-programs may invoke the language server for other, non-Helm yaml files.
For example, the following elisp snippet demonstrates how to use this language server after installing it as explained in Getting Started.
Assuming that you leverage use-package for package management:
;; ...ensure that your package manager of choice is setup before
;; installing packages, and then
;; Install yaml-mode
(use-package yaml-mode)
;; Create a derived major-mode based on yaml-mode
(define-derived-mode helm-mode yaml-mode "helm"
"Major mode for editing kubernetes helm templates")
(use-package eglot
; Any other existing eglot configuration plus the following:
:hook
; Run eglot in helm-mode buffers
(helm-mode . eglot-ensure)
:config
; Run `helm_ls serve` for helm-mode buffers
(add-to-list 'eglot-server-programs '(helm-mode "helm_ls" "serve")))
Invoke M-x helm-mode in a Helm template file to begin using helm-ls as a backend for eglot.
Alternatively, you can include a comment such as the following at the top of Helm yaml files to automatically enter helm-mode:
# -*- mode: helm -*-
Features and Demos
Hover
| Language Construct (or filetype) |
Example Effect |
| Values |
.Values.replicaCount shows the value of replicaCount in the values.yaml files. |
| Built-In-Objects |
.Chart.Name shows the name of the Chart. |
| Includes |
include "example.labels" shows the definition of the template. |
| Functions |
add shows the docs of the add function. |
| Yaml in Templates |
Kind shows the docs from the yaml-schema (via yaml-language-server). |
| values.*.yaml files |
Docs from the generated schema (via yaml-language-server), YAML path, values from other values files either from the same Chart or other Charts. |
Autocomplete
| Language Construct (or filetype) |
Effect |
| Values |
Values from values*.yaml files (including child/parent Charts). |
| Built-In-Objects |
Values from Chart, Release, Files, Capabilities, Template. |
| Includes |
Available includes (including child/parent Charts). |
| Functions |
Functions from gotemplate and helm. |
| Yaml in Templates |
Values from the yaml-schema (via yaml-language-server). |
| values.*.yaml files |
Values from other values files either from the same Chart or other Charts. |
Go-To-Definition/References
| Language Construct |
Effect |
| Values |
Go to values*.yaml files for template references (including child/parent Charts) or other templates. |
| Built-In-Objects |
Go to Chart.yaml for Chart.*. |
| Includes |
Go to definition/references of templates (including child/parent Charts). |
| values.*.yaml files |
Go to other values*.yaml files (definitions) or templates using the values (references). |
Symbol
Can show a breadcrumb of the yaml path of the current position (via yaml-language-server).

Linting
Diagnostics from both helm lint and yaml-language-server.

Contributing
Thank you for considering contributing to Helm-ls project!
License
The Helm-ls is open-source software licensed under the MIT license.
Part of the documentation that is included in helm-ls is copied from the Go standard library. The original license is included in the files containing the documentation.