mirror of
https://github.com/elkowar/dots-of-war.git
synced 2024-11-06 03:12:24 +00:00
more stuff
This commit is contained in:
parent
c9c69c5ca9
commit
ee5ba5034a
5 changed files with 119 additions and 40 deletions
|
@ -7,25 +7,61 @@
|
||||||
ts nvim-treesitter}
|
ts nvim-treesitter}
|
||||||
require-macros [macros]})
|
require-macros [macros]})
|
||||||
|
|
||||||
|
(defn in-range [lines r1 c1 r2 c2]
|
||||||
|
(var res [])
|
||||||
|
(for [i r1 r2]
|
||||||
|
(let [line (. lines (+ i 1))
|
||||||
|
trimmed-line (line:sub (if (= r1 i) (+ c1 1) 1)
|
||||||
|
(if (= r2 i) (+ c2 1) -1))]
|
||||||
|
(table.insert res trimmed-line)))
|
||||||
|
res)
|
||||||
|
|
||||||
|
(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)
|
||||||
|
file-content (vim.api.nvim_buf_get_lines 0 0 -1 false)
|
||||||
|
node-text (str.join "\n" (in-range file-content r1 c1 r2 (- c2 1)))]
|
||||||
|
(match name
|
||||||
|
:key (set last-module node-text)
|
||||||
|
:value (tset modules last-module node-text))))
|
||||||
|
modules))
|
||||||
|
|
||||||
|
|
||||||
(defn get-current-word []
|
(defn get-current-word []
|
||||||
(let [col (. (vim.api.nvim_win_get_cursor 0) 2)
|
(let [col (. (vim.api.nvim_win_get_cursor 0) 2)
|
||||||
line (vim.api.nvim_get_current_line)]
|
line (vim.api.nvim_get_current_line)]
|
||||||
(.. (vim.fn.matchstr (string.sub line 1 (+ col 1))
|
(.. (vim.fn.matchstr (line:sub 1 (+ col 1))
|
||||||
"\\k*$")
|
"\\k*$")
|
||||||
(string.sub ( vim.fn.matchstr (string.sub line (+ col 1))
|
(string.sub (vim.fn.matchstr (line:sub (+ col 1))
|
||||||
"^\\k*")
|
"^\\k*")
|
||||||
2))))
|
2))))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(def helpfiles-path (str.join "/" (a.butlast (str.split vim.o.helpfile "/"))))
|
(def helpfiles-path (str.join "/" (a.butlast (str.split vim.o.helpfile "/"))))
|
||||||
|
|
||||||
(def tags
|
(def tags
|
||||||
(let [entries {}]
|
(var entries {})
|
||||||
(each [line _ (io.lines (.. helpfiles-path "/tags"))]
|
(each [line _ (io.lines (.. helpfiles-path "/tags"))]
|
||||||
(let [[key file address] (str.split line "\t")]
|
(let [[key file address] (str.split line "\t")]
|
||||||
(tset entries key {:file (.. helpfiles-path "/" file) :address address})))
|
(tset entries key {:file (.. helpfiles-path "/" file) :address address})))
|
||||||
entries))
|
entries)
|
||||||
|
|
||||||
(defn find-help-tag-for [topic]
|
(defn find-help-tag-for [topic]
|
||||||
(or (. tags topic)
|
(or (. tags topic)
|
||||||
|
@ -53,10 +89,10 @@
|
||||||
(lua "return data")))))
|
(lua "return data")))))
|
||||||
|
|
||||||
(defn pop [text ft]
|
(defn pop [text ft]
|
||||||
(var width 0)
|
"Open a popup with the given text and filetype"
|
||||||
|
(var width 20)
|
||||||
(each [_ line (ipairs text)]
|
(each [_ line (ipairs text)]
|
||||||
(when (> (length line) width)
|
(set width (math.max width (length line))))
|
||||||
(set width (length line))))
|
|
||||||
(let [bufnr (vim.api.nvim_create_buf false true)]
|
(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 :bufhidden "wipe")
|
||||||
(vim.api.nvim_buf_set_option bufnr :filetype ft)
|
(vim.api.nvim_buf_set_option bufnr :filetype ft)
|
||||||
|
@ -65,15 +101,15 @@
|
||||||
|
|
||||||
|
|
||||||
(fn _G.get_help []
|
(fn _G.get_help []
|
||||||
(let [help-tag (find-help-tag-for (get-current-word))]
|
(if-let [help-tag (find-help-tag-for (get-current-word))]
|
||||||
(when help-tag
|
(pop (help-for-tag help-tag) :help)))
|
||||||
(pop (help-for-tag help-tag) :help))))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(def all-module-paths
|
(def all-module-paths
|
||||||
(let [paths (str.split package.path ";")]
|
(do
|
||||||
|
(var paths (str.split package.path ";"))
|
||||||
(each [_ path (ipairs (str.split vim.o.runtimepath ","))]
|
(each [_ path (ipairs (str.split vim.o.runtimepath ","))]
|
||||||
(table.insert paths (.. path "/fnl/?.fnl"))
|
(table.insert paths (.. path "/fnl/?.fnl"))
|
||||||
(table.insert paths (.. path "/fnl/?/init.fnl"))
|
(table.insert paths (.. path "/fnl/?/init.fnl"))
|
||||||
|
@ -95,25 +131,29 @@
|
||||||
all-module-paths)))
|
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]
|
(defn read-module-file [module-name]
|
||||||
(let [path (find-module-path module-name)]
|
"Given the name of a module, returns two values:
|
||||||
(when path
|
the lines of the file that matched a given module
|
||||||
(let [ft (match (string.gsub path ".+%.(%w+)" "%1")
|
and the filetype of that module"
|
||||||
:fnl "fennel"
|
(if-let [path (find-module-path module-name)]
|
||||||
:lua "lua")
|
(let [ft (get-filetype path)
|
||||||
result (icollect [line _ (io.lines path)]
|
result (icollect [line _ (io.lines path)] line)]
|
||||||
line)]
|
(values result ft))))
|
||||||
(values result ft)))))
|
|
||||||
|
|
||||||
|
|
||||||
(defn gib-definition [mod word]
|
(defn find-definition-fnl [lines symbol]
|
||||||
(let [(file-lines filetype) (read-module-file mod)
|
(let [query (vim.treesitter.parse_query
|
||||||
query (vim.treesitter.parse_query
|
"fennel"
|
||||||
filetype
|
(.. "((identifier) @symbol-name (#contains? @symbol-name \"" symbol "\"))"))
|
||||||
(.. "((identifier) @fuck (#contains? @fuck \"" word "\"))"))
|
|
||||||
bufnr (vim.api.nvim_create_buf false true)]
|
bufnr (vim.api.nvim_create_buf false true)]
|
||||||
(vim.api.nvim_buf_set_lines bufnr 0 -1 true file-lines)
|
(vim.api.nvim_buf_set_lines bufnr 0 -1 true lines)
|
||||||
(let [parser (vim.treesitter.get_parser bufnr filetype)
|
(let [parser (vim.treesitter.get_parser bufnr "fennel")
|
||||||
[tstree] (parser:parse)
|
[tstree] (parser:parse)
|
||||||
tsnode (tstree:root)
|
tsnode (tstree:root)
|
||||||
code-lines []]
|
code-lines []]
|
||||||
|
@ -121,21 +161,25 @@
|
||||||
(let [parent (node:parent)
|
(let [parent (node:parent)
|
||||||
(r1 c1 r2 c2) (parent:range)]
|
(r1 c1 r2 c2) (parent:range)]
|
||||||
(for [i (+ r1 1) r2]
|
(for [i (+ r1 1) r2]
|
||||||
(table.insert code-lines (. file-lines i)))))
|
(table.insert code-lines (. lines i)))))
|
||||||
(pop code-lines filetype))))
|
code-lines)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(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)
|
||||||
|
definition-lines (find-definition-fnl module-lines word)]
|
||||||
|
(pop definition-lines module-ft)))
|
||||||
|
|
||||||
(fn _G.gib_def []
|
(fn _G.gib_def []
|
||||||
(let [word (get-current-word)
|
(let [word (get-current-word)
|
||||||
segs (str.split word "%.")]
|
segs (utils.split-last word ".")]
|
||||||
(match segs
|
(match segs
|
||||||
[mod ident]
|
[mod ident]
|
||||||
(gib-definition mod ident)
|
(gib-definition mod ident)
|
||||||
|
|
||||||
[ident]
|
[ident]
|
||||||
(let [[current-file] (str.split (vim.fn.expand "%:t") "%.")]
|
(let [[current-file] (utils.split-last (vim.fn.expand "%:t") ".")]
|
||||||
(gib-definition current-file ident)))))
|
(gib-definition current-file ident)))))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,11 @@
|
||||||
(let [,l# (. data# i#)
|
(let [,l# (. data# i#)
|
||||||
,r# (. data# (+ i# 1))]
|
,r# (. data# (+ i# 1))]
|
||||||
,...)))))
|
,...)))))
|
||||||
|
|
||||||
|
:if-let
|
||||||
|
(fn [[name value] ...]
|
||||||
|
`(let [,name ,value]
|
||||||
|
(when ,name ,...)))
|
||||||
|
|
||||||
:packer-use
|
:packer-use
|
||||||
(fn [...]
|
(fn [...]
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
:JoosepAlviste/nvim-ts-context-commentstring {}
|
:JoosepAlviste/nvim-ts-context-commentstring {}
|
||||||
:nvim-treesitter/nvim-treesitter {:mod "plugins.treesitter"
|
:nvim-treesitter/nvim-treesitter {:mod "plugins.treesitter"
|
||||||
:run ":TSUpdate"}
|
:run ":TSUpdate"}
|
||||||
|
:nvim-treesitter/playground {}
|
||||||
|
|
||||||
; :code-biscuits/nvim-biscuits {} ; show opening line after closing curly
|
; :code-biscuits/nvim-biscuits {} ; show opening line after closing curly
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,26 @@
|
||||||
; Might fuck with gitsigns
|
; Might fuck with gitsigns
|
||||||
;:rainbow {:enable true
|
;:rainbow {:enable true
|
||||||
;:extended_mode true}
|
;:extended_mode true}
|
||||||
:context_commentstring {:enable true}})
|
:context_commentstring {:enable true}
|
||||||
|
|
||||||
|
:playground
|
||||||
|
{:enable true
|
||||||
|
:disable {}
|
||||||
|
:updatetime 25 ; Debounced time for highlighting nodes in the playground from source code
|
||||||
|
:persist_queries false ; Whether the query persists across vim sessions
|
||||||
|
:keybindings
|
||||||
|
{:toggle_query_editor "o"
|
||||||
|
:toggle_hl_groups "i"
|
||||||
|
:toggle_injected_languages "t"
|
||||||
|
:toggle_anonymous_nodes "a"
|
||||||
|
:toggle_language_display "I"
|
||||||
|
:focus_language "f"
|
||||||
|
:unfocus_language "F"
|
||||||
|
:update "R"
|
||||||
|
:goto_node "<cr>"
|
||||||
|
:show_help "?"}}})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;:indent {:enable true}
|
;:indent {:enable true}
|
||||||
;:disable ["lua"]
|
;:disable ["lua"]
|
||||||
|
|
|
@ -24,6 +24,16 @@
|
||||||
(values k v))))
|
(values k v))))
|
||||||
|
|
||||||
|
|
||||||
|
(defn split-last [s sep]
|
||||||
|
"split a string at the last occurrence of a separator"
|
||||||
|
(for [i (length s) 1 -1]
|
||||||
|
(let [c (s:sub i i)]
|
||||||
|
(when (= sep c)
|
||||||
|
(let [left (s:sub 1 (- i 1))
|
||||||
|
right (s:sub (+ i 1))]
|
||||||
|
(lua "return { left, right }")))))
|
||||||
|
[s])
|
||||||
|
|
||||||
(defn find-where [pred xs]
|
(defn find-where [pred xs]
|
||||||
(each [_ x (ipairs xs)]
|
(each [_ x (ipairs xs)]
|
||||||
(when (pred x)
|
(when (pred x)
|
||||||
|
|
Loading…
Reference in a new issue