73 lines
3 KiB
Text
73 lines
3 KiB
Text
|
;; Based on https://github.com/nvim-lua/lsp-status.nvim
|
||
|
(let [mod {}
|
||
|
current-function-symbols {:Class ""
|
||
|
:Enum "ﴳ"
|
||
|
:Function ""
|
||
|
:Interface ""
|
||
|
:Method ""
|
||
|
:Module ""
|
||
|
:Namespace ""
|
||
|
:Package ""
|
||
|
:Struct "ﴳ"}
|
||
|
lsp-proto vim.lsp.protocol
|
||
|
set-bufvar vim.api.nvim_buf_set_var
|
||
|
augroup (vim.api.nvim_create_augroup :NifocLsp {:clear true})
|
||
|
aucmd vim.api.nvim_create_autocmd]
|
||
|
(fn extract-symbols [acc items]
|
||
|
(if (= items nil)
|
||
|
acc
|
||
|
(do
|
||
|
(each [_ item (ipairs items)]
|
||
|
(local kind (or (. lsp-proto.SymbolKind item.kind) :Unknown))
|
||
|
(var sym-range nil)
|
||
|
(if item.location (set sym-range item.location.range)
|
||
|
item.range (set sym-range item.range))
|
||
|
(when sym-range
|
||
|
(do
|
||
|
(set sym-range.start.line (+ sym-range.start.line 1))
|
||
|
(set sym-range.end.line (+ sym-range.end.line 1))))
|
||
|
(table.insert acc {:range sym-range : kind :text item.name})
|
||
|
(when item.children
|
||
|
(extract-symbols item.children acc)))
|
||
|
acc)))
|
||
|
|
||
|
(fn current-function-symbol? [item]
|
||
|
(and item.range (not= (. current-function-symbols item.kind) nil)))
|
||
|
|
||
|
(fn cursor-in-range? [cursor sym]
|
||
|
(let [line (. cursor 1)
|
||
|
char (. cursor 2)]
|
||
|
(if (or (< line sym.start.line) (> line sym.end.line)) false
|
||
|
(and (= line sym.start.line) (< char sym.start.character)) false
|
||
|
(and (= line sym.end.line) (> char sym.end.character)) false
|
||
|
true)))
|
||
|
|
||
|
(fn handle-update-current-context [err result ctx config]
|
||
|
(set-bufvar ctx.bufnr :nifoc_lsp_current_context "")
|
||
|
(when (and (= err nil) (= (type result) :table))
|
||
|
(let [filtered-symbols (->> result (extract-symbols [])
|
||
|
(vim.tbl_filter current-function-symbol?))
|
||
|
cursor-pos (vim.api.nvim_win_get_cursor 0)]
|
||
|
(for [i (length filtered-symbols) 1 -1]
|
||
|
(local sym (. filtered-symbols i))
|
||
|
(when (cursor-in-range? cursor-pos sym.range)
|
||
|
(let [current-context (.. (. current-function-symbols sym.kind) " "
|
||
|
sym.text)]
|
||
|
(set-bufvar ctx.bufnr :nifoc_lsp_current_context current-context)))))))
|
||
|
|
||
|
(fn update-current-context [bufnr]
|
||
|
(let [params {:textDocument (vim.lsp.util.make_text_document_params bufnr)}]
|
||
|
(vim.lsp.buf_request bufnr :textDocument/documentSymbol params
|
||
|
handle-update-current-context)))
|
||
|
|
||
|
(fn mod.on-attach [client bufnr]
|
||
|
(when client.server_capabilities.documentSymbolProvider
|
||
|
(aucmd [:CursorHold]
|
||
|
{:callback #(update-current-context bufnr)
|
||
|
:buffer bufnr
|
||
|
:group augroup
|
||
|
:desc "Update current function variable"})))
|
||
|
|
||
|
mod)
|
||
|
|