aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2024-04-12 11:10:17 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2024-04-12 11:10:17 +0200
commit05c733a806993b6cd3601587d4655811c1c771c0 (patch)
treea8922f9bfe2795fb783210d5bb2e0c86d0dc0244
parentefaf185f4368aeb04de0b851f76b5bad020804e7 (diff)
downloadvis-lspc-05c733a806993b6cd3601587d4655811c1c771c0.tar.gz
vis-lspc-05c733a806993b6cd3601587d4655811c1c771c0.zip
make the way messages are presented configurableshow-message
The two options are either using vis:message (the default) which will keep all messages in the vis message buffer and include a header line to distinguish the different messages. The second option is using open and presenting messages in a separate window supporting syntax highlighting.
-rw-r--r--README.md2
-rw-r--r--init.lua63
-rw-r--r--lspc.lua4
3 files changed, 41 insertions, 28 deletions
diff --git a/README.md b/README.md
index 27905b3..0a9a370 100644
--- a/README.md
+++ b/README.md
@@ -138,6 +138,8 @@ Available options are:
* `highlight_diagnostics = 'line'` - highlight the `range` or `line`number of available diagnostics
* `workspace_edit_remember_cursor = true` - restore the primary cursor position after a workspaceEdit
* `diagnostic_styles = { error = 'back:red', warning = 'back:yellow', information = 'back:yellow', hint = 'back:yellow', }` - styles used to highlight different diagnostics
+* `show_message = 'message'` - how to present information. `'message`: use `vis:message`; `'open'`: use a new window supporting syntax highlighting.
+* `message_level = 3` - the level of shown messages retrieved via `window/showMessage` notifications
#### Configure your own Language Server
diff --git a/init.lua b/init.lua
index 8347899..eaadc1b 100644
--- a/init.lua
+++ b/init.lua
@@ -501,11 +501,21 @@ local function vis_apply_textEdits(win, file, textEdits)
win:draw()
end
-local function _show_message(msg)
- vis:command("open")
+local function lspc_show_message(msg, hdr, syntax)
+ if lspc.show_message == 'message' then
+ vis:message((hdr or '') .. msg)
+
+ elseif lspc.show_message == 'open' then
+ vis:command('open')
+ if syntax then
+ vis:command('set syntax ' .. syntax)
+ end
- vis.win.file:insert(0, msg)
- vis.win.selection.pos = 0
+ vis.win.file:insert(0, msg)
+ vis.win.selection.pos = 0
+ else
+ lspc_err('invalid message configuration "' .. lspc.show_message .. '".')
+ end
end
-- apply a WorkspaceEdit received from the language server
@@ -534,7 +544,7 @@ local function vis_apply_workspaceEdit(_, _, workspaceEdit)
end
end
- _show_message(summary)
+ lspc_show_message(summary)
vis:redraw()
-- get user confirmation
@@ -829,14 +839,6 @@ local function lspc_handle_completion_method_response(win, result, old_pos)
lspc_err('Unsupported completion')
end
-local function _show_markdown_message(msg)
- vis:command("open")
- vis:command("set syntax markdown")
-
- vis.win.file:insert(0, msg)
- vis.win.selection.pos = 0
-end
-
local function lspc_handle_hover_method_response(win, result, old_pos)
if not result or not result.contents then
lspc_warn('no hover available')
@@ -845,27 +847,30 @@ local function lspc_handle_hover_method_response(win, result, old_pos)
local sel = vis_pos_to_sel(win, old_pos)
+ local hover_header =
+ '--- hover: ' .. (win.file.path or '') .. ': ' .. sel.line .. ', ' .. sel.col .. ' ---\n'
+ local hover_msg = ''
+ -- The most common markup kind in LSP is markdown
+ local markup_kind = 'markdown'
+
-- result is MarkedString[]
if type(result.contents) == 'table' and #result.contents > 0 then
lspc.log('hover returned list of length ' .. #result.contents)
- local hover_header = '--- hover: ' .. (win.file.path or '') .. ': ' .. sel.line .. ', ' .. sel.col .. ' ---'
- local hover_msg = ''
-
- for i, v in ipairs(result.contents) do
+ for i, marked_string in ipairs(result.contents) do
if i == 1 then
- hover_msg = v.value or v
+ hover_msg = marked_string.value or marked_string
else
- hover_msg = hover_msg .. '\n---\n' .. (v.value or v)
+ hover_msg = hover_msg .. '\n---\n' .. (marked_string.value or marked_string)
end
end
-
- _show_message(hover_header .. '\n' .. hover_msg)
- -- result is either MarkedString or MarkupContent
- else
- _show_markdown_message(result.contents.value or result.contents)
+ else -- result is either MarkedString or MarkupContent
+ hover_msg = result.contents.value or result.contents
+ if result.contents.kind and result.contents.kind == 'plaintext' then
+ markup_kind = 'text'
+ end
end
-
+ lspc_show_message(hover_msg, hover_header, markup_kind)
end
local function lspc_handle_signature_help_method_response(win, result, call_pos)
@@ -878,7 +883,7 @@ local function lspc_handle_signature_help_method_response(win, result, call_pos)
local sel = vis_pos_to_sel(win, call_pos)
local help_header = '--- signature help: ' .. (win.file.path or '') .. ': ' .. sel.line .. ', ' ..
- sel.col .. ' ---'
+ sel.col .. ' ---\n'
-- local help_msg = json.encode(result)
local help_msg = ''
@@ -890,7 +895,9 @@ local function lspc_handle_signature_help_method_response(win, result, call_pos)
end
help_msg = help_msg .. '\n' .. sig_msg
end
- _show_message(help_header .. help_msg)
+ -- strip first new line from the message
+ help_msg = help_msg:sub(2)
+ lspc_show_message(help_msg, help_header)
end
local function lspc_handle_rename_method_response(win, result)
@@ -1398,7 +1405,7 @@ local function lspc_show_diagnostic(ls, win, line)
end
if diagnostics_msg ~= '' then
- _show_message(diagnostics_msg)
+ lspc_show_message(diagnostics_msg)
else
lspc_warn('No diagnostics available for line: ' .. line)
end
diff --git a/lspc.lua b/lspc.lua
index 1af21a5..d45811b 100644
--- a/lspc.lua
+++ b/lspc.lua
@@ -50,6 +50,10 @@ local lspc = {
-- message level to show in the UI when receiving messages from the server
-- Error = 1, Warning = 2, Info = 3, Log = 4
message_level = 3,
+
+ -- How to present messages to the user.
+ -- 'message': use vis:message; 'open': use a new split window allowing for syntax highlighting
+ show_message = 'message',
}
--