From 48a5537c6823274e4a8e46499e71f998f3fb0a87 Mon Sep 17 00:00:00 2001 From: Kyle Grierson Date: Tue, 15 Aug 2023 10:33:27 +0100 Subject: [PATCH] fix --- fnl/formedit/find.fnl | 42 +++++++++++++++++++++++++ fnl/formedit/init.fnl | 7 +++++ fnl/formedit/insertion.fnl | 25 +++++++++++++++ fnl/formedit/select.fnl | 45 ++++----------------------- fnl/formedit/wrap.fnl | 18 +++++++++++ fnl/spec/delete_around_spec.fnl | 4 +-- fnl/spec/insertion_spec.fnl | 43 ++++++++++++++++++++++++++ fnl/spec/wrap_spec.fnl | 21 +++++++++++++ lua/formedit/find.lua | 33 ++++++++++++++++++++ lua/formedit/init.lua | 6 ++++ lua/formedit/insertion.lua | 37 ++++++++++++++++++++++ lua/formedit/select.lua | 43 +++++--------------------- lua/formedit/wrap.lua | 26 ++++++++++++++++ lua/spec/delete_around_spec.lua | 4 +-- lua/spec/insertion_spec.lua | 55 +++++++++++++++++++++++++++++++++ lua/spec/wrap_spec.lua | 28 +++++++++++++++++ 16 files changed, 359 insertions(+), 78 deletions(-) create mode 100644 fnl/formedit/find.fnl create mode 100644 fnl/formedit/init.fnl create mode 100644 fnl/formedit/insertion.fnl create mode 100644 fnl/formedit/wrap.fnl create mode 100644 fnl/spec/insertion_spec.fnl create mode 100644 fnl/spec/wrap_spec.fnl create mode 100644 lua/formedit/find.lua create mode 100644 lua/formedit/init.lua create mode 100644 lua/formedit/insertion.lua create mode 100644 lua/formedit/wrap.lua create mode 100644 lua/spec/insertion_spec.lua create mode 100644 lua/spec/wrap_spec.lua diff --git a/fnl/formedit/find.fnl b/fnl/formedit/find.fnl new file mode 100644 index 0000000..c0fc29b --- /dev/null +++ b/fnl/formedit/find.fnl @@ -0,0 +1,42 @@ +(local ts (require :nvim-treesitter.ts_utils)) + +(local forms {:list_lit true + :vec_lit true + :map_lit true + :set_lit true + :anon_fn_lit true}) + +(local start-offset {:list_lit 0 + :vec_lit 0 + :map_lit 0 + :set_lit 1 + :anon_fn_lit 1}) + +(local insert-offset {:list_lit 1 + :vec_lit 1 + :map_lit 1 + :set_lit 2 + :anon_fn_lit 2}) + +;; Tree search +(fn find-current-form [node] + (if (. forms (node:type)) + node + (let [parent (node:parent)] + (when parent (find-current-form parent))))) + +(fn find-root-form [node] + (if (node:parent) + (find-root-form (node:parent)) + node)) + +;; Find node +(fn form [] + (let [node (ts.get_node_at_cursor)] + (find-current-form node))) + +(fn root [] + (let [node (ts.get_node_at_cursor)] + (find-root-form node))) + +{: form : root : insert-offset : start-offset} diff --git a/fnl/formedit/init.fnl b/fnl/formedit/init.fnl new file mode 100644 index 0000000..6f71a78 --- /dev/null +++ b/fnl/formedit/init.fnl @@ -0,0 +1,7 @@ + +(local find (require :formedit.find)) +(local insertion (require :formedit.insertion)) +(local select (require :formedit.select)) +(local wrap (require :formedit.wrap)) + +{: find : insertion : select : wrap} diff --git a/fnl/formedit/insertion.fnl b/fnl/formedit/insertion.fnl new file mode 100644 index 0000000..9ffd2ce --- /dev/null +++ b/fnl/formedit/insertion.fnl @@ -0,0 +1,25 @@ +(local find (require :formedit.find)) + +(fn range [form] + (let [[start-row start-col end-row end-col] [(form:range)]] + [(+ start-row 1) start-col (+ end-row 1) end-col])) + +(fn head [] + (let [form (find.form) + start-offset (. find.start-offset (form:type)) + insert-offset (. find.insert-offset (form:type)) + [start-row start-col _ _] (range form)] + (vim.api.nvim_win_set_cursor 0 [start-row (+ start-col start-offset)]) + (vim.api.nvim_command "normal! a ") + (vim.api.nvim_win_set_cursor 0 [start-row (+ start-col insert-offset)]) + (vim.api.nvim_feedkeys :i :n true))) + +(fn tail [] + (let [form (find.form) + [_ _ end-row end-col] (range form)] + (vim.api.nvim_win_set_cursor 0 [end-row (- end-col 1)]) + (vim.api.nvim_command "normal! i ") + (vim.api.nvim_win_set_cursor 0 [end-row end-col]) + (vim.api.nvim_feedkeys :i :n true))) + +{: head : tail} diff --git a/fnl/formedit/select.fnl b/fnl/formedit/select.fnl index 86bff60..d57d274 100644 --- a/fnl/formedit/select.fnl +++ b/fnl/formedit/select.fnl @@ -1,45 +1,12 @@ (local ts (require :nvim-treesitter.ts_utils)) +(local find (require :formedit.find)) -(local forms {:list_lit true - :vec_lit true - :map_lit true - :set_lit true - :anon_fn_lit true}) - -;; Tree search -(fn find-current-form [node] - (if (. forms (node:type)) - node - (let [parent (node:parent)] - (when parent (find-current-form parent))))) - -(fn find-root-form [node] - (if (node:parent) - (find-root-form (node:parent)) - node)) - -;; Find node -(fn get-current-form [] - (let [node (ts.get_node_at_cursor)] - (find-current-form node))) - -(fn get-current-root-form [] - (let [node (ts.get_node_at_cursor)] - (find-root-form node))) - -; (fn get-inner-form [] -; (let [form (get-current-form) -; [open-row open-col] [(: (. (form:field :open) 1) :end_)] -; [end-row end-col] [(: (. (form:field :close) 1) :start)]] -; [open-row open-col end-row end-col])) - -;; Select node -(fn select-form [] - (let [form (get-current-form)] +(fn form [] + (let [form (find.form)] (ts.update_selection 0 form))) -(fn select-root-form [] - (let [form (get-current-root-form)] +(fn root [] + (let [form (find.root)] (ts.update_selection 0 form))) -{: get-current-form : select-form : select-root-form} +{: form : root} diff --git a/fnl/formedit/wrap.fnl b/fnl/formedit/wrap.fnl new file mode 100644 index 0000000..4786dfa --- /dev/null +++ b/fnl/formedit/wrap.fnl @@ -0,0 +1,18 @@ +(local find (require :formedit.find)) + +(fn range [form] + (let [[start-row start-col end-row end-col] [(form:range)]] + [(+ start-row 1) start-col (+ end-row 1) end-col])) + +(fn head [] + (let [form (find.form) + insert-offset (. find.insert-offset (form:type)) + [start-row start-col end-row end-col] (range form)] + (vim.api.nvim_win_set_cursor 0 [end-row end-col]) + (vim.api.nvim_command "normal! i)") + (vim.api.nvim_win_set_cursor 0 [start-row start-col]) + (vim.api.nvim_command "normal! i( ") + (vim.api.nvim_win_set_cursor 0 [start-row (+ start-col insert-offset)]) + (vim.api.nvim_feedkeys :i :n true))) + +{: head} diff --git a/fnl/spec/delete_around_spec.fnl b/fnl/spec/delete_around_spec.fnl index b92f5aa..915319a 100644 --- a/fnl/spec/delete_around_spec.fnl +++ b/fnl/spec/delete_around_spec.fnl @@ -5,7 +5,7 @@ (describe "delete around" (fn [] (before_each (fn [] - (vim.keymap.set :o :af select.select-form))) + (vim.keymap.set :o :af select.form))) (it :list (fn [] (h.setup {:content "(1)" :cursor [1 1]}) @@ -45,7 +45,7 @@ (describe "delete around root" (fn [] (before_each (fn [] - (vim.keymap.set :o :aF select.select-root-form))) + (vim.keymap.set :o :aF select.root))) (it "cursor at head of form deletes root" (fn [] (h.setup {:content "(+ 1 (+ 2 3))" :cursor [1 0]}) diff --git a/fnl/spec/insertion_spec.fnl b/fnl/spec/insertion_spec.fnl new file mode 100644 index 0000000..dadaeea --- /dev/null +++ b/fnl/spec/insertion_spec.fnl @@ -0,0 +1,43 @@ +(local {: describe : it : before_each} (require :plenary.busted)) +(local h (require :spec.helper)) +(local insertion (require :formedit.insertion)) + +(local head-keymap :h) +(local tail-keymap :t) + +(describe "head insertion" + (fn [] + (before_each (fn [] + (set vim.g.maplocalleader ",") + (vim.keymap.set :n head-keymap insertion.head))) + (it :form + (fn [] + (h.setup {:content "(1)" :cursor [1 0]}) + (h.feedkeys head-keymap) + (h.expect {:content "( 1)" :cursor [1 1]}))) + (it :set + (fn [] + (h.setup {:content "#{1}" :cursor [1 0]}) + (h.feedkeys head-keymap) + (h.expect {:content "#{ 1}" :cursor [1 2]}))) + (it "sub form" + (fn [] + (h.setup {:content "(1 (2))" :cursor [1 3]}) + (h.feedkeys head-keymap) + (h.expect {:content "(1 ( 2))" :cursor [1 4]}))))) + +(describe "tail insertion" + (fn [] + (before_each (fn [] + (set vim.g.maplocalleader ",") + (vim.keymap.set :n tail-keymap insertion.tail))) + (it :form + (fn [] + (h.setup {:content "(1)" :cursor [1 0]}) + (h.feedkeys tail-keymap) + (h.expect {:content "(1 )" :cursor [1 2]}))) + (it :sub + (fn [] + (h.setup {:content "(1 (2))" :cursor [1 4]}) + (h.feedkeys tail-keymap) + (h.expect {:content "(1 (2 ))" :cursor [1 5]}))))) diff --git a/fnl/spec/wrap_spec.fnl b/fnl/spec/wrap_spec.fnl new file mode 100644 index 0000000..d8f4842 --- /dev/null +++ b/fnl/spec/wrap_spec.fnl @@ -0,0 +1,21 @@ +(local {: describe : it : before_each} (require :plenary.busted)) +(local h (require :spec.helper)) +(local wrap (require :formedit.wrap)) + +(local keymap :i) + +(describe :wrap + (fn [] + (before_each (fn [] + (set vim.g.maplocalleader keymap) + (vim.keymap.set :n keymap wrap.head))) + (it "form head" + (fn [] + (h.setup {:content "(1)" :cursor [1 0]}) + (h.feedkeys keymap) + (h.expect {:content "( (1))" :cursor [1 1]}))) + (it "sub form" + (fn [] + (h.setup {:content "(1 (2))" :cursor [1 4]}) + (h.feedkeys keymap) + (h.expect {:content "(1 ( (2)))" :cursor [1 4]}))))) diff --git a/lua/formedit/find.lua b/lua/formedit/find.lua new file mode 100644 index 0000000..427460f --- /dev/null +++ b/lua/formedit/find.lua @@ -0,0 +1,33 @@ +-- [nfnl] Compiled from fnl/formedit/find.fnl by https://github.com/Olical/nfnl, do not edit. +local ts = require("nvim-treesitter.ts_utils") +local forms = {list_lit = true, vec_lit = true, map_lit = true, set_lit = true, anon_fn_lit = true} +local start_offset = {list_lit = 0, vec_lit = 0, map_lit = 0, set_lit = 1, anon_fn_lit = 1} +local insert_offset = {list_lit = 1, vec_lit = 1, map_lit = 1, set_lit = 2, anon_fn_lit = 2} +local function find_current_form(node) + if forms[node:type()] then + return node + else + local parent = node:parent() + if parent then + return find_current_form(parent) + else + return nil + end + end +end +local function find_root_form(node) + if node:parent() then + return find_root_form(node:parent()) + else + return node + end +end +local function form() + local node = ts.get_node_at_cursor() + return find_current_form(node) +end +local function root() + local node = ts.get_node_at_cursor() + return find_root_form(node) +end +return {form = form, root = root, ["insert-offset"] = insert_offset, ["start-offset"] = start_offset} diff --git a/lua/formedit/init.lua b/lua/formedit/init.lua new file mode 100644 index 0000000..8cb5c5b --- /dev/null +++ b/lua/formedit/init.lua @@ -0,0 +1,6 @@ +-- [nfnl] Compiled from fnl/formedit/init.fnl by https://github.com/Olical/nfnl, do not edit. +local find = require("formedit.find") +local insertion = require("formedit.insertion") +local select = require("formedit.select") +local wrap = require("formedit.wrap") +return {find = find, insertion = insertion, select = select, wrap = wrap} diff --git a/lua/formedit/insertion.lua b/lua/formedit/insertion.lua new file mode 100644 index 0000000..6c71648 --- /dev/null +++ b/lua/formedit/insertion.lua @@ -0,0 +1,37 @@ +-- [nfnl] Compiled from fnl/formedit/insertion.fnl by https://github.com/Olical/nfnl, do not edit. +local find = require("formedit.find") +local function range(form) + local _let_1_ = {form:range()} + local start_row = _let_1_[1] + local start_col = _let_1_[2] + local end_row = _let_1_[3] + local end_col = _let_1_[4] + return {(start_row + 1), start_col, (end_row + 1), end_col} +end +local function head() + local form = find.form() + local start_offset = (find["start-offset"])[form:type()] + local insert_offset = (find["insert-offset"])[form:type()] + local _let_2_ = range(form) + local start_row = _let_2_[1] + local start_col = _let_2_[2] + local _ = _let_2_[3] + local _0 = _let_2_[4] + vim.api.nvim_win_set_cursor(0, {start_row, (start_col + start_offset)}) + vim.api.nvim_command("normal! a ") + vim.api.nvim_win_set_cursor(0, {start_row, (start_col + insert_offset)}) + return vim.api.nvim_feedkeys("i", "n", true) +end +local function tail() + local form = find.form() + local _let_3_ = range(form) + local _ = _let_3_[1] + local _0 = _let_3_[2] + local end_row = _let_3_[3] + local end_col = _let_3_[4] + vim.api.nvim_win_set_cursor(0, {end_row, (end_col - 1)}) + vim.api.nvim_command("normal! i ") + vim.api.nvim_win_set_cursor(0, {end_row, end_col}) + return vim.api.nvim_feedkeys("i", "n", true) +end +return {head = head, tail = tail} diff --git a/lua/formedit/select.lua b/lua/formedit/select.lua index 5924df3..f469f00 100644 --- a/lua/formedit/select.lua +++ b/lua/formedit/select.lua @@ -1,39 +1,12 @@ -- [nfnl] Compiled from fnl/formedit/select.fnl by https://github.com/Olical/nfnl, do not edit. local ts = require("nvim-treesitter.ts_utils") -local forms = {list_lit = true, vec_lit = true, map_lit = true, set_lit = true, anon_fn_lit = true} -local function find_current_form(node) - if forms[node:type()] then - return node - else - local parent = node:parent() - if parent then - return find_current_form(parent) - else - return nil - end - end +local find = require("formedit.find") +local function form() + local form0 = find.form() + return ts.update_selection(0, form0) end -local function find_root_form(node) - if node:parent() then - return find_root_form(node:parent()) - else - return node - end +local function root() + local form0 = find.root() + return ts.update_selection(0, form0) end -local function get_current_form() - local node = ts.get_node_at_cursor() - return find_current_form(node) -end -local function get_current_root_form() - local node = ts.get_node_at_cursor() - return find_root_form(node) -end -local function select_form() - local form = get_current_form() - return ts.update_selection(0, form) -end -local function select_root_form() - local form = get_current_root_form() - return ts.update_selection(0, form) -end -return {["get-current-form"] = get_current_form, ["select-form"] = select_form, ["select-root-form"] = select_root_form} +return {form = form, root = root} diff --git a/lua/formedit/wrap.lua b/lua/formedit/wrap.lua new file mode 100644 index 0000000..aaf27cb --- /dev/null +++ b/lua/formedit/wrap.lua @@ -0,0 +1,26 @@ +-- [nfnl] Compiled from fnl/formedit/wrap.fnl by https://github.com/Olical/nfnl, do not edit. +local find = require("formedit.find") +local function range(form) + local _let_1_ = {form:range()} + local start_row = _let_1_[1] + local start_col = _let_1_[2] + local end_row = _let_1_[3] + local end_col = _let_1_[4] + return {(start_row + 1), start_col, (end_row + 1), end_col} +end +local function head() + local form = find.form() + local insert_offset = (find["insert-offset"])[form:type()] + local _let_2_ = range(form) + local start_row = _let_2_[1] + local start_col = _let_2_[2] + local end_row = _let_2_[3] + local end_col = _let_2_[4] + vim.api.nvim_win_set_cursor(0, {end_row, end_col}) + vim.api.nvim_command("normal! i)") + vim.api.nvim_win_set_cursor(0, {start_row, start_col}) + vim.api.nvim_command("normal! i( ") + vim.api.nvim_win_set_cursor(0, {start_row, (start_col + insert_offset)}) + return vim.api.nvim_feedkeys("i", "n", true) +end +return {head = head} diff --git a/lua/spec/delete_around_spec.lua b/lua/spec/delete_around_spec.lua index 613e0c0..49f7871 100644 --- a/lua/spec/delete_around_spec.lua +++ b/lua/spec/delete_around_spec.lua @@ -7,7 +7,7 @@ local h = require("spec.helper") local select = require("formedit.select") local function _2_() local function _3_() - return vim.keymap.set("o", "af", select["select-form"]) + return vim.keymap.set("o", "af", select.form) end before_each(_3_) local function _4_() @@ -56,7 +56,7 @@ end describe("delete around", _2_) local function _11_() local function _12_() - return vim.keymap.set("o", "aF", select["select-root-form"]) + return vim.keymap.set("o", "aF", select.root) end before_each(_12_) local function _13_() diff --git a/lua/spec/insertion_spec.lua b/lua/spec/insertion_spec.lua new file mode 100644 index 0000000..d914da1 --- /dev/null +++ b/lua/spec/insertion_spec.lua @@ -0,0 +1,55 @@ +-- [nfnl] Compiled from fnl/spec/insertion_spec.fnl by https://github.com/Olical/nfnl, do not edit. +local _local_1_ = require("plenary.busted") +local describe = _local_1_["describe"] +local it = _local_1_["it"] +local before_each = _local_1_["before_each"] +local h = require("spec.helper") +local insertion = require("formedit.insertion") +local head_keymap = "h" +local tail_keymap = "t" +local function _2_() + local function _3_() + vim.g.maplocalleader = "," + return vim.keymap.set("n", head_keymap, insertion.head) + end + before_each(_3_) + local function _4_() + h.setup({content = "(1)", cursor = {1, 0}}) + h.feedkeys(head_keymap) + return h.expect({content = "( 1)", cursor = {1, 1}}) + end + it("form", _4_) + local function _5_() + h.setup({content = "#{1}", cursor = {1, 0}}) + h.feedkeys(head_keymap) + return h.expect({content = "#{ 1}", cursor = {1, 2}}) + end + it("set", _5_) + local function _6_() + h.setup({content = "(1 (2))", cursor = {1, 3}}) + h.feedkeys(head_keymap) + return h.expect({content = "(1 ( 2))", cursor = {1, 4}}) + end + return it("sub form", _6_) +end +describe("head insertion", _2_) +local function _7_() + local function _8_() + vim.g.maplocalleader = "," + return vim.keymap.set("n", tail_keymap, insertion.tail) + end + before_each(_8_) + local function _9_() + h.setup({content = "(1)", cursor = {1, 0}}) + h.feedkeys(tail_keymap) + return h.expect({content = "(1 )", cursor = {1, 2}}) + end + it("form", _9_) + local function _10_() + h.setup({content = "(1 (2))", cursor = {1, 4}}) + h.feedkeys(tail_keymap) + return h.expect({content = "(1 (2 ))", cursor = {1, 5}}) + end + return it("sub", _10_) +end +return describe("tail insertion", _7_) diff --git a/lua/spec/wrap_spec.lua b/lua/spec/wrap_spec.lua new file mode 100644 index 0000000..8131b2f --- /dev/null +++ b/lua/spec/wrap_spec.lua @@ -0,0 +1,28 @@ +-- [nfnl] Compiled from fnl/spec/wrap_spec.fnl by https://github.com/Olical/nfnl, do not edit. +local _local_1_ = require("plenary.busted") +local describe = _local_1_["describe"] +local it = _local_1_["it"] +local before_each = _local_1_["before_each"] +local h = require("spec.helper") +local wrap = require("formedit.wrap") +local keymap = "i" +local function _2_() + local function _3_() + vim.g.maplocalleader = keymap + return vim.keymap.set("n", keymap, wrap.head) + end + before_each(_3_) + local function _4_() + h.setup({content = "(1)", cursor = {1, 0}}) + h.feedkeys(keymap) + return h.expect({content = "( (1))", cursor = {1, 1}}) + end + it("form head", _4_) + local function _5_() + h.setup({content = "(1 (2))", cursor = {1, 4}}) + h.feedkeys(keymap) + return h.expect({content = "(1 ( (2)))", cursor = {1, 4}}) + end + return it("sub form", _5_) +end +return describe("wrap", _2_)