-
Notifications
You must be signed in to change notification settings - Fork 40
Editor specific configuration
Giuseppe Lomurno edited this page Dec 15, 2021
·
17 revisions
The idris2-nvim plugin provides a default, but completely customizable, configuration for the LSP server and some Idris2 specific commands and UIs.
Requirements, use your favourite package manager (packer.nvim can track the dependencies automatically):
- https://github.com/neovim/nvim-lspconfig
- https://github.com/edwinb/idris2-vim (for syntax only)
Add the following lines of code to your neovim configuration, note that the code is wrapped in Lua << EOF <code> EOF. This is the syntax to inline arbitrary Lua code into Vimscript.
lua << EOF
local lspconfig = require('lspconfig')
-- Flag to enable semantic highlightning on start, if false you have to issue a first command manually
local autostart_semantic_highlightning = true
lspconfig.idris2_lsp.setup {
on_new_config = function(new_config, new_root_dir)
new_config.capabilities['workspace']['semanticTokens'] = {refreshSupport = true}
end,
on_attach = function(client)
if autostart_semantic_highlightning then
vim.lsp.buf_request(0, 'textDocument/semanticTokens/full',
{textDocument = vim.lsp.util.make_text_document_params()}, nil)
end
-- Example of how to request a single kind of code action with a keymap,
-- refer to the table in the README for the appropriate key for each command.
vim.cmd [[nnoremap <Leader>cs <Cmd>lua vim.lsp.buf.code_action({diagnostics={},only={"refactor.rewrite.CaseSplit"}})<CR>]]
--custom_attach(client) -- remove this line if you don't have a customized attach function
end,
autostart = true,
handlers = {
['workspace/semanticTokens/refresh'] = function(err, params, ctx, config)
if autostart_semantic_highlightning then
vim.lsp.buf_request(0, 'textDocument/semanticTokens/full',
{ textDocument = vim.lsp.util.make_text_document_params() }, nil)
end
return vim.NIL
end,
['textDocument/semanticTokens/full'] = function(err, result, ctx, config)
-- temporary handler until native support lands
local bufnr = ctx.bufnr
local client = vim.lsp.get_client_by_id(ctx.client_id)
local legend = client.server_capabilities.semanticTokensProvider.legend
local token_types = legend.tokenTypes
local data = result.data
local ns = vim.api.nvim_create_namespace('nvim-lsp-semantic')
vim.api.nvim_buf_clear_namespace(bufnr, ns, 0, -1)
local tokens = {}
local prev_line, prev_start = nil, 0
for i = 1, #data, 5 do
local delta_line = data[i]
prev_line = prev_line and prev_line + delta_line or delta_line
local delta_start = data[i + 1]
prev_start = delta_line == 0 and prev_start + delta_start or delta_start
local token_type = token_types[data[i + 3] + 1]
local line = vim.api.nvim_buf_get_lines(bufnr, prev_line, prev_line + 1, false)[1]
local byte_start = vim.str_byteindex(line, prev_start)
local byte_end = vim.str_byteindex(line, prev_start + data[i + 2])
vim.api.nvim_buf_add_highlight(bufnr, ns, 'LspSemantic_' .. token_type, prev_line, byte_start, byte_end)
end
end
},
}
-- Set here your preferred colors for semantic values
vim.cmd [[highlight link LspSemantic_type Include]] -- Type constructors
vim.cmd [[highlight link LspSemantic_function Identifier]] -- Functions names
vim.cmd [[highlight link LspSemantic_enumMember Number]] -- Data constructors
vim.cmd [[highlight LspSemantic_variable guifg=gray]] -- Bound variables
vim.cmd [[highlight link LspSemantic_keyword Structure]] -- Keywords
vim.cmd [[highlight link LspSemantic_namespace Identifier]] -- Explicit namespaces
vim.cmd [[highlight link LspSemantic_postulate Define]] -- Postulates
vim.cmd [[highlight link LspSemantic_module Identifier]] -- Module identifiers
-- Add the following command to a mapping if you want to send a manual request for semantic highlight
-- :lua vim.lsp.buf_request(0, 'textDocument/semanticTokens/full', {textDocument = vim.lsp.util.make_text_document_params()}, nil)
EOFRefer to: https://github.com/bamboo/idris2-lsp-vscode
Add the following code to ~/.doom.d/config.el:
(use-package! idris-mode
:mode ("\\.l?idr\\'" . idris-mode)
:config
(after! lsp-mode
(add-to-list 'lsp-language-id-configuration '(idris-mode . "idris2"))
(lsp-register-client
(make-lsp-client
:new-connection (lsp-stdio-connection "idris2-lsp")
:major-modes '(idris-mode)
:server-id 'idris2-lsp))
)
;; (setq lsp-semantic-tokens-enable t) ;; Optionally enable semantic tokens
(add-hook 'idris-mode-hook #'lsp!)
)And add this to ~/.doom.d/packages.el:
(package! idris-mode :recipe (:host github :repo "idris-hackers/idris-mode"))