Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/olrtg/emmet-language-server
A language server for emmet.io
https://github.com/olrtg/emmet-language-server
emmet lsp-server neovim
Last synced: about 6 hours ago
JSON representation
A language server for emmet.io
- Host: GitHub
- URL: https://github.com/olrtg/emmet-language-server
- Owner: olrtg
- License: mit
- Created: 2023-06-30T21:02:35.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-21T15:39:04.000Z (2 months ago)
- Last Synced: 2025-01-20T00:00:20.488Z (7 days ago)
- Topics: emmet, lsp-server, neovim
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/@olrtg/emmet-language-server
- Size: 2.58 MB
- Stars: 318
- Watchers: 5
- Forks: 8
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
![Promo gif](./assets/promo.gif)
---
### Why another language server?
While [aca/emmet-ls](https://github.com/aca/emmet-ls) works for what I need, there were a couple of things that annoyed me from time to time and while trying to fix one of those things (aca/emmet-ls#55) I've discovered that we can leverage [microsoft/vscode-emmet-helper](https://github.com/microsoft/vscode-emmet-helper) and make a simple language server that wraps that package to provide completions.
So I decided to do that and it worked!
The most important thing is that [microsoft/vscode](https://github.com/microsoft/vscode) has an excellent integration with emmet and we can have that, in all editors that implement the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/).
### Setup
**Using npm:**
```sh
npm i -g @olrtg/emmet-language-server
```**Using mason.nvim:**
```sh
:MasonInstall emmet-language-server
```### Neovim
> [!NOTE]
> Want deeper integration (eg. wrap with abbreviation)? Check out [nvim-emmet](https://github.com/olrtg/nvim-emmet).**With nvim-lspconfig:**
Remember that if you don't need to support a new filetype or change the default settings of the language server you just need to pass an empty table to the `setup` function (like this: `lspconfig.emmet_language_server.setup({})`).
```lua
lspconfig.emmet_language_server.setup({
filetypes = { "css", "eruby", "html", "javascript", "javascriptreact", "less", "sass", "scss", "pug", "typescriptreact" },
-- Read more about this options in the [vscode docs](https://code.visualstudio.com/docs/editor/emmet#_emmet-configuration).
-- **Note:** only the options listed in the table are supported.
init_options = {
---@type table
includeLanguages = {},
--- @type string[]
excludeLanguages = {},
--- @type string[]
extensionsPath = {},
--- @type table [Emmet Docs](https://docs.emmet.io/customization/preferences/)
preferences = {},
--- @type boolean Defaults to `true`
showAbbreviationSuggestions = true,
--- @type "always" | "never" Defaults to `"always"`
showExpandedAbbreviation = "always",
--- @type boolean Defaults to `false`
showSuggestionsAsSnippets = false,
--- @type table [Emmet Docs](https://docs.emmet.io/customization/syntax-profiles/)
syntaxProfiles = {},
--- @type table [Emmet Docs](https://docs.emmet.io/customization/snippets/#variables)
variables = {},
},
})
```**Without nvim-lspconfig:**
```lua
vim.api.nvim_create_autocmd({ "FileType" }, {
pattern = "css,eruby,html,htmldjango,javascriptreact,less,pug,sass,scss,typescriptreact",
callback = function()
vim.lsp.start({
cmd = { "emmet-language-server", "--stdio" },
root_dir = vim.fs.dirname(vim.fs.find({ ".git" }, { upward = true })[1]),
-- Read more about this options in the [vscode docs](https://code.visualstudio.com/docs/editor/emmet#_emmet-configuration).
-- **Note:** only the options listed in the table are supported.
init_options = {
---@type table
includeLanguages = {},
--- @type string[]
excludeLanguages = {},
--- @type string[]
extensionsPath = {},
--- @type table [Emmet Docs](https://docs.emmet.io/customization/preferences/)
preferences = {},
--- @type boolean Defaults to `true`
showAbbreviationSuggestions = true,
--- @type "always" | "never" Defaults to `"always"`
showExpandedAbbreviation = "always",
--- @type boolean Defaults to `false`
showSuggestionsAsSnippets = false,
--- @type table [Emmet Docs](https://docs.emmet.io/customization/syntax-profiles/)
syntaxProfiles = {},
--- @type table [Emmet Docs](https://docs.emmet.io/customization/snippets/#variables)
variables = {},
},
})
end,
})
```### Helix
Install normally with npm (or your favourite package manager), then add the following to `languages.toml`:
```toml
[language-server.emmet-lsp]
command = "emmet-language-server"
args = ["--stdio"][[language]]
name = "html"
roots = [".git"]
language-servers = ["emmet-lsp"]
```### Credits
- [@aca](https://github.com/aca) for the first language server ([aca/emmet-ls](https://github.com/aca/emmet-ls))
- [@wassimk](https://github.com/wassimk) for bringing the [microsoft/vscode-emmet-helper](https://github.com/microsoft/vscode-emmet-helper) repo to my attention in aca/emmet-ls#55
- [microsoft/vscode](https://github.com/microsoft/vscode) for having such an amazing integration with emmet and the easy and open package to integrate with
- [emmetio/emmet](https://github.com/emmetio/emmet) for the awesome tool