Files
emacs/lisp/treemacs/treemacs-compatibility.el
2020-12-05 21:29:49 +01:00

113 lines
4.5 KiB
EmacsLisp

;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
;; Copyright (C) 2020 Alexander Miller
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;;; Simple bits of code to make treemacs compatible with other packages
;;; that aren't worth the effort of being turned into their own package.
;;; Code:
(require 'dash)
(require 'treemacs-customization)
(require 'treemacs-logging)
(require 'treemacs-scope)
(require 'treemacs-core-utils)
(require 'treemacs-interface)
(eval-when-compile
(require 'treemacs-macros))
(treemacs-only-during-init
;; make sure frame params are not persisted by desktop-save-mode
(push '(treemacs-id . :never) frameset-filter-alist)
(push '(treemacs-workspace . :never) frameset-filter-alist))
(with-eval-after-load 'winum
(when (boundp 'winum-ignored-buffers-regexp)
(add-to-list 'winum-ignored-buffers-regexp (regexp-quote (format "%sScoped-Buffer-" treemacs--buffer-name-prefix)))))
(with-eval-after-load 'ace-window
(when (boundp 'aw-ignored-buffers)
(push 'treemacs-mode aw-ignored-buffers)))
(with-eval-after-load 'golden-ratio
(when (boundp 'golden-ratio-exclude-modes)
(add-to-list 'golden-ratio-exclude-modes 'treemacs-mode)))
(with-eval-after-load 'indent-guide
(when (boundp 'indent-guide-inhibit-modes)
(push 'treemacs-mode indent-guide-inhibit-modes)))
(defun persp-after-load ()
(defun treemacs--remove-treemacs-window-in-new-frames (persp-activated-for)
(when (or t(eq persp-activated-for 'frame))
(-when-let (w (--first (treemacs-is-treemacs-window? it)
(window-list)))
(unless (assoc (treemacs-scope->current-scope treemacs--current-scope-type) treemacs--scope-storage)
(delete-window w)))))
(declare-function treemacs--remove-treemacs-window-in-new-frames "treemacs-compatibility")
(if (boundp 'persp-activated-functions)
(add-to-list 'persp-activated-functions #'treemacs--remove-treemacs-window-in-new-frames)
(treemacs-log-failure "`persp-activated-functions' not defined - couldn't add compatibility.")))
(with-eval-after-load 'persp-mode
(persp-after-load))
(with-eval-after-load 'perspective
(persp-after-load))
(defun treemacs--split-window-advice (original-split-function &rest args)
"Advice to make sure window splits are sized correctly with treemacs.
This will treat the treemacs window as a side-window for the duration of the
split, calling the ORIGINAL-SPLIT-FUNCTION with its ARGS. This prevents the
calculations in `split-window-right' from outputting the wrong result for the
width of the new window when the treemacs window is visible."
(-let [w (treemacs-get-local-window)]
(unwind-protect
(progn
(when w (set-window-parameter w 'window-side treemacs-position))
(apply original-split-function args))
(when (and w (null treemacs-display-in-side-window))
(set-window-parameter w 'window-side nil)))))
(advice-add 'split-window-right :around #'treemacs--split-window-advice)
(with-eval-after-load 'org
(defun treemacs-store-org-link ()
"Store an `org-mode' link for the node at point."
(when (eq major-mode 'treemacs-mode)
(-when-let* ((btn (treemacs-current-button))
(file (treemacs--nearest-path btn)))
(-let [link (format "file:%s" (abbreviate-file-name file))]
(with-no-warnings
(org-add-link-props
:link link
:description (treemacs--filename file)))
link))))
(with-no-warnings
(if (fboundp 'org-link-set-parameters)
(org-link-set-parameters "treemacs" :store #'treemacs-store-org-link)
(add-hook 'org-store-link-functions #'treemacs-store-org-link))))
(with-eval-after-load 'evil-escape
(when (boundp 'evil-escape-excluded-major-modes)
(add-to-list 'evil-escape-excluded-major-modes 'treemacs-mode)))
(provide 'treemacs-compatibility)
;;; treemacs-compatibility.el ends here