-
Notifications
You must be signed in to change notification settings - Fork 298
Language Support
Oni utilizes the Language Server Protocol (LSP) to provide common IDE functionality for any arbitrary programming language. This enables features like code completion, go-to definition, and method signature help.
Oni comes with a few language servers bundled:
- HTML - provided by vscode-html-languageserver-bin
- CSS/LESS/SASS - provided by vscode-css-languageserver-bin
- JavaScript/TypeScript - provided by typescript's Standalone Server
- Reason / OCaml - provided by ocaml-language-server
Language options are configurable via the configuration settings in your config.js
.
In general, language options are specified in the form language.<language-identifier>.<option>
, where language-identifier
corresponds to the file type.
Auto-closing pairs is a feature that automatically 'closes' certain character pairs.
This has two general settings:
-
autoClosingPairs.enabled
- (boolean) - specifies whether auto-closing pairs are active. Default istrue
. -
autoClosingPairs.default
- (AutoClosingPair[]) - specifies the default set of auto-closing pairs, if not overridden by a language setting.
With the default set of auto-closing pairs defined as:
"autoClosingPairs.default": [
{ "open": "{", "close": "}" },
{ "open": "[", "close": "]" },
{ "open": "(", "close": ")" },
],
Auto-closing pairs can be specified per language via the language.<language-identifier>.autoClosingPairs
setting, in the same format as above.
Language servers are configurable via the language.<language-identifier>.languageServer.<setting>
, and the following settings are available:
-
command
- (String) (required) - The command to start the language server. This could be a javascript file or an executable. REQUIRED -
arguments
(String[]) (optional) - An array of arguments to pass to the language server -
rootFiles
(String[]) (optional) - A set of files that are treated as the root. When this is specified, Oni will search upward for this, and start the language server in the root folder -
configuration
(any) (optional) - Additional javascript objects to send to the language server via theworkspace/onConfigurationChanged
event
An example configuration might be:
"language.reason.languageServer.command": "ocaml-language-server",
"language.reason.languageServer.arguments": ["--stdio"],
"language.reason.languageServer.rootFiles": [".merlin", "bsconfig.json"],
"language.reason.languageServer.configuration": {}
The only required option is the language server command, however, some language servers may require you to use the full set of parameters.
NOTE: Language servers implement different transports -
stdio
,ipc
,socket
. Today, Oni only supportsstdio
To find a language server, check out langserver.org
Aside from language servers, there are other settings available for customizing languages in Oni:
-
language.<language-identifier>.completionTriggerCharacters
(string[]
) - an array of characters that can trigger completion. -
NOT IMPLEMENTED YET -
language.<language-identifier>.autoPairs
Bash language support is provided via the bash-language-server.
"language.bash.languageServer.command": "bash-language-server",
"language.bash.languageServer.arguments": ["start"],
C and C++ language support is set up by default to use clangd
, and expects clangd
available in your path.
- Get a working
clangd
(both code and executables are available here) - Make sure that
clangd
is available globally (for instance, by adding it to an environment variable)
For information on setting it up, please refer to the clangd documentation.
If you want code completion popups to appear when typing ->
and ::
, you can add the following to your Oni config
"language.cpp.completionTriggerCharacters": [".", ">", ":"],
Note that Oni only supports single trigger characters at the time of writing, so you may get spurious popups.
cquery is an alternative to clangd that supports more of the language server specification (at time of writing). You must pass a cache directory for it to use in the initialisation arguments.
"language.cpp.languageServer.command": "/path/to/cquery",
"language.cpp.languageServer.arguments": [
`--init={"cacheDirectory": "/tmp/cquery.cache"}`
],
"language.cpp.languageServer.rootFiles": ["compile_commands.json"]
ccls is a fork of cquery that promises to be more lightweight.
"language.cpp.languageServer.command": "/path/to/ccls",
"language.cpp.languageServer.rootFiles": ["compile_commands.json"]
C# language support is not configured by default, and requires the oni-language-csharp plugin, which provides language capabilities for both .NET and Mono.
Follow the installation instructions to get started.
Dart language support is provided via the dart_language_server.
"language.dart.languageServer.command": "dart_language_server",
Docker language support is provided via the dockerfile-language-server-nodejs.
"language.dockerfile.languageServer.command": "docker-langserver",
"language.dockerfile.languageServer.arguments": ["--stdio"],
Go language support depends on the go-langserver, which provides language support for Go. Follow their installation instructions as this language server is not bundled out-of-the-box with Oni.
go-langserver
must be available in your PATH. You can override this by setting thelanguage.go.languageServer.command
configuration value.
// language server configuration
"language.go.languageServer.rootFiles": [".git"], // In a git repository
"language.go.languageServer.command": "go-langserver",
"language.go.languageServer.arguments": ["--gocodecompletion", "--freeosmemory", "false"],
Haskell language support is provided via the haskell-ide-engine.
"language.haskell.languageServer.command": "hi",
"language.haskell.languageServer.arguments": ["--lsp"],
"language.haskell.languageServer.rootFiles": [".git"],
Java language support is provided via the eclipse.jdt.ls.
The lastest version can be found on this link. Decompress the file and put the folder on the PATH (for example C:\dev\jdt-language-server-latest
).
Configuration for Oni on Windows using Java 8:
"language.java.languageServer.command": "C:\\dev\\java\\jdk1.8.0_161_i586\\bin\\java",
"language.java.languageServer.arguments": [
"-Declipse.application=org.eclipse.jdt.ls.core.id1",
"-Dosgi.bundles.defaultStartLevel=4",
"-Declipse.product=org.eclipse.jdt.ls.core.product",
"-Dlog.level=NONE",
"-noverify",
"-Xmx1G",
"-jar",
"C:\\dev\\jdt-language-server-latest\\plugins\\org.eclipse.equinox.launcher_1.5.0.v20180207-1446.jar",
"-configuration",
"C:\\dev\\jdt-language-server-latest\\config_win",
"-data"
],
"language.java.languageServer.rootFiles": ["pom.xml"],
JavaScript and TypeScript support is enabled out-of-the-box using the TypeScript Standalone Server. No setup and configuration is necessary, however, you will get better results if you use a tsconfig.json
or a jsconfig.json
to structure your project.
If you would like to add flow support (a static type checker for javascript), you will need to add the flow-language-server,
This can be done by running yarn global add flow-language-server
or npm install -g flow-language-server
,
then adding the following lines to your oni config.js
'language.javascript.languageServer.command': 'flow-language-server',
'language.javascript.languageServer.arguments': ['--stdio'],
To add language support for vue
, the javascript framework and it's filetype,
you will need to complete the following steps.
- Run
npm install -g vue-language-server
- Add the following to your
config.js
'language.vue.languageServer.command':'vls'
Lua language support is provided via the lua-lsp.
"language.lua.languageServer.command": "lua-ls",
"language.lua.languageServer.rootFiles": [".git"],
Python language support depends on pyls, which provides language support for Python. Follow their installation instructions as this language server is not bundled out-of-the-box with Oni.
pyls
must be available in your PATH. You can override this by setting thelanguage.python.languageServer.command
configuration value.
Oni comes with ocaml-language-server
out-of-the-box, however, make sure you have the other pre-requisites installed and that merlin is configured properly.
Ruby language support is provided via solargraph.
"language.ruby.languageServer.command": "solargraph",
"language.ruby.languageServer.arguments": ["stdio"],
Rust language support is provided via the rls
an example configuration is
// Language Support - Rust
"language.rust.languageServer.command": "rustup",
"language.rust.languageServer.arguments": ["run", "stable", "rls"],
"language.rust.languageServer.rootFiles": ["Cargo.toml"],