;;; packages.el --- Spacemacs Layouts Layer packages File for Spacemacs
;;
;; Copyright (c) 2012-2016 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3

(setq spacemacs-layouts-packages
      '(eyebrowse
        helm
        ivy
        persp-mode
        spaceline
        swiper))



(defun spacemacs-layouts/init-eyebrowse ()
  (use-package eyebrowse
    :init
    (progn
      (setq eyebrowse-wrap-around t)
      (eyebrowse-mode)
      ;; transient state
      (spacemacs|transient-state-format-hint workspaces
        spacemacs--workspaces-ts-full-hint
        "\n\n
 Go to^^^^^^                         Actions^^
 ─────^^^^^^───────────────────────  ───────^^──────────────────────
 [_0_,_9_]^^     nth/new workspace   [_d_] close current workspace
 [_C-0_,_C-9_]^^ nth/new workspace   [_R_] rename current workspace
 [_<tab>_]^^^^   last workspace      [_?_] toggle help\n
 [_l_]^^^^       layouts
 [_n_/_C-l_]^^   next workspace
 [_N_/_p_/_C-h_] prev workspace\n")

      (spacemacs|define-transient-state workspaces
        :title "Workspaces Transient State"
        :hint-is-doc t
        :dynamic-hint (spacemacs//workspaces-ts-hint)
        :bindings
        ("?" spacemacs//workspaces-ts-toggle-hint)
        ("0" eyebrowse-switch-to-window-config-0 :exit t)
        ("1" eyebrowse-switch-to-window-config-1 :exit t)
        ("2" eyebrowse-switch-to-window-config-2 :exit t)
        ("3" eyebrowse-switch-to-window-config-3 :exit t)
        ("4" eyebrowse-switch-to-window-config-4 :exit t)
        ("5" eyebrowse-switch-to-window-config-5 :exit t)
        ("6" eyebrowse-switch-to-window-config-6 :exit t)
        ("7" eyebrowse-switch-to-window-config-7 :exit t)
        ("8" eyebrowse-switch-to-window-config-8 :exit t)
        ("9" eyebrowse-switch-to-window-config-9 :exit t)
        ("C-0" eyebrowse-switch-to-window-config-0)
        ("C-1" eyebrowse-switch-to-window-config-1)
        ("C-2" eyebrowse-switch-to-window-config-2)
        ("C-3" eyebrowse-switch-to-window-config-3)
        ("C-4" eyebrowse-switch-to-window-config-4)
        ("C-5" eyebrowse-switch-to-window-config-5)
        ("C-6" eyebrowse-switch-to-window-config-6)
        ("C-7" eyebrowse-switch-to-window-config-7)
        ("C-8" eyebrowse-switch-to-window-config-8)
        ("C-9" eyebrowse-switch-to-window-config-9)
        ("<tab>" eyebrowse-last-window-config)
        ("C-h" eyebrowse-prev-window-config)
        ("C-i" eyebrowse-last-window-config)
        ("C-l" eyebrowse-next-window-config)
        ("d" eyebrowse-close-window-config)
        ("l" spacemacs/layouts-transient-state/body :exit t)
        ("n" eyebrowse-next-window-config)
        ("N" eyebrowse-prev-window-config)
        ("p" eyebrowse-prev-window-config)
        ("R" spacemacs/workspaces-ts-rename :exit t)
        ("w" eyebrowse-switch-to-window-config :exit t))
      ;; note: we don't need to declare the `SPC l w' binding, it is
      ;; declare in the layout transient state
      (spacemacs/set-leader-keys "bW" 'spacemacs/goto-buffer-workspace)
      ;; hooks
      (add-hook 'persp-before-switch-functions
                #'spacemacs/update-eyebrowse-for-perspective)
      (add-hook 'eyebrowse-post-window-switch-hook
                #'spacemacs/save-eyebrowse-for-perspective)
      (add-hook 'persp-activated-functions
                #'spacemacs/load-eyebrowse-for-perspective)
      (add-hook 'persp-before-save-state-to-file-functions #'spacemacs/update-eyebrowse-for-perspective)
      (add-hook 'persp-after-load-state-functions #'spacemacs/load-eyebrowse-after-loading-layout)
      ;; vim-style tab switching
      (define-key evil-motion-state-map "gt" 'eyebrowse-next-window-config)
      (define-key evil-motion-state-map "gT" 'eyebrowse-prev-window-config))))



(defun spacemacs-layouts/post-init-helm ()
  (spacemacs/set-leader-keys
    "Bb" 'spacemacs-layouts/non-restricted-buffer-list-helm
    "pl" 'spacemacs/helm-persp-switch-project))



(defun spacemacs-layouts/post-init-ivy ()
  (spacemacs/set-leader-keys
    "Bb" 'spacemacs-layouts/non-restricted-buffer-list-ivy))

 

(defun spacemacs-layouts/init-persp-mode ()
  (use-package persp-mode
    :diminish persp-mode
    :init
    (progn
      (setq persp-auto-resume-time (if (or dotspacemacs-auto-resume-layouts
                                           spacemacs-force-resume-layouts)
                                       1 -1)
            persp-nil-name dotspacemacs-default-layout-name
            persp-reset-windows-on-nil-window-conf nil
            persp-set-last-persp-for-new-frames nil
            persp-save-dir spacemacs-layouts-directory
            persp-set-ido-hooks t)

      (defun spacemacs//activate-persp-mode ()
        "Always activate persp-mode, unless it is already active.
 (e.g. don't re-activate during `dotspacemacs/sync-configuration-layers' -
 see issues #5925 and #3875)"
        (unless (bound-and-true-p persp-mode)
          (persp-mode)))
      (spacemacs/defer-until-after-user-config #'spacemacs//activate-persp-mode)

      ;; layouts transient state
      ;; TODO move helm specific key bindings to helm layer
      ;;      (see ivy for how to do it)
      (spacemacs|transient-state-format-hint layouts
        spacemacs--layouts-ts-full-hint
        "\n\n
 Go to^^^^^^                                  Actions^^
 ─────^^^^^^──────────────────────────────    ───────^^──────────────────────────────────────────────────
 [_0_,_9_]^^     nth/new layout               [_a_]^^   add buffer
 [_C-0_,_C-9_]^^ nth/new layout               [_A_]^^   add all from layout
 [_<tab>_]^^^^   last layout                  [_d_]^^   close current layout
 [_b_]^^^^       buffer in layout             [_D_]^^   close other layout
 [_h_]^^^^       default layout               [_r_]^^   remove current buffer
 [_l_]^^^^       layout w/helm/ivy            [_R_]^^   rename current layout
 [_L_]^^^^       layouts in file              [_s_/_S_] save all layouts/save by names
 [_n_/_C-l_]^^   next layout                  [_t_]^^   show a buffer without adding it to current layout
 [_N_/_p_/_C-h_] prev layout                  [_x_]^^   kill current w/buffers
 [_o_]^^^^       custom layout                [_X_]^^   kill other w/buffers
 [_w_]^^^^       workspaces transient state   [_?_]^^   toggle help\n")

      (spacemacs|define-transient-state layouts
        :title "Layouts Transient State"
        :hint-is-doc t
        :dynamic-hint (spacemacs//layouts-ts-hint)
        :bindings
        ;; need to exit in case number doesn't exist
        ("?" spacemacs//layouts-ts-toggle-hint)
        ("1" spacemacs/persp-switch-to-1 :exit t)
        ("2" spacemacs/persp-switch-to-2 :exit t)
        ("3" spacemacs/persp-switch-to-3 :exit t)
        ("4" spacemacs/persp-switch-to-4 :exit t)
        ("5" spacemacs/persp-switch-to-5 :exit t)
        ("6" spacemacs/persp-switch-to-6 :exit t)
        ("7" spacemacs/persp-switch-to-7 :exit t)
        ("8" spacemacs/persp-switch-to-8 :exit t)
        ("9" spacemacs/persp-switch-to-9 :exit t)
        ("0" spacemacs/persp-switch-to-0 :exit t)
        ("C-1" spacemacs/persp-switch-to-1)
        ("C-2" spacemacs/persp-switch-to-2)
        ("C-3" spacemacs/persp-switch-to-3)
        ("C-4" spacemacs/persp-switch-to-4)
        ("C-5" spacemacs/persp-switch-to-5)
        ("C-6" spacemacs/persp-switch-to-6)
        ("C-7" spacemacs/persp-switch-to-7)
        ("C-8" spacemacs/persp-switch-to-8)
        ("C-9" spacemacs/persp-switch-to-9)
        ("C-0" spacemacs/persp-switch-to-0)
        ("<tab>" spacemacs/jump-to-last-layout)
        ("<return>" nil :exit t)
        ("C-h" persp-prev)
        ("C-l" persp-next)
        ("a" persp-add-buffer :exit t)
        ("A" persp-import-buffers :exit t)
        ("b" spacemacs/persp-helm-mini :exit t)
        ("d" spacemacs/layouts-ts-close)
        ("D" spacemacs/layouts-ts-close-other :exit t)
        ("h" spacemacs/layout-goto-default :exit t)
        ("l" spacemacs/helm-perspectives :exit t)
        ("L" persp-load-state-from-file :exit t)
        ("n" persp-next)
        ("N" persp-prev)
        ("o" spacemacs/select-custom-layout :exit t)
        ("p" persp-prev)
        ("r" persp-remove-buffer :exit t)
        ("R" spacemacs/layouts-ts-rename :exit t)
        ("s" persp-save-state-to-file :exit t)
        ("S" persp-save-to-file-by-names :exit t)
        ("t" persp-temporarily-display-buffer :exit t)
        ("w" spacemacs/workspaces-transient-state/body :exit t)
        ("x" spacemacs/layouts-ts-kill)
        ("X" spacemacs/layouts-ts-kill-other :exit t))
      (spacemacs/set-leader-keys "l" 'spacemacs/layouts-transient-state/body)
      ;; custom layouts
      (spacemacs|define-custom-layout "@Spacemacs"
        :binding "e"
        :body
        (spacemacs/find-dotfile)))
    :config
    (progn
      (defadvice persp-activate (before spacemacs//save-toggle-layout activate)
        (setq spacemacs--last-selected-layout persp-last-persp-name))
      (add-hook 'persp-mode-hook 'spacemacs//layout-autosave)
      (spacemacs/declare-prefix "b" "persp-buffers")
      (spacemacs/declare-prefix "B" "global-buffers")
      ;; Override SPC TAB to only change buffers in perspective
      (spacemacs/set-leader-keys
        "TAB"  'spacemacs/alternate-buffer-in-persp
        "ba"   'persp-add-buffer
        "br"   'persp-remove-buffer))))



(defun spacemacs-layouts/post-init-spaceline ()
  (setq spaceline-display-default-perspective
        dotspacemacs-display-default-layout))



(defun spacemacs-layouts/post-init-swiper ()
  (spacemacs/set-leader-keys "pl" 'spacemacs/ivy-persp-switch-project))
