diff options
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/doom-themes-20180909.1757/doom-themes-neotree.el')
-rw-r--r-- | configs/shared/emacs/.emacs.d/elpa/doom-themes-20180909.1757/doom-themes-neotree.el | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/doom-themes-20180909.1757/doom-themes-neotree.el b/configs/shared/emacs/.emacs.d/elpa/doom-themes-20180909.1757/doom-themes-neotree.el new file mode 100644 index 000000000000..0b7a5134e7c3 --- /dev/null +++ b/configs/shared/emacs/.emacs.d/elpa/doom-themes-20180909.1757/doom-themes-neotree.el @@ -0,0 +1,359 @@ +;;; doom-themes-neotree.el -*- lexical-binding: t; -*- + +(unless doom-themes--inhibit-warning + (message "doom-themes: loading `doom-themes-neotree' directly is obsolete, call `doom-themes-neotree-config' instead")) + +(defgroup doom-neotree nil + "Options for doom's neotree theme" + :group 'doom-themes) + +;; +(defface doom-neotree-dir-face '((t (:inherit neo-dir-link-face))) + "Face for directory labels." + :group 'doom-neotree) + +(defface doom-neotree-file-face '((t (:inherit neo-file-link-face))) + "Face for file name labels." + :group 'doom-neotree) + +;; file type faces +(defface doom-neotree-hidden-file-face '((t (:inherit font-lock-comment-face))) + "Face for labels of hidden files. See `doom-neotree-file-face-re-alist'." + :group 'doom-neotree) + +(defface doom-neotree-text-file-face '((t (:inherit neo-file-link-face))) + "Face for labels of text/documentation files (readmes, org files, etc). See +`doom-neotree-file-face-re-alist'." + :group 'doom-neotree) + +(defface doom-neotree-media-file-face '((t (:inherit neo-file-link-face))) + "Face for labels of media files. See `doom-neotree-file-face-re-alist'." + :group 'doom-neotree) + +(defface doom-neotree-data-file-face '((t (:inherit neo-file-link-face))) + "Face for labels of data files (json, yaml, xml, etc). See +`doom-neotree-file-face-re-alist'." + :group 'doom-neotree) + +(defface doom-neotree-executable-file-face '((t (:inherit neo-file-link-face))) + "TODO" + :group 'doom-neotree) + + +;; +(defcustom doom-neotree-project-size 1.4 + "What :height to display the project icon at the top at." + :type 'float + :group 'doom-neotree) + +(defcustom doom-neotree-folder-size 1.05 + "What :height to display the folder icons at." + :type 'float + :group 'doom-neotree) + +(defcustom doom-neotree-chevron-size 0.8 + "What :height to display the chevron icons at." + :type 'float + :group 'doom-neotree) + +(defcustom doom-neotree-line-spacing 2 + "Line-spacing for neotree buffer." + :type 'symbol + :group 'doom-neotree) + +(define-obsolete-variable-alias 'doom-neotree-enable-file-icons 'doom-neotree-file-icons) +(defcustom doom-neotree-file-icons 'simple + "The style to use for the file icons. Can be nil (disabled), non-nil (for a +diverse iconset), or 'simple, which is closest's to Atom's style as it only +distinguishes text, source, pdfs, images and binary files." + :type '(choice + (const :tag "A diverse array of file icons based on file type" t) + (const :tag "Minimalistic file icons (like Atom's)" 'simple) + (const :tag "Disable file icons" nil)) + :group 'doom-neotree) + +(defcustom doom-neotree-enable-folder-icons t + "If non-nil, display folder icons next to each file. Different icons are used +depending on whether the folder is a repo, symlink or regular folder." + :type 'boolean + :group 'doom-neotree) + +(defcustom doom-neotree-enable-open-chevron-icons t + "If non-nil, display the chevron-down icon next to each expanded folder." + :type 'boolean + :group 'doom-neotree) + +(defcustom doom-neotree-enable-closed-chevron-icons t + "If non-nil, display the chevron-right icon next to each collapsed folder." + :type 'boolean + :group 'doom-neotree) + +(defcustom doom-neotree-enable-variable-pitch nil + "If non-nil, labels will use the `doom-neotree-dir-face' and +`doom-neotree-dir-face' faces, which inherit from the `variable-pitch' face." + :type 'boolean + :group 'doom-neotree) + +(defcustom doom-neotree-enable-type-colors t + "If non-nil, color each file/folder based on the categories determined by +`doom-neotree-file-face-re-alist'." + :type 'boolean + :group 'doom-neotree) + + +(defun doom--neo-is-repo-dir-p (path) + (or (file-exists-p (format "%s/.git" path)) + (all-the-icons-dir-is-submodule path))) + +(defvar doom-neotree-dir-rules + (eval-when-compile + `(("/\\(?:node_modules\\|vendor\\)$" + :face doom-neotree-hidden-file-face) + ("/\\.[^$/#]+$" + :face doom-neotree-hidden-file-face) + (file-symlink-p + :icon (all-the-icons-octicon "file-symlink-directory")) + (doom--neo-is-repo-dir-p + :icon (all-the-icons-octicon "file-submodule")) + (t :icon (all-the-icons-octicon "file-directory")))) + "TODO") + +(defvar doom-neotree-file-rules + (eval-when-compile + `((file-symlink-p + :icon (all-the-icons-octicon "file-symlink-file")) + (file-executable-p + :face doom-neotree-executable-file-face + :icon (all-the-icons-octicon "file-binary")) + ("\\.\\(?:md\\|org\\|rst\\|log\\)\\|/[A-Z_-]+\\(?:\\.[a-z]+\\)?$" + :face doom-neotree-text-file-face + :icon (all-the-icons-octicon "file-text")) + (,(concat "\\." (regexp-opt '("htm" "html" "phtml" "tpl" "erb" "mustache" + "twig" "ejs" "erb" "jsx" "haml" "inky-haml" + "inky-slim" "slim" "pug" "jade")) + "$") + :icon (all-the-icons-octicon "file-code")) + (,(concat "\\(?:/\\(?:Gemfile\\|Vagrantfile\\|Makefile\\|Rakefile\\|Cask\\|\\.[^$]+rc\\|\\)\\|" + "\\." (regexp-opt '("json" "cson" "yaml" "yml" "xml" "toml" + "tpl" "ini" "erb" "mustache" "twig" "ejs" + "mk" "haml" "pug" "jade")) + "\\)$") + :icon (all-the-icons-octicon "file-code")) + (,(concat "\\." + (regexp-opt '("png" "jpg" "jpeg" "gif" "ico" "tif" "tiff" + "svg" "bmp" "psd" "ai" "eps" "indd" ; images + "mov" "avi" "mp4" "webm" "mkv" ; video + "wav" "mp3" "ogg" "midi")) ; audio + "$") + :face doom-neotree-data-file-face + :icon (all-the-icons-octicon "file-media")) + (,(concat "\\.\\(?:[gl]?zip\\|bzip2\\|deb\\|dmg\\|iso\\|7z\\|rpm\\|pkg\\|dat\\|[rjt]ar\\(?:\\.gz\\)?\\)$") + :face doom-neotree-data-file-face + :icon (all-the-icons-octicon "file-zip")) + ("\\.pdf$" + :face doom-neotree-data-file-face + :icon (all-the-icons-octicon "file-pdf")) + ("\\.\\(?:lock\\|resolved\\|dll\\|so\\|pyc\\|elc\\|class\\|css\\.map\\)$" + :face doom-neotree-hidden-file-face + :icon (all-the-icons-octicon "file-binary")) + ("/\\.[^$/#]+$" + :face doom-neotree-hidden-file-face) + (t :icon (all-the-icons-octicon "file-text")))) + "TODO") + + +;; +(defun doom--neotree-no-fringes () + "Remove fringes in neotree. They get reset each time you select the neotree +pane and are highlighted incorrectly." + (set-window-fringes neo-global--window 0 0)) + +(defun doom--neotree-setup (&rest _) + (setq line-spacing doom-neotree-line-spacing + tab-width 1) + (when (featurep 'hl-line) + (set (make-local-variable 'hl-line-sticky-flag) t) + (hl-line-mode +1))) + +(defun doom-neotree-spec (node rules) + (let (case-fold-search) + (cl-loop for spec in rules + for pred = (car spec) + for plist = (cdr spec) + when + (cond ((eq pred 't)) + ((symbolp pred) (funcall pred node)) + ((stringp pred) (string-match-p pred node))) + return plist))) + +(defun doom--neotree-insert-file-icon (node icon &optional faces) + (if node + (cond ((eq doom-neotree-file-icons 'simple) + (propertize + (if icon + (apply (car icon) (cdr icon)) + (all-the-icons-octicon "file-text")) + 'face `(:inherit ,faces + :family ,(all-the-icons-octicon-family) + :height 1.3) + 'display '(raise 0))) + (t (all-the-icons-icon-for-file node))) + (all-the-icons-fileicon "default"))) + +(defun doom--neotree-insert-dir-icon (node type &optional faces) + (concat (if type + (all-the-icons-octicon + (format "chevron-%s" (if (eq type 'open) "down" "right")) + :v-adjust 0.1 + :height doom-neotree-chevron-size + :face `(:inherit ,faces + :family ,(all-the-icons-octicon-family) + :height ,doom-neotree-chevron-size)) + "\t") + "\t" + (when doom-neotree-enable-folder-icons + (all-the-icons-octicon + (cond ((file-symlink-p node) "file-symlink-directory") + ((file-exists-p (format "%s/.git" node)) "file-submodule") + ((all-the-icons-dir-is-submodule node) "file-submodule") + ("file-directory")) + :v-adjust 0 + :height doom-neotree-folder-size + :face `(:inherit ,faces + :family ,(all-the-icons-octicon-family) + :height ,doom-neotree-folder-size))))) + +(defun doom--neotree-insert-icon (type node &optional icon faces) + "Custom hybrid unicode theme with leading whitespace." + (let ((spc "\t") + (vspc (propertize " " 'face 'variable-pitch))) + (cond ((eq type 'open) + (insert + (concat spc + (doom--neotree-insert-dir-icon + node (if doom-neotree-enable-open-chevron-icons type) + faces) + vspc))) + ((eq type 'close) + (insert + (concat spc + (doom--neotree-insert-dir-icon + node (if doom-neotree-enable-closed-chevron-icons type) + faces) + vspc))) + ((eq type 'leaf) + (insert + (concat (when (or doom-neotree-enable-open-chevron-icons + doom-neotree-enable-closed-chevron-icons) + spc) + (when doom-neotree-enable-folder-icons spc) + (when doom-neotree-file-icons + (concat spc (doom--neotree-insert-file-icon node icon faces))) + vspc)))))) + +;; +(defun doom-neotree-insert-root (node) + ;; insert icon + (when (display-graphic-p) + (insert + (concat (propertize "\t" 'face 'neo-root-dir-face) + (all-the-icons-octicon + "repo" + :height doom-neotree-project-size + :face 'neo-root-dir-face + :v-adjust -0.1) + (propertize " " 'face 'neo-root-dir-face)))) + ;; insert project name + (insert + (propertize + (concat (or (neo-path--file-short-name node) "-") + "\n") + 'face `(:inherit ,(append (if doom-neotree-enable-variable-pitch '(variable-pitch)) + '(neo-root-dir-face)))))) + +(defun doom-neotree-insert-dir (node depth expanded) + (let ((short-name (neo-path--file-short-name node)) + (faces '(doom-neotree-dir-face)) + icon-text) + ;; insert indentation + (insert-char ?\s (* (- depth 1) 2)) + ;; vcs integration + (let ((vc (if neo-vc-integration (neo-vc-for-node node)))) + (when (memq 'char neo-vc-integration) + (insert-char (car vc)) + (insert-char ?\s)) + (unless (and (memq 'face neo-vc-integration) + (not (eq (cdr vc) 'neo-vc-up-to-date-face)) + (setq faces (list (cdr vc)))) + (cl-destructuring-bind (&key face icon) + (doom-neotree-spec node doom-neotree-dir-rules) + (if face (push face faces)) + (if icon (setq icon-text icon))))) + ;; insert icon + (let ((type (if expanded 'open 'close))) + (if (display-graphic-p) + (doom--neotree-insert-icon type node icon-text faces) + (neo-buffer--insert-fold-symbol type node))) + ;; insert label button + (when doom-neotree-enable-variable-pitch + (push 'variable-pitch faces)) + (insert-button short-name + 'follow-link t + 'face `(:inherit (,@faces)) + 'neo-full-path node + 'keymap neotree-dir-button-keymap) + ;; metadata + newline + (neo-buffer--node-list-set nil node) + (neo-buffer--newline-and-begin))) + +(defun doom-neotree-insert-file (node depth) + (let ((short-name (neo-path--file-short-name node)) + (vc (if neo-vc-integration (neo-vc-for-node node))) + (faces '(doom-neotree-file-face)) + icon-text) + ;; insert indentation + (insert-char ?\s (* (- depth 1) 2)) + ;; vcs integration + (unless (and (memq 'face neo-vc-integration) + (not (eq (cdr vc) 'neo-vc-up-to-date-face)) + (setq faces (list (cdr vc)))) + (cl-destructuring-bind (&key face icon) + (doom-neotree-spec node doom-neotree-file-rules) + (if face (push face faces)) + (if icon (setq icon-text icon)))) + ;; insert icon + (if (display-graphic-p) + (doom--neotree-insert-icon 'leaf node icon-text faces) + (neo-buffer--insert-fold-symbol 'leaf node)) + ;; insert label button + (when doom-neotree-enable-variable-pitch + (push 'variable-pitch faces)) + (insert-button short-name + 'follow-link t + 'face `(:inherit (,@faces)) + 'neo-full-path node + 'keymap neotree-file-button-keymap) + ;; metadata + newline + (neo-buffer--node-list-set nil node) + (neo-buffer--newline-and-begin))) + +;; +(eval-after-load 'neotree + (lambda () + (unless (require 'all-the-icons nil t) + (error "all-the-icons isn't installed")) + + ;; Enable buffer-local hl-line and adjust line-spacing + (add-hook 'neo-after-create-hook #'doom--neotree-setup) + ;; Incompatible + (setq neo-vc-integration nil) + ;; Remove fringes in Neotree pane + (advice-add #'neo-global--select-window :after #'doom--neotree-no-fringes) + ;; Patch neotree to use `doom--neotree-insert-icon' + (advice-add #'neo-buffer--insert-file-entry :override #'doom-neotree-insert-file) + (advice-add #'neo-buffer--insert-dir-entry :override #'doom-neotree-insert-dir) + ;; Shorter pwd in neotree override + (advice-add #'neo-buffer--insert-root-entry :override #'doom-neotree-insert-root))) + +(provide 'doom-themes-neotree) +;;; doom-themes-neotree.el ends here |