(local cmp (require :cmp)) (fn has-words-before [] (let [(line col) (unpack (vim.api.nvim_win_get_cursor 0)) cur-line (. (vim.api.nvim_buf_get_lines 0 (- line 1) line true 1))] (and (not= col 0) (= (: (: cur-line :sub col col) :match "%s") nil)))) (fn tab [fallback] (let [cmp (require :cmp) luasnip (require :luasnip)] (if (cmp.visible) (cmp.select_next_item) (let [available (luasnip.expand_or_jumpable)] (if (= (available) true) (luasnip.expand_or_jump) (if (has-words-before) (cmp.complete) (fallback))))))) (fn stab [fallback] (let [cmp (require :cmp) luasnip (require :luasnip)] (if (cmp.visible) (cmp.select_prev_item) (let [available (luasnip.jumpable -1)] (if (= (available) true) (luasnip.jump -1) (if (has-words-before) (cmp.complete) (fallback))))))) (let [lspkind (require :lspkind) luasnip_loaders (require :luasnip.loaders.from_vscode)] (luasnip_loaders.lazy_load) (cmp.setup {:formatting {:format lspkind.cmp_format} :snippet {:expand (fn [args] (let [luasnip (require :luasnip)] (luasnip.lsp_expand args.body)))} :sources [{:name "buffer"} {:name "nvim_lsp"} {:name "look"} {:name "path"} {:name "calc"} {:name "spell"} {:name "cmp-conjure"} {:name "luasnip"} {:name "tags"}] :mapping {"" (cmp.mapping.scroll_docs -4) "" (cmp.mapping.scroll_docs 4) "" (cmp.mapping (cmp.mapping.select_prev_item) [:i :c]) "" (cmp.mapping (cmp.mapping.select_next_item) [:i :c]) "" (cmp.mapping.close) "" (cmp.mapping.confirm {:select true}) "" (cmp.mapping tab [:i :s]) "" (cmp.mapping stab [:i :s])}}))