emacs-winum/README.org

260 lines
8.4 KiB
Org Mode
Raw Normal View History

2016-11-29 21:11:05 -05:00
#+TITLE: Window numbers for Emacs !
2016-12-17 06:58:52 -05:00
[[https://github.com/syl20bnr/spacemacs][file:https://cdn.rawgit.com/syl20bnr/spacemacs/442d025779da2f62fc86c2082703697714db6514/assets/spacemacs-badge.svg]] [[https://melpa.org/#/winum][file:https://melpa.org/packages/winum-badge.svg]]
2016-11-29 21:11:05 -05:00
* Contents :TOC:
- [[#introduction][Introduction]]
- [[#installation][Installation]]
2016-12-17 06:58:52 -05:00
- [[#using-melpa][Using Melpa]]
- [[#manual-installation][Manual installation]]
2016-11-29 21:11:05 -05:00
- [[#how-to-use][How to use]]
- [[#configuration][Configuration]]
2016-12-12 04:20:39 -05:00
- [[#keybindings][Keybindings]]
2016-11-29 21:11:05 -05:00
- [[#customize-options][Customize options]]
2016-12-05 08:59:28 -05:00
- [[#configuration-file-example][Configuration file example]]
2016-11-29 21:11:05 -05:00
* Introduction
Window numbers for Emacs: Navigate your windows and frames using numbers !
This package is an extended and actively maintained version of the
2016-12-17 06:58:52 -05:00
[[https://github.com/nschum/window-numbering.el][window-numbering]] package by Nikolaj Schumacher, with some ideas and code taken
from [[https://github.com/abo-abo/ace-window][ace-window]].
2016-11-29 21:11:05 -05:00
This version brings, among other things, support for number sets across multiple
frames, giving the user a smoother experience of multi-screen Emacs.
* Installation
2016-12-17 06:58:52 -05:00
** Using Melpa
The recommended way of installing =winum= is from the [[https://melpa.org/#/winum][Melpa]] package repository:
#+BEGIN_SRC emacs-lisp
M-x package-install RET winum RET
#+END_SRC
You will find instructions to setup Melpa [[https://github.com/melpa/melpa#usage][here]] if you don't have it setup yet.
Once the package is installed, you will need to activate =winum-mode= in your
Emacs configuration:
#+BEGIN_SRC emacs-lisp
(require 'winum)
(winum-mode)
#+END_SRC
** Manual installation
2016-11-29 21:11:05 -05:00
- Clone the repo:
#+BEGIN_SRC shell
cd /path/to/install/folder
git clone https://github.com/deb0ch/winum.el
#+END_SRC
- Add the following to your Emacs configuration:
#+BEGIN_SRC emacs-lisp
(add-to-list 'load-path "/path/to/install/folder/winum.el/")
(require 'winum)
2016-11-29 21:11:05 -05:00
(winum-mode)
2016-11-29 21:11:05 -05:00
#+END_SRC
* How to use
| Key binding | Description |
|-------------+---------------------------------------------------------------------------------------------|
| ~C-x w <n>~ | select window <n>, where <n> ranges from 0 to 9. A negative argument deletes the window. |
| ~C-x w `~ | select window by number. Number can be given as prefix arg or will be read from minibuffer. |
2016-12-05 08:59:28 -05:00
- =select-window-0-or-10=
2016-12-17 07:15:20 -05:00
By default, ~C-x w 0~ is bound to =select-window-0-or-10=. If window 0 is not
assigned, it will act on the window 10 instead.
2016-12-05 08:59:28 -05:00
You can rebind this to the more straightforward =select-window-0= if you
prefer.
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
- =select-window-by-number=
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
If you happen to have more than 10 windows, you can use the
=select-window-by-number= function, bound by default to ~C-x w `~.
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
This function allows several ways to input the window number:
- Use a numbered prefix argument.\\
*Ex:* ~C-1 C-2 C-x w `~ to select window 12.
2016-12-05 08:59:28 -05:00
- Use a negative prefix argument to delete the window.\\
*Ex:* ~C-- C-1 C-2 C-x w `~ to delete window 12.
2016-12-05 08:59:28 -05:00
- Use the negative prefix argument to delete window 0.\\
*Ex:* ~C-- C-x w `~ to delete window 0.
2016-12-05 08:59:28 -05:00
- Use the default prefix argument to delete current window.\\
*Ex:* ~C-u C-x w `~ to delete current window.
2016-12-05 08:59:28 -05:00
- If no prefix argument ig given, a number is read from minibuffer. A negative
input will delete the window instead of selecting it.
2016-11-29 21:11:05 -05:00
* Configuration
2016-12-12 04:20:39 -05:00
** Keybindings
By default, all key bindings are prefixed with a value stored in
2016-12-17 06:58:52 -05:00
=winum-keymap-prefix=, by default ~C-x w~. See [[#customize-options][Customize options]].
2016-12-15 12:29:38 -05:00
The default prefix is ~C-x w~ for compatibility with native Emacs bindings.
However, it gives long key bindings and can be incomfortable to use.
2016-12-17 06:58:52 -05:00
For instance, you could replace the native prefix with ~C-c~ or ~M-m~.
2016-12-15 12:29:38 -05:00
If you prefer no to use a prefix to have even shorter bindings, you can also
directly override =winum-keymap=:
2016-12-05 08:59:28 -05:00
#+BEGIN_SRC emacs-lisp
(require 'winum)
2016-12-15 12:29:38 -05:00
(setcdr (assoc 'winum-mode minor-mode-map-alist)
(let ((map (make-sparse-keymap)))
(define-key map (kbd "C-`") 'winum-select-window-by-number)
(define-key map (kbd "M-0") 'winum-select-window-0-or-10)
(define-key map (kbd "M-1") 'winum-select-window-1)
(define-key map (kbd "M-2") 'winum-select-window-2)
(define-key map (kbd "M-3") 'winum-select-window-3)
(define-key map (kbd "M-4") 'winum-select-window-4)
(define-key map (kbd "M-5") 'winum-select-window-5)
(define-key map (kbd "M-6") 'winum-select-window-6)
(define-key map (kbd "M-7") 'winum-select-window-7)
(define-key map (kbd "M-8") 'winum-select-window-8)
map))
2016-12-05 08:59:28 -05:00
(winum-mode)
2016-11-29 21:11:05 -05:00
#+END_SRC
2016-12-15 12:29:38 -05:00
This is a little bit hacky but is less code than using =define-key=, and will
also shadow the old bindings.
2016-11-29 21:11:05 -05:00
2016-12-17 07:15:20 -05:00
*NB:* the ~`~ key is convenient on qwerty keyboards, however if you are using a
different keyboard you should replace it with the key beside ~1~.
For instance, ~²~ on an azerty keyboard.
2016-12-15 12:29:38 -05:00
** Customize options
2016-12-05 08:59:28 -05:00
Several options are available through Emacs' Customize interface under
=convenience= > =winum=:
2016-11-29 21:11:05 -05:00
- =winum-scope=
2016-11-29 21:11:05 -05:00
2016-12-17 07:15:20 -05:00
Frames affected by a number set. Choices are 'frame-local 'visible or
'global.
2016-11-29 21:11:05 -05:00
2016-12-17 07:15:20 -05:00
Default: 'global
2016-11-29 21:11:05 -05:00
- =winum-reverse-frame-list=
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
If t, order frames by reverse order of creation. Has effect only when
2016-12-17 07:15:20 -05:00
=winum-scope= is not 'frame-local.
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
Default: =nil=
2016-11-29 21:11:05 -05:00
- =winum-auto-assign-0-to-minibuffer=
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
If non-nil, =winum-mode= assigns 0 to the minibuffer if active.
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
Default: =t=
2016-11-29 21:11:05 -05:00
- =winum-assign-func=
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
Function called for each window by =winum-mode=. This is called before
automatic assignment begins. The function should return a number to have it
assigned to the current-window, =nil= otherwise.
2016-11-29 21:11:05 -05:00
2016-12-17 07:59:18 -05:00
This function along with `winum-auto-assign-0-to-minibuffer' are the only ways
to have 0 assigned to a window.
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
Example: always assign *Calculator* the number 9 and *NeoTree* the number 0:
2016-11-29 21:11:05 -05:00
#+BEGIN_SRC emacs-lisp
2016-12-05 08:59:28 -05:00
(defun my-winum-assign-func ()
(cond
((equal (buffer-name) "*Calculator*")
9)
((string-match-p (buffer-name) ".*\\*NeoTree\\*.*")
0)
(t
nil)))
(setq winum-assign-func 'my-winum-assign-func)
2016-11-29 21:11:05 -05:00
#+END_SRC
2016-12-17 07:59:18 -05:00
Default: =nil=
2016-12-04 14:38:42 -05:00
- =winum-auto-setup-mode-line=
2016-12-05 08:59:28 -05:00
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
numbers in the mode-line.
2016-12-04 14:38:42 -05:00
2016-12-05 08:59:28 -05:00
Default: =t=
2016-12-04 14:38:42 -05:00
- =winum-mode-line-position=
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
The position in the mode-line =winum-mode= displays the number.
2016-11-29 21:11:05 -05:00
2016-12-17 07:15:20 -05:00
Default: =1=
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
- =winum-ignored-buffers=
2016-11-29 21:11:05 -05:00
2016-12-17 07:59:18 -05:00
List of buffers to ignore when assigning numbers.
2016-11-29 21:11:05 -05:00
2016-12-12 04:20:39 -05:00
Default: '(" *which-key*")
2016-11-29 21:11:05 -05:00
2016-12-15 12:29:38 -05:00
- =winum-keymap-prefix=
Prefix key sequence for keybindings.
2016-12-17 07:15:20 -05:00
Default: =(kbd "C-x w")=
2016-12-15 12:29:38 -05:00
2016-12-05 08:59:28 -05:00
- face: =winum-face=
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
Face used for the number in the mode-line.
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
** Configuration file example
Here is an example that you could put in your =.emacs=, which includes all
available winum options.
#+BEGIN_SRC emacs-lisp
(add-to-list 'load-path "/path/to/install/folder/winum.el/")
(require 'winum)
2016-11-29 21:11:05 -05:00
2016-12-15 12:29:38 -05:00
(setcdr (assoc 'winum-mode minor-mode-map-alist)
(let ((map (make-sparse-keymap)))
(define-key map (kbd "C-`") 'winum-select-window-by-number)
(define-key map (kbd "M-0") 'winum-select-window-0-or-10)
(define-key map (kbd "M-1") 'winum-select-window-1)
(define-key map (kbd "M-2") 'winum-select-window-2)
(define-key map (kbd "M-3") 'winum-select-window-3)
(define-key map (kbd "M-4") 'winum-select-window-4)
(define-key map (kbd "M-5") 'winum-select-window-5)
(define-key map (kbd "M-6") 'winum-select-window-6)
(define-key map (kbd "M-7") 'winum-select-window-7)
(define-key map (kbd "M-8") 'winum-select-window-8)
map))
2016-12-05 08:59:28 -05:00
(defun my-winum-assign-func ()
(cond
((equal (buffer-name) "*Calculator*")
9)
((string-match-p (buffer-name) ".*\\*NeoTree\\*.*")
0)
(t
nil)))
2016-12-15 12:29:38 -05:00
(set-face-attribute 'winum-face nil :weight 'bold)
2016-12-05 08:59:28 -05:00
(setq window-numbering-scope 'global
winum-reverse-frame-list nil
winum-auto-assign-0-to-minibuffer t
winum-assign-func 'my-winum-assign-func
winum-auto-setup-mode-line t
winum-mode-line-position 1
winum-ignored-buffers '(" *which-key*")
2016-12-15 12:29:38 -05:00
winum-keymap-prefix nil)
2016-11-29 21:11:05 -05:00
2016-12-05 08:59:28 -05:00
(winum-mode)
#+END_SRC