;;; ui/treemacs/config.el -*- lexical-binding: t; -*-

(defvar +treemacs-git-mode 'simple
  "Type of git integration for `treemacs-git-mode'.

There are 3 possible values:

  1) `simple', which highlights only files based on their git status, and is
     slightly faster,
  2) `extended', which highlights both files and directories, but requires
     python,
  3) `deferred', same as extended, but highlights asynchronously.

This must be set before `treemacs' has loaded.")


;;
;;; Packages

(use-package! treemacs
  :defer t
  :init
  (setq treemacs-follow-after-init t
        treemacs-is-never-other-window t
        treemacs-sorting 'alphabetic-case-insensitive-asc
        treemacs-persist-file (concat doom-cache-dir "treemacs-persist")
        treemacs-last-error-persist-file (concat doom-cache-dir "treemacs-last-error-persist"))
  :config
  ;; ...but not from treemacs-visit-node-ace-* commands.
  (defadvice! +treemacs--ace-window-ignore-treemacs-buffer-a (orig-fn &rest args)
    :around '(treemacs-visit-node-ace
              treemacs-visit-node-ace-horizontal-split
              treemacs-visit-node-ace-vertical-split)
    (let ((aw-ignored-buffers (cons 'treemacs-mode aw-ignored-buffers)))
      (apply orig-fn args)))

  ;; Don't follow the cursor
  (treemacs-follow-mode -1)

  (when +treemacs-git-mode
    ;; If they aren't supported, fall back to simpler methods
    (when (and (memq +treemacs-git-mode '(deferred extended))
               (not (executable-find "python3")))
      (setq +treemacs-git-mode 'simple))
    (treemacs-git-mode +treemacs-git-mode)
    (setq treemacs-collapse-dirs
          (if (memq treemacs-git-mode '(extended deferred))
              3
            0))))


(use-package! treemacs-evil
  :when (featurep! :editor evil +everywhere)
  :defer t
  :init
  (after! treemacs (require 'treemacs-evil))
  (add-to-list 'doom-evil-state-alist '(?T . treemacs))
  :config
  (define-key! evil-treemacs-state-map
    [return] #'treemacs-RET-action
    [tab]    #'treemacs-TAB-action
    "TAB"    #'treemacs-TAB-action
    ;; REVIEW Fix #1875 to be consistent with C-w {v,s}, but this should really
    ;;        be considered upstream.
    "o v"    #'treemacs-visit-node-horizontal-split
    "o s"    #'treemacs-visit-node-vertical-split))


(use-package! treemacs-projectile
  :after treemacs)


(use-package! treemacs-magit
  :when (featurep! :tools magit)
  :after treemacs magit)


(use-package! treemacs-persp
  :when (featurep! :ui workspaces)
  :after treemacs
  :config (treemacs-set-scope-type 'Perspectives))

(use-package! lsp-treemacs
  :when (featurep! +lsp)
  :after (treemacs lsp))
