-
Notifications
You must be signed in to change notification settings - Fork 0
/
core-persp.el
132 lines (113 loc) · 4.28 KB
/
core-persp.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
;;; core-persp.el --- Perspective
;;; Commentary:
;;; Code:
(require 'dash)
(require 'core-hydra)
(require 'ibuf-ext)
;; https://github.com/Bad-ptr/persp-mode.el
(use-package persp-mode
:ensure t
:demand t
:bind (:map persp-key-map
("O" . persp-kill-other)
("B" . persp-ibuffer))
:init
(setq-default persp-keymap-prefix (kbd "C-x x")
persp-add-buffer-on-after-change-major-mode t
persp-autokill-buffer-on-remove 'kill-weak
persp-autokill-persp-when-removed-last-buffer 'kill
persp-kill-foreign-buffer-behaviour 'kill
persp-remove-buffers-from-nil-persp-behaviour nil)
:config
;;(persp-mode 1)
(add-hook 'window-setup-hook #'(lambda () (persp-mode 1)))
;; Filter out ephemeral buffers
(add-hook 'persp-common-buffer-filter-functions
#'(lambda (b) (string-prefix-p "*" (buffer-name b))))
;; Recent perspectives list
(setq-default persp-recent-perspectives '())
(defun persp-register-recent (name)
"Add a perspective to the `persp-register-recent' list."
(setq persp-recent-perspectives
(->> (cons name persp-recent-perspectives)
-distinct
(-filter (lambda (name) (member name (persp-names)))))))
(defun persp-names-recent ()
"Return a list of all perspective names, sorted by recent usage."
(let* ((all (persp-names))
(recent (-filter (lambda (name) (member name all)) persp-recent-perspectives)))
(-distinct (append recent all))))
(add-to-list 'persp-activated-functions
(lambda (_) (persp-register-recent (persp-name (get-current-persp)))))
(defun persp-kill-empty ()
"Kill all perspectives without buffers."
(interactive)
(->> (persp-names)
(-map 'persp-get-by-name)
-flatten
(-filter (lambda (p) (= 0 (length (persp-buffers p)))))
(-map 'safe-persp-name)
(-map 'persp-kill)))
(defun persp-kill-other ()
"Kill other perspectives."
(interactive)
(->> (persp-names)
(remove "org")
(remove "none")
(remove (safe-persp-name (get-current-persp)))
(mapc 'persp-kill)))
;; ibuffer integration
(define-ibuffer-filter persp-buffers
"Show Ibuffer with all buffers in the current perspective."
(:description "persp-mode"
:reader (persp-prompt nil nil (safe-persp-name (get-frame-persp)) t))
(with-current-buffer buf
(find buf (safe-persp-buffers (persp-get-by-name qualifier)))))
(defun persp-ibuffer-by-persp (persp)
"Open an IBuffer window showing all buffers in PERSP."
(ibuffer nil (format "*%s Buffers*" persp)
(list (cons 'persp-buffers persp))))
(defun persp-kill-current ()
"Kill current perspective without prompt."
(interactive)
(let ((persp (safe-persp-name (get-current-persp))))
(persp-prev)
(persp-kill persp)))
(defun persp-ibuffer (prompt-for-persp)
(interactive "P")
(let ((persp (if prompt-for-persp
(completing-read "Select perspective:" (persp-names))
(safe-persp-name (get-current-persp)))))
(persp-ibuffer-by-persp persp)))
;; hydra
(defhydra hydra-persp (:hint nil)
"
Perspective: %(safe-persp-name (get-current-persp))
Navigate^^^^ Manage^^ Buffers
^^^^^^^^----------------------------------------------------------
_←_/_→_: prev/next _c_: copy _a_: add
^^ _s_: switch _r_: rename _k_: remove
^^ _h_: hide _C_: kill _K_: kill
^^ _u_: unhide _O_: kill all others _b_: switch
^^^^ ^^ _t_: temporarily display
^^^^ ^^ _B_: ibuffer
"
("<left>" persp-prev)
("<right>" persp-next)
("s" persp-switch)
("h" persp-hide)
("u" persp-unhide)
("c" persp-copy)
("r" persp-rename)
("C" persp-kill-current)
("O" persp-kill-other)
("a" persp-add-buffer)
("k" persp-remove-buffer)
("K" persp-kill-buffer)
("b" persp-switch-to-buffer)
("t" persp-temporarily-display-buffer)
("B" persp-ibuffer :color blue)
("q" nil "quit"))
(define-key persp-mode-map (kbd "C-x X") #'hydra-persp/body))
(provide 'core-persp)
;;; core-persp.el ends here