Use a list of functions for custom window number assignment
This commit is contained in:
parent
e950370d82
commit
bfef4ae6d0
61
README.org
61
README.org
|
@ -196,29 +196,40 @@ Several options are available through Emacs' Customize interface under
|
||||||
|
|
||||||
Default: =t=
|
Default: =t=
|
||||||
|
|
||||||
- =winum-assign-func=
|
- =winum-assign-functions=
|
||||||
|
|
||||||
Function called for each window by =winum-mode=. This is called before
|
List of functions called for each window by `winum-mode'.
|
||||||
automatic assignment begins. The function should return a number to have it
|
|
||||||
assigned to the current-window, =nil= otherwise.
|
|
||||||
|
|
||||||
This function along with `winum-auto-assign-0-to-minibuffer' are the only ways
|
These functions allow for deterministic assignment of numbers to windows. Each
|
||||||
to have 0 assigned to a window.
|
function is called for every window. A function should return the number to be
|
||||||
|
assigned to a window or nil. The /first/ function to output a number for
|
||||||
|
a given window will determine this window's number (if more than 1 function
|
||||||
|
assigns a number a warning will be logged in the messages buffer).
|
||||||
|
|
||||||
|
If the list is empty or if every function returns nil for a given window winum
|
||||||
|
will proceed to automatic number assignment.
|
||||||
|
|
||||||
|
Since this list is meant to allow custom window assignment for /mutiple/
|
||||||
|
packages at once it should never be directly set, only added to and removed
|
||||||
|
from.
|
||||||
|
|
||||||
|
These functions, along with ~winum-auto-assign-0-to-minibuffer~, are the only
|
||||||
|
way to have 0 assigned to a window.
|
||||||
|
|
||||||
Example: always assign *Calculator* the number 9 and *NeoTree* the number 0:
|
Example: always assign *Calculator* the number 9 and *NeoTree* the number 0:
|
||||||
|
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(defun my-winum-assign-func ()
|
(defun winum-assign-9-to-calculator-8-to-flycheck-errors ()
|
||||||
(cond
|
(cond
|
||||||
((equal (buffer-name) "*Calculator*")
|
((equal (buffer-name) "*Calculator*") 9)
|
||||||
9)
|
((equal (buffer-name) "*Flycheck errors*") 8)))
|
||||||
((string-match-p (buffer-name) ".*\\*NeoTree\\*.*")
|
|
||||||
0)
|
|
||||||
(t
|
|
||||||
nil)))
|
|
||||||
|
|
||||||
(setq winum-assign-func 'my-winum-assign-func)
|
(defun winum-assign-0-to-neotree-and ()
|
||||||
#+END_SRC
|
(when (string-match-p (buffer-name) ".*\\*NeoTree\\*.*") 10))
|
||||||
|
|
||||||
|
(add-to-list 'winum-assign-functions #'winum-assign-9-to-calculator-8-to-flycheck-errors)
|
||||||
|
(add-to-list 'winum-assign-functions #'winum-assign-0-to-neotree)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
Default: =nil=
|
Default: =nil=
|
||||||
|
|
||||||
|
@ -268,14 +279,16 @@ available winum options.
|
||||||
|
|
||||||
(require 'winum)
|
(require 'winum)
|
||||||
|
|
||||||
(defun my-winum-assign-func ()
|
(defun winum-assign-9-to-calculator-8-to-flycheck-errors ()
|
||||||
(cond
|
(cond
|
||||||
((equal (buffer-name) "*Calculator*")
|
((equal (buffer-name) "*Calculator*") 9)
|
||||||
9)
|
((equal (buffer-name) "*Flycheck errors*") 8)))
|
||||||
((string-match-p (buffer-name) ".*\\*NeoTree\\*.*")
|
|
||||||
0)
|
(defun winum-assign-0-to-neotree-and ()
|
||||||
(t
|
(when (string-match-p (buffer-name) ".*\\*NeoTree\\*.*") 10))
|
||||||
nil)))
|
|
||||||
|
(add-to-list 'winum-assign-functions #'winum-assign-9-to-calculator-8-to-flycheck-errors)
|
||||||
|
(add-to-list 'winum-assign-functions #'winum-assign-0-to-neotree)
|
||||||
|
|
||||||
(set-face-attribute 'winum-face nil :weight 'bold)
|
(set-face-attribute 'winum-face nil :weight 'bold)
|
||||||
|
|
||||||
|
|
68
winum.el
68
winum.el
|
@ -22,7 +22,7 @@
|
||||||
;; URL: http://github.com/deb0ch/winum.el
|
;; URL: http://github.com/deb0ch/winum.el
|
||||||
;; Created: 2016
|
;; Created: 2016
|
||||||
;; Compatibility: GNU Emacs 24.x
|
;; Compatibility: GNU Emacs 24.x
|
||||||
;; Package-requires: ((cl-lib "0.5"))
|
;; Package-requires: ((cl-lib "0.5") (dash "2.13.0"))
|
||||||
;;
|
;;
|
||||||
;; This file is NOT part of GNU Emacs.
|
;; This file is NOT part of GNU Emacs.
|
||||||
;;
|
;;
|
||||||
|
@ -43,6 +43,7 @@
|
||||||
;;
|
;;
|
||||||
|
|
||||||
(eval-when-compile (require 'cl-lib))
|
(eval-when-compile (require 'cl-lib))
|
||||||
|
(require 'dash)
|
||||||
|
|
||||||
;; Configuration variables -----------------------------------------------------
|
;; Configuration variables -----------------------------------------------------
|
||||||
|
|
||||||
|
@ -92,6 +93,44 @@ Example: always assign *Calculator* the number 9 and *NeoTree* the number 0:
|
||||||
:group 'winum
|
:group 'winum
|
||||||
:type 'function)
|
:type 'function)
|
||||||
|
|
||||||
|
(make-obsolete-variable 'winum-assign-func 'winum-assign-functions "28.05.2017")
|
||||||
|
|
||||||
|
(defcustom winum-assign-functions nil
|
||||||
|
"List of functions called for each window by `winum-mode'.
|
||||||
|
|
||||||
|
These functions allow for deterministic assignment of numbers to windows. Each
|
||||||
|
function is called for every window. A function should return the number to be
|
||||||
|
assigned to a window or nil. The *first* function to output a number for
|
||||||
|
a given window will determine this window's number.
|
||||||
|
|
||||||
|
If the list is empty or if every functions returns nil for a given window winum
|
||||||
|
will proceed to automatic number assignment.
|
||||||
|
|
||||||
|
Since this list is meant to allow custom window assignment for *mutiple*
|
||||||
|
packages at once it should never be directly set, only added to and removed
|
||||||
|
from.
|
||||||
|
|
||||||
|
These functions, along with `winum-auto-assign-0-to-minibuffer', are the only
|
||||||
|
way to have 0 assigned to a window.
|
||||||
|
|
||||||
|
Example: always assign *Calculator* the number 9, *Flycheck-errors* the number 8
|
||||||
|
and *NeoTree* the number 0:
|
||||||
|
|
||||||
|
(defun winum-assign-9-to-calculator-8-to-flycheck-errors ()
|
||||||
|
(cond
|
||||||
|
((equal (buffer-name) \"*Calculator*\") 9)
|
||||||
|
((equal (buffer-name) \"*Flycheck errors*\") 8)))
|
||||||
|
|
||||||
|
(defun winum-assign-0-to-neotree ()
|
||||||
|
(when (string-match-p (buffer-name) \".*\\*NeoTree\\*.*\") 10))
|
||||||
|
|
||||||
|
(add-to-list
|
||||||
|
'winum-assign-functions #'winum-assign-9-to-calculator-8-to-flycheck-errors)
|
||||||
|
(add-to-list
|
||||||
|
'winum-assign-functions #'winum-assign-0-to-neotree)"
|
||||||
|
:group 'winum
|
||||||
|
:type 'list)
|
||||||
|
|
||||||
(defcustom winum-auto-setup-mode-line t
|
(defcustom winum-auto-setup-mode-line t
|
||||||
"When nil, `winum-mode' will not display window numbers in the mode-line.
|
"When nil, `winum-mode' will not display window numbers in the mode-line.
|
||||||
You might want this to be nil if you use a package that already manages window
|
You might want this to be nil if you use a package that already manages window
|
||||||
|
@ -398,14 +437,8 @@ POSITION: position in the mode-line."
|
||||||
winum--remaining (winum--available-numbers))
|
winum--remaining (winum--available-numbers))
|
||||||
(winum--set-window-vector (make-vector (1+ winum--window-count) nil))
|
(winum--set-window-vector (make-vector (1+ winum--window-count) nil))
|
||||||
(clrhash (winum--get-numbers-table))
|
(clrhash (winum--get-numbers-table))
|
||||||
(when winum-assign-func
|
(when winum-assign-functions
|
||||||
(mapc (lambda (w)
|
(-each windows #'winum--try-to-find-custom-number))
|
||||||
(with-selected-window w
|
|
||||||
(with-current-buffer (window-buffer w)
|
|
||||||
(let ((num (funcall winum-assign-func)))
|
|
||||||
(when num
|
|
||||||
(winum--assign w num))))))
|
|
||||||
windows))
|
|
||||||
(when (and winum-auto-assign-0-to-minibuffer
|
(when (and winum-auto-assign-0-to-minibuffer
|
||||||
(active-minibuffer-window)
|
(active-minibuffer-window)
|
||||||
(not (winum-get-window-by-number 0)))
|
(not (winum-get-window-by-number 0)))
|
||||||
|
@ -413,6 +446,23 @@ POSITION: position in the mode-line."
|
||||||
(dolist (w windows)
|
(dolist (w windows)
|
||||||
(winum--assign w))))
|
(winum--assign w))))
|
||||||
|
|
||||||
|
(defun winum--try-to-find-custom-number (window)
|
||||||
|
"Try to find and assign a custom number for WINDOW.
|
||||||
|
Do so by trying every function in `winum-assign-functions' and assign the
|
||||||
|
*first* non nil integer.
|
||||||
|
When multiple functions assign a number to a window log a warning and use the
|
||||||
|
first number anyway."
|
||||||
|
(with-selected-window window
|
||||||
|
(with-current-buffer (window-buffer window)
|
||||||
|
(let* ((nums (->> winum-assign-functions
|
||||||
|
(--map (cons it (funcall it)))
|
||||||
|
(--remove (null (cdr it)))))
|
||||||
|
(num (-> nums (cl-first) (cdr))))
|
||||||
|
(when (> (length nums) 1)
|
||||||
|
(message "Winum conflict - window %s was assigned a number by multiple custom assign functions: '%s'"
|
||||||
|
window (--map (format "%s -> %s" (car it) (cdr it)) nums)))
|
||||||
|
(when (integerp num) (winum--assign window num))))))
|
||||||
|
|
||||||
(defun winum--assign (window &optional number)
|
(defun winum--assign (window &optional number)
|
||||||
"Assign to window WINDOW the number NUMBER.
|
"Assign to window WINDOW the number NUMBER.
|
||||||
If NUMBER is not specified, determine it first based on `winum--remaining'.
|
If NUMBER is not specified, determine it first based on `winum--remaining'.
|
||||||
|
|
Loading…
Reference in a new issue