(import-macros {: foreach : foreachMulti} :macros)
(local map vim.keymap.set)
(local submode (require :submode))
(tset vim :g :mapleader " ")

(fn smart-gf []
  (let [fpath (vim.fn.expand "<cfile>")]
    (if (not= "https://" (fpath:sub 1 8))
        (vim.cmd.normal "gF")
        (do
          (vim.cmd.term (.. "w3m " fpath))
          (vim.cmd.startinsert)))))

(fn smart-i []
  (if (: (vim.fn.getline ".") :match "^ *$")
      (vim.api.nvim_input "\"_cc")
      (vim.cmd.startinsert)))

(foreachMulti (partial map :n)
  [[:<BS>      :<c-b>]
   [:<delete>  :<c-f>]
   [:<c-s-e>   :5<c-e>]
   [:<c-s-y>   :5<c-y>]
   [:i         smart-i]
   [:S         :c^]
   [:Q         :ZZ { :noremap true }]
   [:ZZ        #(do (vim.cmd.mksession (.. vim.env.HOME "/.cache/nvim/session.nvim")) (vim.cmd.wqa))]
   [:gk        :25k]
   [:gj        :25j]
   [:gf        smart-gf]
   [:gb        vim.cmd.bnext]
   [:gB        vim.cmd.bprev]
   [:^n        #(tset vim :o :number (not vim.o.number))]
   [:^r        #(tset vim :o :relativenumber (not vim.o.relativenumber))]
   [:^s        #(tset vim :o :spell (not vim.o.spell))]
   [:<c-z>     :<cmd>w<CR><c-z>]
   [:zS        vim.show_pos]
   ])

(foreachMulti (partial map [:n :v])
  [["q;" :q:]
   ])

(foreachMulti (partial map [:n :v :o])
  [[:K :5k]
   [:J :5j]
   [:gl :$l]
   [:gh :^]
   ["]b" "])"]
   ["[b" "[("]
   ["]B" "]}"]
   ["[B" "[{"]
   ])

(foreachMulti (partial map "i")
  [[:<esc> :<right><esc>]
   ])

(foreachMulti (partial map "v")
  [[:v :<c-v>]
   [:aa :VggoG]
   ])

(foreachMulti (partial map "o")
  [[:. :i>]
   [:iq "i'"]
   [:iQ "i\""]
   [:aq "a'"]
   [:aQ "a\""]
   [:i<space> :iW]
   [:a<space> :aW]
   ])

(foreachMulti (partial map "t")
  [[:<c-\\> :<c-\\><c-n>]
   ])

(submode.set-submode-keymap "n" "g"
  [{ :key "t" }
   { :key "T" }
   { :key "e" }
   { :key "E" }
   { :key "J" }
   ])

(submode.set-submode-keymap "n" "d"
  [{ :key "h" }
   { :key "l" }
   ])

(submode.set-submode-keymap "n" "<c-w>"
  [{ :key ">" }
   { :key "<" }
   { :key "+" }
   { :key "-" }
   { :key "h" }
   { :key "j" }
   { :key "k" }
   { :key "l" }
   ])

(submode.set-submode-keymap "n" "z"
  [{ :key "<space>" :run-when { :entering "<c-f>" :repeating "<c-f>" } }
   { :key "b"       :run-when { :entering "<c-b>" :repeating "<c-b>" } }
   ])

(submode.set-submode-keymap "n" "*"
  [{ :key "*" :run-when { :entering "#*" :repeating "*" } }
   { :key "#" :run-when { :entering "*#" :repeating "#" } }
   ])

(foreach (partial submode.acceleration-key :n)
  [:h
   :j
   :k
   :l
   ])

(fn safe-cabbr [lhs rhs]
  (vim.cmd (.. "cabbrev <expr>" lhs " (getcmdtype() ==# ':' && getcmdline() ==# '" lhs "') ? '" rhs "' : '" lhs "'")))

(safe-cabbr "r" "lua require")
(safe-cabbr "l" "lua")

nil