1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
;; https://github.com/rktjmp/hotpot.nvim/blob/master/COOKBOOK.md#using-hotpot-reflect

;; Open session and attach input in one step.
;; Note the complexity here is mostly due to nvim not having an api to create a
;; split window, so we must shuffle some code to create a buf, pair input and output
;; then put that buf inside a window.
; (local reflect-session {:id nil :mode :compile})
; (fn new-or-attach-reflect []
;   (let [{: api} vim
;         reflect (require :hotpot.api.reflect)
;         with-session-id (if reflect-session.id
;                           (fn [f]
;                             ;; session id already exists, so we can just pass
;                             ;; it to whatever needs it
;                             (f reflect-session.id))
;                           (fn [f]
;                             ;; session id does not exist, so we need to create
;                             ;; an output buffer first then we can pass the
;                             ;; session id on, and finally hook up the output
;                             ;; buffer to a window
;                             (let [buf (api.nvim_create_buf true true)
;                                   id (reflect.attach-output buf)]
;                               (set reflect-session.id id)
;                               (f id)
;                               ;; create window, which will forcibly assume focus, swap the buffer
;                               ;; to our output buffer and setup an autocommand to drop the session id
;                               ;; when the session window is closed.
;                               (vim.schedule #(do
;                                                (api.nvim_command "botright vnew")
;                                                (api.nvim_win_set_buf (api.nvim_get_current_win) buf)
;                                                (api.nvim_create_autocmd :BufWipeout
;                                                                         {:buffer buf
;                                                                          :once true
;                                                                          :callback #(set reflect-session.id nil)}))))))]
;     ;; we want to set the session mode to our current mode, and attach the
;     ;; input buffer once we have a session id
;     (with-session-id (fn [session-id]
;                        ;; we manually set the mode each time so it is persisted if we close the session.
;                        ;; By default `reflect` will use compile mode.
;                        (reflect.set-mode session-id reflect-session.mode)
;                        (reflect.attach-input session-id 0)))))
; (vim.keymap.set :v :hr new-or-attach-reflect)

; (fn swap-reflect-mode []
;   (let [reflect (require :hotpot.api.reflect)]
;     ;; only makes sense to do this when we have a session active
;     (when reflect-session.id
;       ;; swap held mode
;       (if (= reflect-session.mode :compile)
;         (set reflect-session.mode :eval)
;         (set reflect-session.mode :compile))
;       ;; tell session to use new mode
;       (reflect.set-mode reflect-session.id reflect-session.mode))))
; (vim.keymap.set :n :hx swap-reflect-mode)

;; https://github.com/rktjmp/hotpot.nvim/blob/master/COOKBOOK.md#using-the-api

(fn pecho [ok? ...]
  "nvim_echo vargs, as DiagnosticHint or DiagnosticError depending on ok?"
  (let [{: nvim_echo} vim.api
        {: view} (require :hotpot.fennel)
        hl (if ok? :DiagnosticHint :DiagnosticError)
        list [...]
        output (fcollect [i 1 (select "#" ...)]
                         (-> (. list i)
                             (#(match (type $1)
                                 :table (view $1)
                                 _ (tostring $1)))
                             (.. "\n")))]
    (nvim_echo (icollect [_ l (ipairs output)]
                 [l hl]) true {})))

; (vim.keymap.set :n :heb #(let [{: eval-buffer} (require :hotpot.api.eval)]
;                            (pecho (eval-buffer 0)))
;                 {:desc "Evaluate entire buffer"})

; (vim.keymap.set :v :hes #(let [{: eval-selection} (require :hotpot.api.eval)]
;                            (pecho (eval-selection)))
;                 {:desc "Evaluate selection"})

; (vim.keymap.set :n :hcb #(let [{: compile-buffer} (require :hotpot.api.compile)]
;                            (pecho (compile-buffer 0)))
;                 {:desc "Compile entire buffer"})

; (vim.keymap.set :v :hcs #(let [{: compile-selection} (require :hotpot.api.compile)]
;                            (pecho (compile-selection)))
;                 {:desc "Compile selection"})