(let [mod {} api vim.api o vim.opt statusline (require :nifoc.statusline) gitsigns (require :gitsigns)] ;; Line Number (set mod.line-number {:condition #(or (o.number:get) (o.relativenumber:get)) 1 statusline.push-right 2 {:provider (fn [] (let [num (o.number:get) relnum (o.relativenumber:get)] (if (and num (not relnum)) "%l" (and relnum (not num)) "%r" "%{v:relnum?v:relnum:v:lnum}")))}}) ;; Signs (set mod.signs {:provider "%s" :hl {:bold true}}) ;; gitsigns (set mod.gitsigns {:condition #(= vim.b.nifoc_gitsigns_enabled 1) :init (fn [self] (let [bufnr (api.nvim_get_current_buf) lnum vim.v.lnum sign (?. (vim.fn.sign_getplaced bufnr {:group :gitsigns_vimfn_signs_ :id lnum : lnum}) 1 :signs 1)] (set self.sign sign) (set self.has_sign (not= sign nil)))) :provider " ▏" :hl #(if $1.has_sign $1.sign.name :StatusLineNC) :on_click {:name :heirline_statuscolumn_gitsigns :callback (fn [self] (let [mouse (vim.fn.getmousepos) cursor-pos [mouse.line 0]] (api.nvim_win_set_cursor mouse.winid cursor-pos) (vim.defer_fn #(gitsigns.blame_line {:full true}) 100)))}}) (set mod.gitsigns-or-bar [{:condition #(and (not= vim.b.nifoc_gitsigns_enabled 1) (or (o.number:get) (o.relativenumber:get))) :provider " ▏" :hl :StatusLineNC} mod.gitsigns]) ;; Diagnostic signs (set mod.diagnostic-signs {:condition #(and (= vim.b.nifoc_diagnostics_enabled 1) (> (length (vim.diagnostic.get 0)) 0)) :static {:sign-text {:DiagnosticSignError " " :DiagnosticSignWarn " " :DiagnosticSignInfo " " :DiagnosticSignHint " "}} :init (fn [self] (let [bufnr (api.nvim_get_current_buf) lnum vim.v.lnum signs (?. (vim.fn.sign_getplaced bufnr {:group "*" : lnum}) 1 :signs) diagnostic-signs (vim.tbl_filter #(vim.startswith $1.group :vim.diagnostic) signs) sign (?. diagnostic-signs 1)] (set self.bufnr bufnr) (set self.sign sign) (set self.has_sign (not= sign nil)))) :provider #(if $1.has_sign (. $1.sign-text $1.sign.name) " ") :hl #(when $1.has_sign $1.sign.name) :on_click {:name :heirline_statuscolumn_diagnostic :callback (fn [self] (let [mouse (vim.fn.getmousepos) line (- mouse.line 1) cursor-pos [mouse.line 0]] (api.nvim_win_set_cursor mouse.winid cursor-pos) (vim.defer_fn #(vim.diagnostic.open_float {:bufnr self.bufnr :pos line :scope :line}) 100)))}}) mod)