diff --git a/files/.config/nvim/fnl/fennel-definition.fnl b/files/.config/nvim/fnl/fennel-definition.fnl deleted file mode 100644 index 67e8841..0000000 --- a/files/.config/nvim/fnl/fennel-definition.fnl +++ /dev/null @@ -1,189 +0,0 @@ -(module fennel-definition - {require {utils utils - a aniseed.core - str aniseed.string - fennel aniseed.fennel - popup popup - ts nvim-treesitter} - require-macros [macros]}) - -(def- query-module-header - (vim.treesitter.parse_query - "fennel" - "(function_call - name: (identifier) @module-header-name (#eq? @module-header-name \"module\") - (identifier) @module-name - (table ((identifier) @import-type - (table ((identifier) @key (_) @value)*) - )* - ) - )")) - -(defn read-module-imports-fnl [bufnr] - (let [parser (vim.treesitter.get_parser bufnr "fennel") - [tstree] (parser:parse) - tsnode (tstree:root)] - (var last-module nil) - (var modules {}) - (each [id node metadata (query-module-header:iter_captures tsnode bufnr 0 -1)] - (let [name (. query-module-header.captures id) - (r1 c1 r2 c2) (node:range) - node-text (vim.treesitter.get_node_text node 0)] - (match name - :key (set last-module node-text) - :value (tset modules last-module node-text)))) - modules)) - -(defn get-current-word [] - (let [col (. (vim.api.nvim_win_get_cursor 0) 2) - line (vim.api.nvim_get_current_line)] - (.. (vim.fn.matchstr (line:sub 1 (+ col 1)) - "\\k*$") - (string.sub (vim.fn.matchstr (line:sub (+ col 1)) - "^\\k*") - 2)))) - -(defn pop [text ft] - "Open a popup with the given text and filetype" - (var width 20) - (each [_ line (ipairs text)] - (set width (math.max width (length line)))) - (let [bufnr (vim.api.nvim_create_buf false true)] - (vim.api.nvim_buf_set_option bufnr :bufhidden "wipe") - (vim.api.nvim_buf_set_option bufnr :filetype ft) - (vim.api.nvim_buf_set_lines bufnr 0 -1 true text) - (popup.create bufnr {:padding [1 1 1 1] :width width}))) - - -(def all-module-paths - (do - (var paths (str.split package.path ";")) - (each [_ path (ipairs (str.split vim.o.runtimepath ","))] - (table.insert paths (.. path "/fnl/?.fnl")) - (table.insert paths (.. path "/fnl/?/init.fnl")) - (table.insert paths (.. path "/lua/?.lua")) - (table.insert paths (.. path "/lua/?/init.lua"))) - paths)) - - -(defn file-exists? [path] - (let [file (io.open path :r)] - (if (~= nil file) - (do (io.close file) - true) - false))) - -(defn find-module-path [module-name] - (let [module-name (module-name:gsub "%." "/")] - (utils.find-map #(utils.keep-if file-exists? ($1:gsub "?" module-name)) - all-module-paths))) - - -(defn get-filetype [filename] - "Return the filetype given a files name" - (match (utils.split-last filename ".") - [_ :fnl] "fennel" - [_ :lua] "lua")) - -(defn read-module-file [module-name] - "Given the name of a module, returns two values: - the lines of the file that matched a given module - and the filetype of that module" - (if-let [path (find-module-path module-name)] - (let [ft (get-filetype path) - result (icollect [line _ (io.lines path)] line)] - (values result ft)))) - -;(defn make-def-query [symbol]) - ;(vim.treesitter.parse_query - ;"fennel" - ;(.. "(function_call - ;name: (identifier) @fn-name (#eq? @fn-name \"defn\") - ;(identifier) @symbol-name (#contains? @symbol-name \"" symbol "\"))"))) -(defn make-def-query [symbol] - (vim.treesitter.parse_query - "fennel" - (.. "(function_call - name: (identifier) - (identifier) @symbol-name (#contains? @symbol-name \"" symbol "\"))"))) - - -(defn create-buf-with [lines visible] - "create a buffer and fill it with the given lines" - (let [bufnr (vim.api.nvim_create_buf visible true)] - (vim.api.nvim_buf_set_lines bufnr 0 -1 true lines) - bufnr)) - -(defn find-definition-node-fnl [lines symbol] - (let [query (make-def-query symbol) - bufnr (create-buf-with lines false) - parser (vim.treesitter.get_parser bufnr "fennel") - [tstree] (parser:parse) - tsnode (tstree:root)] - (each [id node metadata (query:iter_captures tsnode bufnr 0 -1)] - (let [name (. query.captures id)] - (when (= name "symbol-name") - (lua "return node")))))) - -(defn find-definition-str-fnl [lines symbol] - (if-let [node (find-definition-node-fnl lines symbol)] - (let [parent (node:parent) - (r1 c1 r2 c2) (parent:range)] - (var code-lines []) - (for [i (+ r1 1) r2] - (table.insert code-lines (. lines i))) - code-lines))) - - - -(defn goto-definition [mod word] - (let [imports (read-module-imports-fnl 0) - actual-mod (or (. imports mod) mod) - (module-lines module-ft) (read-module-file actual-mod)] - (if-let [node (find-definition-node-fnl module-lines word)] - (let [parent (node:parent) - (r1 c1 r2 c2) (parent:range) - bufnr (create-buf-with module-lines true)] - (vim.api.nvim_buf_set_option bufnr :filetype module-ft) - (vim.cmd (.. "buffer " bufnr)) - (vim.fn.cursor (+ r1 1) c1))))) - - - - -(defn gib-definition [mod word] - (let [imports (read-module-imports-fnl 0) - actual-mod (or (. imports mod) mod) - (module-lines module-ft) (read-module-file actual-mod)] - (if-let [definition-lines (find-definition-str-fnl module-lines word)] - (pop definition-lines module-ft)))) - -(fn _G.gib_def [goto] - (xpcall - (fn [] - (let [word (get-current-word) - segs (utils.split-last word ".")] - (match segs - [mod ident] - (if goto - (goto-definition mod ident) - (gib-definition mod ident)) - - - [ident] - (let [[current-file] (utils.split-last (vim.fn.expand "%:t") ".")] - (if goto - (goto-definition current-file ident) - (gib-definition current-file ident)))))) - #(print (fennel.traceback $1)))) - - - ;(gib-definition "help-thingy" (ident))) -(utils.keymap :n :MN ":call v:lua.gib_def(v:false)") -(utils.keymap :n :MM ":call v:lua.gib_def(v:true)") - -; vim.api.nvim_buf_get_name -; vim.api.nvim_buf_call -; vim.api.nvim_buf_set_text -; vim.api.nvim_buf_set_var -; vim.fn.bufnr diff --git a/files/.config/nvim/fnl/init.fnl b/files/.config/nvim/fnl/init.fnl index 1b4d555..ed660ff 100644 --- a/files/.config/nvim/fnl/init.fnl +++ b/files/.config/nvim/fnl/init.fnl @@ -4,7 +4,8 @@ a aniseed.core str aniseed.string fennel aniseed.fennel - colors colors} + colors colors + gehzu nvim-gehzu} require-macros [macros]}) (macro make-errors-epic [f] @@ -71,6 +72,8 @@ ; Auto-close quickfix list when element is selected) (vim.cmd "autocmd! FileType qf nnoremap :cclose") +(vim.cmd "autocmd! TextYankPost * silent! lua vim.highlight.on_yank {higroup=\"IncSearch\", timeout=300}") + ; foldend ; Colors ------------------------------------------------------- foldstart @@ -139,6 +142,7 @@ ; :: autoclose empty unnamed buffers ----------------------------------------------- foldstart + (fn _G.clean_no_name_empty_buffers [] (let [bufs (a.filter #(and (a.empty? (vim.fn.bufname $1)) (< (vim.fn.bufwinnr $1) 0) @@ -153,4 +157,9 @@ ; foldend + + +(vim.cmd + "command! -nargs=1 L :lua print(vim.inspect())") + ; vim:foldmarker=foldstart,foldend diff --git a/files/.config/nvim/fnl/keybinds.fnl b/files/.config/nvim/fnl/keybinds.fnl index 1d4966c..b22716b 100644 --- a/files/.config/nvim/fnl/keybinds.fnl +++ b/files/.config/nvim/fnl/keybinds.fnl @@ -18,6 +18,9 @@ (utils.keymap :v :K "") +(utils.keymap :n :MM "lua require('nvim-gehzu').go_to_definition()" {}) +(utils.keymap :n :MN "lua require('nvim-gehzu').show_definition()" {}) + ; TODO let's see if i want these ; (utils.keymap :n : "") diff --git a/files/.config/nvim/fnl/plugins.fnl b/files/.config/nvim/fnl/plugins.fnl index bd382b6..0059ecd 100644 --- a/files/.config/nvim/fnl/plugins.fnl +++ b/files/.config/nvim/fnl/plugins.fnl @@ -3,6 +3,8 @@ require-macros [macros]}) (packer-use + "/home/leon/coding/projects/nvim-gehzu" {} + :gruvbox-community/gruvbox {:opt false :config #(vim.cmd "colorscheme gruvbox")} @@ -73,7 +75,6 @@ :Olical/conjure {} :tami5/compe-conjure {:requires [:Olical/conjure]} - :machakann/vim-highlightedyank {} :ciaranm/detectindent {:mod "plugins.detect-indent"} :pechorin/any-jump.vim {} :justinmk/vim-sneak {:mod "plugins.sneak"}