(local mysnip {})
(local M {})
(local map vim.keymap.set)

(fn M.set-snip [sn]
  (tset mysnip sn.abbr sn.snip))

(fn M.setup-keymap []
  (map :i :<tab>
       #(let [[row col] (vim.api.nvim_win_get_cursor 0)]
          (if (= 0 col)
              :<tab>
              (let [newpos [row (- col 1)]
                    cword (vim.fn.expand :<cword>)
                    snip (. mysnip cword)]
                (vim.api.nvim_win_set_cursor 0 newpos)
                (if snip
                    (.. "<esc>ciw<cmd>lua vim.snippet.expand'" (snip:gsub "\n" "\\n") "'<cr>")
                    (do (vim.api.nvim_win_set_cursor 0 curpos)
                        (if (vim.snippet.active { :direction 1 })
                            "<cmd>lua vim.snippet.jump(1)"
                            "<tab>"))))))
       { :expr true })

  (map [:i :s] :<s-tab>
       #(if (vim.snippet.active { :direction 1 })
            (vim.snippet.jump -1)
            :<s-tab>)
       { :expr true }))

M