diff options
| author | Florian Fischer <gitlab@muhq.space> | 2023-07-22 12:38:09 +0000 |
|---|---|---|
| committer | Florian Fischer <gitlab@muhq.space> | 2023-07-22 12:38:09 +0000 |
| commit | 1b0968ef3901d9b03a8c3eb4d9299c1816bd59e5 (patch) | |
| tree | 33af6eddfa820b314f6dbf36b76aec728d0a3378 | |
| parent | 6637e395bc8518aa54cc007abd5efe16edfa8d5c (diff) | |
| parent | dcbe70a0cb96639f402f3d7982547906a6dcf82a (diff) | |
| download | vis-lspc-1b0968ef3901d9b03a8c3eb4d9299c1816bd59e5.tar.gz vis-lspc-1b0968ef3901d9b03a8c3eb4d9299c1816bd59e5.zip | |
Merge branch 'check-modified' into 'main'v0.1.9
Check modified
See merge request muhq/vis-lspc!41
| -rw-r--r-- | init.lua | 166 |
1 files changed, 87 insertions, 79 deletions
@@ -307,85 +307,6 @@ local function lsp_range_to_vis_range(win, lsp_range) return {start = start_pos, finish = finish_pos} end --- open a doc_pos using the vis command <cmd> -local function vis_open_doc_pos(doc_pos, cmd, win) - if win and win ~= vis.win then - vis.win = win - end - assert(cmd) - if vis.win.file.path ~= doc_pos.file then - vis:command(string.format('%s \'%s\'', cmd, doc_pos.file)) - vis.win.selection:to(doc_pos.line, doc_pos.col) - vis:command('lspc-open') - else - vis.win.selection:to(doc_pos.line, doc_pos.col) - end -end - --- Support jumping between document positions --- Stack of edited document positions -local doc_pos_history = {} - -local function vis_push_doc_pos(win) - local old_doc_pos = vis_get_doc_pos(win) - table.insert(doc_pos_history, old_doc_pos) -end - --- open a new doc_pos remembering the old if it is replaced -local function vis_open_new_doc_pos(doc_pos, cmd, win) - win = win or vis.win - if cmd == 'e' then - vis_push_doc_pos(win) - end - - vis_open_doc_pos(doc_pos, cmd, win) -end - -local function vis_pop_doc_pos(win) - local last_doc_pos = table.remove(doc_pos_history) - if not last_doc_pos then - return 'Document history is empty' - end - - vis_open_doc_pos(last_doc_pos, 'e', win) -end - --- apply a textEdit received from the language server -local function vis_apply_textEdit(win, file, textEdit) - assert(win.file == file) - - local range = lsp_range_to_vis_range(win, textEdit.range) - - file:delete(range) - file:insert(range.start, textEdit.newText) - - win.selection.anchored = false - win.selection.pos = range.start + string.len(textEdit.newText) - - win:draw() -end - --- apply a list of textEdits received from the language server -local function vis_apply_textEdits(win, file, textEdits) - assert(win.file == file) - - local edits = {} - for _, textEdit in ipairs(textEdits) do - local range = lsp_range_to_vis_range(win, textEdit.range) - table.insert(edits, { - mark = file:mark_set(range.start), - len = range.finish - range.start, - newText = textEdit.newText, - }) - end - for _, edit in ipairs(edits) do - local pos = file:mark_get(edit.mark) - file:delete(pos, edit.len) - file:insert(pos, edit.newText) - end - win:draw() -end - -- concatenate all numeric values in choices and pass it on stdin to lspc.menu_cmd local function lspc_select(choices) local menu_input = '' @@ -478,6 +399,93 @@ local function lspc_confirm(prompt) return choice == 'yes' end +-- open a doc_pos using the vis command <cmd> +local function vis_open_doc_pos(doc_pos, cmd, win) + if win and win ~= vis.win then + vis.win = win + end + assert(cmd) + if vis.win.file.path ~= doc_pos.file then + if vis.win.file.modified and cmd == 'e' then + if lspc_confirm('Save currently open file:') then + vis:command('w') + else + vis:info('Not opening new file, current file has unsaved changes') + return + end + end + vis:command(string.format('%s \'%s\'', cmd, doc_pos.file)) + vis.win.selection:to(doc_pos.line, doc_pos.col) + vis:command('lspc-open') + else + vis.win.selection:to(doc_pos.line, doc_pos.col) + end +end + +-- Support jumping between document positions +-- Stack of edited document positions +local doc_pos_history = {} + +local function vis_push_doc_pos(win) + local old_doc_pos = vis_get_doc_pos(win) + table.insert(doc_pos_history, old_doc_pos) +end + +-- open a new doc_pos remembering the old if it is replaced +local function vis_open_new_doc_pos(doc_pos, cmd, win) + win = win or vis.win + if cmd == 'e' then + vis_push_doc_pos(win) + end + + vis_open_doc_pos(doc_pos, cmd, win) +end + +local function vis_pop_doc_pos(win) + local last_doc_pos = table.remove(doc_pos_history) + if not last_doc_pos then + return 'Document history is empty' + end + + vis_open_doc_pos(last_doc_pos, 'e', win) +end + +-- apply a textEdit received from the language server +local function vis_apply_textEdit(win, file, textEdit) + assert(win.file == file) + + local range = lsp_range_to_vis_range(win, textEdit.range) + + file:delete(range) + file:insert(range.start, textEdit.newText) + + win.selection.anchored = false + win.selection.pos = range.start + string.len(textEdit.newText) + + win:draw() +end + +-- apply a list of textEdits received from the language server +local function vis_apply_textEdits(win, file, textEdits) + assert(win.file == file) + + local edits = {} + for _, textEdit in ipairs(textEdits) do + local range = lsp_range_to_vis_range(win, textEdit.range) + table.insert(edits, { + mark = file:mark_set(range.start), + len = range.finish - range.start, + newText = textEdit.newText, + }) + end + for _, edit in ipairs(edits) do + local pos = file:mark_get(edit.mark) + file:delete(pos, edit.len) + file:insert(pos, edit.newText) + end + win:draw() +end + -- apply a WorkspaceEdit received from the language server local function vis_apply_workspaceEdit(_, _, workspaceEdit) local file_edits = workspaceEdit.changes |
