languageserver: An implementation of the Language Server Protocol for R
languageserver
is an implement of the Microsoft's Language Server Protocol for the language of R.
It is released on CRAN and can be easily installed by
install.packages("languageserver")
The development version of languageserver
could be installed by running the following in R
source("https://install-github.me/REditorSupport/languageserver")
Rmarkdown
The R package knitr
is required to enable languageserver for Rmarkdown files. languageserver
doesn't specify knitr
as a dependency however, users may need to install it manually.
Language Clients
These editors are supported by installing the corresponding package.
VSCode: vscode-r-lsp
Atom: atom-ide-r
Sublime Text: R-IDE
Vim/NeoVim: LanguageClient-neovim with settings
let g:LanguageClient_serverCommands = {
\ 'r': ['R', '--slave', '-e', 'languageserver::run()'],
\ }
- EMacs: lsp-mode with settings
(lsp-register-client
(make-lsp-client :new-connection
(lsp-stdio-connection '("R" "--slave" "-e" "languageserver::run()"))
:major-modes '(ess-r-mode inferior-ess-r-mode)
:server-id 'lsp-R))
Services Implemented
languageserver
is still under active development, the following services have been implemented:
- textDocumentSync (diagnostics)
- hoverProvider
- completionProvider
- signatureHelpProvider
- definitionProvider
- referencesProvider
- documentHighlightProvider
- documentSymbolProvider
- workspaceSymbolProvider
- codeActionProvider
- codeLensProvider
- documentFormattingProvider
- documentRangeFormattingProvider
- documentOnTypeFormattingProvider
- renameProvider
- documentLinkProvider
- executeCommandProvider
FAQ
Linters
With lintr master branch, the linters can be specified by creating the .lintr
file at the project or home directory. Details can be found at lintr documentation.
Until a new version of lintr is released, you could consider the following settings in .Rprofile
:
setHook(
packageEvent("languageserver", "onLoad"),
function(...) {
options(languageserver.default_linters = lintr::with_defaults(
line_length_linter = lintr::line_length_linter(100),
object_usage_linter = NULL
))
}
)