(local au vim.api.nvim_create_autocmd)
(local m vim.keymap.set)

(fn Treesitter_config []
  (let [prefix (.. vim.env.HOME "/.local/share/nvim/runtime/queries/")]
    (if (and (> (length vim.o.filetype) 0) (vim.uv.fs_stat (.. prefix vim.o.filetype)))
        (vim.treesitter.start))))

(au ["VimEnter"]
    { :callback
      #(let [session (.. vim.env.HOME "/.cache/nvim/")]
         (when (vim.uv.fs_stat session)
           (vim.cmd.source session)
           (vim.fs.rm session))) })

(au ["UIEnter"]
    { :callback
      #((require "map")
        (vim.cmd.shada)
        (if (= 0 (vim.fn.argc))
            (vim.cmd.term "nu")
            (vim.cmd.normal "g`\""))) })

(au ["FileType"]
    { :callback Treesitter_config })

(au ["CmdLineEnter"]
    { :callback
      #(require "cdtrack")
      :once true })

(au ["TextYankPost"]
    { :callback
      #(if (= "" vim.v.event.regname)
           (vim.fn.setreg vim.v.event.operator (vim.fn.getreg)))})

(au ["CmdWinEnter"]
    { :callback
      #((m "n" "<ESC>" "<cmd>q!<CR>" { :buffer true })
        (tset vim :bo :filetype "vim")) })

(au ["BufWinEnter"]
    { :pattern "COMMIT_EDITMSG"
      :callback
      #(icollect [i s (ipairs (vim.fn.systemlist "git diff --cached"))]
         (vim.fn.append (- i 1) (.. "# " s)))})

(au ["BufWritePre"]
    { :callback
      #(let [dir (vim.fn.expand :<afile>:p:h)
             f   (io.open dir :r)]
         (if f
             (f:close)
             (vim.fn.mkdir dir :p)))})

(au ["VimLeave"] { :command "wshada" })

nil