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

(use-package! neotree
  :commands (neotree-show
             neotree-hide
             neotree-toggle
             neotree-dir
             neotree-find
             neo-global--with-buffer
             neo-global--window-exists-p)
  :init
  (setq neo-create-file-auto-open nil
        neo-auto-indent-point nil
        neo-autorefresh nil
        neo-mode-line-type 'none
        neo-window-width 30
        neo-show-updir-line nil
        neo-theme 'icons
        neo-banner-message nil
        neo-confirm-create-file #'off-p
        neo-confirm-create-directory #'off-p
        neo-show-hidden-files nil
        neo-keymap-style 'concise
        neo-show-hidden-files t
        neo-hidden-regexp-list
        '(;; vcs folders
          "^\\.\\(?:git\\|hg\\|svn\\)$"
          ;; compiled files
          "\\.\\(?:pyc\\|o\\|elc\\|lock\\|css.map\\|class\\)$"
          ;; generated files, caches or local pkgs
          "^\\(?:node_modules\\|vendor\\|.\\(project\\|cask\\|yardoc\\|sass-cache\\)\\)$"
          ;; org-mode folders
          "^\\.\\(?:sync\\|export\\|attach\\)$"
          ;; temp files
          "~$"
          "^#.*#$"))

  :config
  (set-popup-rule! "^ ?\\*NeoTree" :ignore t)

  (after! winner
    (add-to-list 'winner-boring-buffers neo-buffer-name))

  ;; The cursor always sits at bol. `+neotree--fix-cursor-h' and
  ;; `+neotree--indent-cursor-a' change that behavior so that the cursor is
  ;; always on the first non-blank character on the line, in the neo buffer.
  (add-hook! 'neo-enter-hook
    (defun +neotree-fix-cursor-h (&rest _)
      (with-current-buffer neo-global--buffer
        (+neotree--indent-cursor-a))))

  (defadvice! +neotree--indent-cursor-a (&rest _)
    :after '(neotree-next-line neotree-previous-line)
    (beginning-of-line)
    (skip-chars-forward " \t\r"))

  (map! :map neotree-mode-map
        :n [tab] (neotree-make-executor
                  :dir-fn  #'neo-open-dir
                  :file-fn #'neotree-quick-look)
        :n "DEL" #'evil-window-prev
        :n "n"   #'neotree-next-line
        :n "p"   #'neotree-previous-line
        :m "h"   #'+neotree/collapse-or-up
        :m "l"   #'+neotree/expand-or-open
        :n "J"   #'neotree-select-next-sibling-node
        :n "K"   #'neotree-select-previous-sibling-node
        :n "H"   #'neotree-select-up-node
        :n "L"   #'neotree-select-down-node
        :n "G"   #'evil-goto-line
        :n "gg"  #'evil-goto-first-line
        :n "v"   (neotree-make-executor :file-fn 'neo-open-file-vertical-split)
        :n "s"   (neotree-make-executor :file-fn 'neo-open-file-horizontal-split)))
