Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/DanielGavin/ols
Language server for Odin
https://github.com/DanielGavin/ols
language-server lsp odin
Last synced: 18 days ago
JSON representation
Language server for Odin
- Host: GitHub
- URL: https://github.com/DanielGavin/ols
- Owner: DanielGavin
- License: mit
- Created: 2020-11-03T12:50:03.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2024-05-21T20:27:51.000Z (7 months ago)
- Last Synced: 2024-05-22T18:40:51.071Z (7 months ago)
- Topics: language-server, lsp, odin
- Language: Odin
- Homepage:
- Size: 3.06 MB
- Stars: 350
- Watchers: 9
- Forks: 51
- Open Issues: 44
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-odin - OLS
- awesome-odin - [DanielGavin/ols - commit/DanielGavin/ols) (Interviews / Vendor)
README
# ols
Language server for Odin. This project is still in early development.
Note: This project is made to be up to date with the master branch of Odin.
## Table Of Contents
- [Installation](#installation)
- [Configuration](#Configuration)
- [Features](#features)
- [Clients](#clients)
- [Vs Code](#vs-code)
- [Sublime](#sublime)
- [Vim](#vim)
- [Neovim](#neovim)
- [Emacs](#emacs)
- [Helix](#helix)
- [Micro](#micro)## Installation
```bash
cd ols# for windows
./build.bat
# To install the odinfmt formatter
./odinfmt.bat# for linux and macos
./build.sh
# To install the odinfmt formatter
./odinfmt.sh
```### Configuration
In order for the language server to index your files, it must know about your collections.
To do that you can either configure ols via an `ols.json` file (it should be located at the root of your workspace).
Or you can provide the configuration via your editor of choice.
Example of `ols.json`:
```json
{
"$schema": "https://raw.githubusercontent.com/DanielGavin/ols/master/misc/ols.schema.json",
"collections": [
{ "name": "custom_collection", "path": "c:/path/to/collection" }
],
"enable_semantic_tokens": false,
"enable_document_symbols": true,
"enable_hover": true,
"enable_snippets": true,
"profile": "default",
"profiles": [
{ "name": "default", "checker_path": ["src"]},
{ "name": "linux_profile", "os": "linux", "checker_path": ["src/main.odin"]},
{ "name": "windows_profile", "os": "windows", "checker_path": ["src"]}
]
}
```You can also set `ODIN_ROOT` environment variable to the path where ols should look for core and vendor libraries.
Options:
`enable_format`: Turns on formatting with `odinfmt`. _(Enabled by default)_
`enable_hover`: Enables hover feature
`enable_snippets`: Turns on builtin snippets
`enable_semantic_tokens`: Turns on syntax highlighting.
`enable_document_symbols`: Turns on outline of all your global declarations in your document.
`enable_fake_methods`: Turn on fake methods completion. This is currently highly experimental.
`enable_inlay_hints`: Turn on inlay hints for editors that support it.
`enable_procedure_snippet`: Use snippets when completing procedures—adds parenthesis after the name. _(Enabled by default)_
`enable_checker_only_saved`: Turns on only calling the checker on the package being saved.
`enable_references`: Turns on finding references for a symbol. (Experimental)
`enable_rename`: Turns on renaming a symbol. (Experimental)
`odin_command`: Allows you to specify your Odin location, instead of just relying on the environment path.
`checker_args`: Pass custom arguments to `odin check`.
`verbose`: Logs warnings instead of just errors.
`profile`: What profile to currently use.
`profiles`: List of different profiles that describe the environment ols is running under.
### Odinfmt configurations
Odinfmt reads configuration through `odinfmt.json`.
Example:
```json
{
"$schema": "https://raw.githubusercontent.com/DanielGavin/ols/master/misc/odinfmt.schema.json",
"character_width": 80,
"tabs": true,
"tabs_width": 4
}
```Options:
`character_width`: How many characters it takes before it line breaks it.
`spaces`: How many spaces is in one indentation.
`newline_limit`: The limit of newlines between statements and declarations.
`tabs`: Tabs or spaces.
`tabs_width`: How many characters one tab represents
`sort_imports`: A boolean that defaults to true, which can be set to false to disable sorting imports.
## Features
Support Language server features:
- Completion
- Go to definition
- Semantic tokens
- Document symbols
- Rename
- References
- Signature help
- Hover## Clients
### VS Code
Install the extension https://marketplace.visualstudio.com/items?itemName=DanielGavin.ols
### Sublime
Install the package https://github.com/sublimelsp/LSP
Configuration of the LSP:
```json
{
"clients": {
"odin": {
"command": [
"/path/to/ols"
],
"enabled": false, // true for globally-enabled, but not required due to 'Enable In Project' command
"selector": "source.odin",
"initializationOptions": {
"collections": [
{
"name": "collection_a",
"path": "/path/to/collection_a"
}
],
"enable_semantic_tokens": true,
"enable_document_symbols": true,
"enable_hover": true,
"enable_snippets": true,
"enable_format": true,
}
}
}
}
```### Vim
Install [Coc](https://github.com/neoclide/coc.nvim).
Configuration of the LSP:
```json
{
"languageserver": {
"odin": {
"command": "ols",
"filetypes": ["odin"],
"rootPatterns": ["ols.json"]
}
}
}
```### Neovim
Neovim has a builtin support for LSP.
There is a plugin that makes the setup easier, called [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig). You can install it with your prefered package manager.
A simple configuration that uses the default `ols` settings would be like this:
```lua
require'lspconfig'.ols.setup {}
```And here is an example of a configuration with a couple of settings applied:
```lua
require'lspconfig'.ols.setup {
init_options = {
checker_args = "-strict-style",
collections = {
{ name = "shared", path = vim.fn.expand('$HOME/odin-lib') }
},
},
}
```### Emacs
```elisp
;; Enable odin-mode and configure OLS as the language server
(use-package! odin-mode
:mode ("\\.odin\\'" . odin-mode)
:hook (odin-mode . lsp));; Set up OLS as the language server for Odin, ensuring lsp-mode is loaded first
(with-eval-after-load 'lsp-mode
(setq-default lsp-auto-guess-root t) ;; Helps find the ols.json file with Projectile or project.el
(setq lsp-language-id-configuration (cons '(odin-mode . "odin") lsp-language-id-configuration))(lsp-register-client
(make-lsp-client :new-connection (lsp-stdio-connection "/path/to/ols/executable") ;; Adjust the path here
:major-modes '(odin-mode)
:server-id 'ols
:multi-root t))) ;; Ensures lsp-mode sends "workspaceFolders" to the server(add-hook 'odin-mode-hook #'lsp)
```### Helix
Helix supports Odin and OLS by default. It is already enabled in the [default languages.toml](https://github.com/helix-editor/helix/blob/master/languages.toml).
If `ols` or `odinfmt` are not on your PATH environment variable, you can enable them like this:
```toml
# Optional. The default configration requires OLS in PATH env. variable. If not,
# you can set path to the executable like so:
# [language-server.ols]
# command = "path/to/executable"
```### Micro
Install the [LSP plugin](https://github.com/AndCake/micro-plugin-lsp)
Configure the plugin in micro's settings.json:
```json
{
"lsp.server": "c=clangd,go=gopls,odin=ols"
}
```
### KateFirst, make sure you have the LSP plugin enabled. Then, you can find LSP settings for Kate in Settings -> Configure Kate -> LSP Client -> User Server Settings.
You may have to set the folders for your Odin home path directly, like in the following example:
```json
{
"servers": {
"odin": {
"command": [
"ols"
],
"filetypes": [
"odin"
],
"url": "https://github.com/DanielGavin/ols",
"root": "%{Project:NativePath}",
"highlightingModeRegex": "^Odin$",
"initializationOptions": {
"collections": [
{
"name": "core",
"path": "/path/to/Odin/core"
},
{
"name": "vendor",
"path": "/path/to/Odin/vendor"
},
{
"name": "shared",
"path": "/path/to/Odin/shared"
},
{
"name": "src", // If your project has src-collection in root folder,
"path": "src" // this will add it as a collection
},
{
"name": "collection_a",
"path": "/path/to/collection_a"
}
],
"odin_command": "path/to/Odin",
"verbose": true,
"enable_document_symbols": true,
"enable_hover": true
}
}
}
}
```
Kate can infer inlay hints on its own when enabled in LSP settings, so enabling it separately in the server config
can cause some weird behavior.