(local au vim.api.nvim_create_autocmd)
(local snip (require "snippet"))

(fn quickeval [cmd]
  (let [range (. (require "utils") :get-visual-selection)
        start range.start
        end_ range.end_
        content (vim.fn.getregion start end_ { :type (vim.fn.mode 1) })
        tmpfilename (.. "/tmp/nvim-ftplugin." (vim.fn.expand "%:e"))
        file (assert io.open tmpfilename "w")]
    (each [_ line (ipairs content)]
      (file:write (.. line "\n")))
    (file:close)
    (vim.cmd (.. "vert term" cmd tmpfilename))
    (vim.cmd.startinsert)))

(au "FileType"
    { :callback
      (lambda [ev]
        (let [ft ev.match
              [ok ftp] (pcall require (.. "ftplugin." ft))]
          (when ok
              (when ftp.lsp
                  (set ftp.lsp.on_attach (. (require "lsp") :on-attach))
                  (: (vim.uv.new_async (vim.schedule_wrap #(vim.lsp.start ftp.lsp))) :send))
              (if ftp.quickeval_cmd
                  (vim.keymap.set "v" "x" #(quickeval ftp.quickeval_cmd)))
              (if ftp.callback
                  (ftp.callback))
              (when ftp.snippet
                  (snip.setup_keymap)
                  (each [_ sn (ipairs ftp.snippet)]
                    (snip.set_snip sn)))))) })

nil