From 1673c7322e164be6e936299a37fb685ae29a1480 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 10 Apr 2022 12:47:44 -0400 Subject: [PATCH] interactive go to def with autocomplete --- editor/init.fnl | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/editor/init.fnl b/editor/init.fnl index be4f4f8..68a661d 100644 --- a/editor/init.fnl +++ b/editor/init.fnl @@ -8,7 +8,7 @@ (let [ldoc core.active_view.doc (aline acol bline bcol) (ldoc:get_selection)] (if (and (= aline bline) (= acol bcol)) - (ldoc:get_text aline 1 aline 10000000) + (ldoc:get_text aline 1 aline math.huge) (ldoc:get_text aline acol bline bcol)))) (fn find-closest [s pattern i-target] @@ -16,7 +16,7 @@ (set (start end) (s:find pattern)) (while (and start (< end (- i-target 1))) (set (start end) (s:find pattern (+ end 1)))) - (if (<= start i-target) (values start end) + (if (and start (<= start i-target)) (values start end) (values 1 0))) (local symbol-pattern "[a-zA-Z%!%@%#%$%%%^%&%*%<%>%?%/%~%-%_%=%+][a-zA-Z%!%@%#%$%%%^%&%*%<%>%?%/%~%-%_%=%+0-9%.%:]*") @@ -24,7 +24,7 @@ (let [ldoc core.active_view.doc (aline acol bline bcol) (ldoc:get_selection)] (if (and (= aline bline) (= acol bcol)) - (let [line (ldoc:get_text aline 1 aline 10000000) + (let [line (ldoc:get_text aline 1 aline math.huge) (start end) (find-closest line symbol-pattern acol)] (ldoc:get_text aline start aline (+ end 1))) (ldoc:get_text aline acol bline bcol)))) @@ -54,23 +54,36 @@ filename (or filename "") filename (if (filename:find "^%.%.%.") "" (or (filename:match "^%./(.*)") filename)) line (tonumber (or line 0)) - doc (when (> (length filename) 0) (core.open_doc filename))] - (when doc - (core.root_view:open_doc doc) - (doc:set_selection line 1 line 1) + ldoc (when (> (length filename) 0) (core.open_doc filename))] + (when ldoc + (core.root_view:open_doc ldoc) + (ldoc:set_selection line 1 line 1) true)))) (core.log (.. "Unable to find symbol " symbol)))) (: (replsession.session) :submit (.. ",find " symbol) jump-to-find-result)) +(fn autocomplete-results [text] + (var result []) + (: (replsession.session) :submit (.. ",complete " text) #(set result (or $1.vals []))) + result) + +(fn autocomplete-symbol [callback ?starting-text] + (fn fixup-result [text] + (let [[completed-result] (autocomplete-results text)] + (callback (or completed-result text)))) + (core.command_view:enter "Symbol" fixup-result autocomplete-results) + (when ?starting-text (core.command_view:set_text ?starting-text))) + (command.add :core.docview { - "repl:eval" #(submit nil (selected-form)) - "repl:go-to-definition" #(go-to-definition (selected-symbol)) + "fennel:eval" #(submit nil (selected-form)) + "fennel:go-to-definition-under-cursor" #(go-to-definition (selected-symbol)) + "fennel:go-to-definition" #(autocomplete-symbol #(go-to-definition $1) (selected-symbol)) }) (keymap.add { :return "repl:submit" - "alt+e" "repl:eval" - "alt+d" "repl:go-to-definition" + "alt+e" "fennel:eval" + "alt+d" "fennel:go-to-definition-under-cursor" }) {: inline-eval : symbol-pattern}