(import-macros {: foreach} :macros)
(local au vim.api.nvim_create_autocmd)
(local map vim.keymap.set)

(local pluginOptions (require :plugindata))

(fn Load_plugin [plugname]
  (when (. pluginOptions plugname)
    (let [url (.. "https://github.com/" plugname)
          p (partial . pluginOptions plugname)
          { : modname : opts : callback : dependencies } p]
      (when dependencies
        (each [_ dep (ipairs dependencies)]
          (Load_plugin dep)))
      (vim.pack.add [url])
      (when opts ((. (require modname) :setup) opts))
      (when callback (callback))
      (tset pluginOptions plugname nil))))

(au [:UIEnter]
    { :callback
      #(foreach Load_plugin
                [:folke/flash.nvim
                 :gbprod/substitute.nvim
                 :kylechui/nvim-surround
                 :andersecenrud/nvim_context_vt])})

(map :n :^a
     #((Load_plugin :zbirenbaum/copilot.lua)
       (let [sug (require :copilot.suggestion)]
         (map :n :^a sug.toggle_auto_trigger)
         (sug.toggle_auto_trigger))))

(map :n :g/
     #((Load_plugin :nvim-telescope/telescope.nvim)
       (let [tb (require :telescope.builtin)]
         (map :n :g/ tb.live_grep)
         (tb.live_grep))))

(map :n :m
     #((Load_plugin :niuiic/track.nvim)
       (vim.keymap.del :n :m)
       (vim.fn.feedkeys :m)))

(map :n :<a-n>
     #((Load_plugin :SmiteshP/nvim-navbuddy)
       (map :n :<a-n> vim.cmd.Navbuddy)
       (vim.cmd.Navbuddy)))

(fn Load_cmdln []
  (require :command)
  (require :fzf)
  (Load_plugin :stevearc/oil.nvim))

(au [:CmdlineEnter]
    { :once true
      :callback Load_cmdln })

(au [:InsertEnter :CmdlineEnter]
    { :once true
      :callback
      #(Load_plugin :altermo/ultimate-autopair.nvim)})

(au [:CursorMoved]
    { :once true
      :callback
      #((Load_plugin :mini.indentscope)
        (Load_plugin :utilyre/sentiment.nvim)
        (Load_plugin :hadronized/hop.nvim))})