[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 56ef753 06/14: Allow to midway switch from less than 3 win
From: |
Oleh Krehel |
Subject: |
[elpa] master 56ef753 06/14: Allow to midway switch from less than 3 windows |
Date: |
Thu, 04 Jun 2015 17:05:15 +0000 |
branch: master
commit 56ef753268de8dffebaa96607fb9f0246ebe9d0f
Author: Oleh Krehel <address@hidden>
Commit: Oleh Krehel <address@hidden>
Allow to midway switch from less than 3 windows
* ace-window.el (aw-dispatch-always): New defcustom to enable the
permanent dispatch.
(aw--flip-keys): Remove defvar.
(aw-flip-keys): Remove defcustom, use `aw-dispatch-alist' instead.
(aw-dispatch-alist): New defcustom.
(aw-dispatch-default): Update.
(aw-select): Do a dispatch when `aw-dispatch-always' is non-nil.
(ace-delete-window):
(ace-swap-window):
(ace-maximize-window): Use callback-style, so that it's possible to
switch the action during the selection.
(aw--pop-window): Update for empty stack and only two windows.
Fixes #44
---
ace-window.el | 151 ++++++++++++++++++++++++++++++--------------------------
1 files changed, 81 insertions(+), 70 deletions(-)
diff --git a/ace-window.el b/ace-window.el
index 73808fd..20fe1e4 100644
--- a/ace-window.el
+++ b/ace-window.el
@@ -101,6 +101,12 @@ Use M-0 `ace-window' to toggle this value."
(const :tag "single char" 'char)
(const :tag "full path" 'path)))
+(defcustom aw-dispatch-always nil
+ "When non-nil, `ace-window' will issue a `read-char' even for one window.
+This will make `ace-window' act different from `other-window' for
+ one or two windows."
+ :type 'boolean)
+
(defface aw-leading-char-face
'((((class color)) (:foreground "red"))
(((background dark)) (:foreground "gray100"))
@@ -215,15 +221,9 @@ LEAF is (PT . WND)."
ol))
wnd-list))))
-(defvar aw--flip-keys nil
- "Pre-processed `aw-flip-keys'.")
-
-(defcustom aw-flip-keys '("n")
- "Keys which should select the last window."
- :set (lambda (sym val)
- (set sym val)
- (setq aw--flip-keys
- (mapcar (lambda (x) (aref (kbd x) 0)) val))))
+(define-obsolete-variable-alias
+ 'aw-flip-keys 'aw--flip-keys "0.1.0"
+ "Use `aw-dispatch-alist' instead.")
(defvar aw-dispatch-function 'aw-dispatch-default
"Function to call when a character not in `aw-keys' is pressed.")
@@ -236,24 +236,26 @@ LEAF is (PT . WND)."
(setq ace-window-mode str)
(force-mode-line-update))
+(defvar aw-dispatch-alist
+ '((?x aw-delete-window " Ace - Delete Window")
+ (?m aw-swap-window " Ace - Swap Window")
+ (?n aw-flip-window)
+ (?v aw-split-window-vert " Ace - Split Vert Window")
+ (?b aw-split-window-horz " Ace - Split Horz Window")
+ (?i delete-other-windows " Ace - Maximize Window")
+ (?o delete-other-windows))
+ "List of actions for `aw-dispatch-default'.")
+
(defun aw-dispatch-default (char)
- (cond ((eq char ?x)
- (setq aw-action #'aw-delete-window)
- (aw-set-mode-line " Ace - Delete Window"))
- ((eq char ?m)
- (setq aw-action #'aw-swap-window)
- (aw-set-mode-line " Ace - Swap Window"))
- ((memq char aw--flip-keys)
- (aw-flip-window)
- (throw 'done 'exit))
- ((eq char ?v)
- (setq aw-action #'aw-split-window-vert)
- (aw-set-mode-line " Ace - Split Vert Window"))
- ((eq char ?b)
- (setq aw-action #'aw-split-window-horz)
- (aw-set-mode-line " Ace - Split Horz Window"))
- (t
- (avy-handler-default char))))
+ "Perform an action depending on CHAR."
+ (let ((val (cdr (assoc char aw-dispatch-alist))))
+ (if val
+ (if (and (car val) (cadr val))
+ (prog1 (setq aw-action (car val))
+ (aw-set-mode-line (cadr val)))
+ (funcall (car val))
+ (throw 'done 'exit))
+ (avy-handler-default char))))
(defun aw-select (mode-line &optional action)
"Return a selected other window.
@@ -266,40 +268,45 @@ Amend MODE-LINE to the mode line for the duration of the
selection."
(wnd-list (aw-window-list))
window)
(setq window
- (cl-case (length wnd-list)
- (0
- start-window)
- (1
- (car wnd-list))
- (2
- (let ((wnd (next-window nil nil next-window-scope)))
- (while (and (aw-ignored-p wnd)
- (not (equal wnd start-window)))
- (setq wnd (next-window wnd nil next-window-scope)))
- wnd))
- (t
- (let ((candidate-list
- (mapcar (lambda (wnd)
- ;; can't jump if the buffer is empty
- (with-current-buffer (window-buffer wnd)
- (when (= 0 (buffer-size))
- (insert " ")))
- (cons (aw-offset wnd) wnd))
- wnd-list)))
- (aw--make-backgrounds wnd-list)
- (aw-set-mode-line mode-line)
- ;; turn off helm transient map
- (remove-hook 'post-command-hook 'helm--maybe-update-keymap)
- (unwind-protect
- (let* ((avy-handler-function aw-dispatch-function)
- (res (avy-read (avy-tree candidate-list aw-keys)
- #'aw--lead-overlay
- #'avy--remove-leading-chars)))
- (if (eq res 'exit)
- (setq aw-action nil)
- (or (cdr res)
- start-window)))
- (aw--done))))))
+ (cond ((<= (length wnd-list) 1)
+ (when aw-dispatch-always
+ (setq aw-action
+ (unwind-protect
+ (catch 'done
+ (funcall aw-dispatch-function (read-char)))
+ (aw--done)))
+ (when (eq aw-action 'exit)
+ (setq aw-action nil)))
+ (or (car wnd-list) start-window))
+ ((and (= (length wnd-list) 2) (not aw-dispatch-always))
+ (let ((wnd (next-window nil nil next-window-scope)))
+ (while (and (aw-ignored-p wnd)
+ (not (equal wnd start-window)))
+ (setq wnd (next-window wnd nil next-window-scope)))
+ wnd))
+ (t
+ (let ((candidate-list
+ (mapcar (lambda (wnd)
+ ;; can't jump if the buffer is empty
+ (with-current-buffer (window-buffer wnd)
+ (when (= 0 (buffer-size))
+ (insert " ")))
+ (cons (aw-offset wnd) wnd))
+ wnd-list)))
+ (aw--make-backgrounds wnd-list)
+ (aw-set-mode-line mode-line)
+ ;; turn off helm transient map
+ (remove-hook 'post-command-hook 'helm--maybe-update-keymap)
+ (unwind-protect
+ (let* ((avy-handler-function aw-dispatch-function)
+ (res (avy-read (avy-tree candidate-list aw-keys)
+ #'aw--lead-overlay
+ #'avy--remove-leading-chars)))
+ (if (eq res 'exit)
+ (setq aw-action nil)
+ (or (cdr res)
+ start-window)))
+ (aw--done))))))
(if aw-action
(funcall aw-action window)
window)))
@@ -316,23 +323,22 @@ Amend MODE-LINE to the mode line for the duration of the
selection."
(defun ace-delete-window ()
"Ace delete window."
(interactive)
- (aw-delete-window
- (aw-select " Ace - Delete Window")))
+ (aw-select " Ace - Delete Window"
+ #'aw-delete-window))
;;;###autoload
(defun ace-swap-window ()
"Ace swap window."
(interactive)
- (aw-swap-window
- (aw-select " Ace - Swap Window")))
+ (aw-select " Ace - Swap Window"
+ #'aw-swap-window))
;;;###autoload
(defun ace-maximize-window ()
"Ace maximize window."
(interactive)
- (select-window
- (aw-select " Ace - Maximize Window"))
- (delete-other-windows))
+ (aw-select " Ace - Maximize Window"
+ #'delete-other-windows))
;;;###autoload
(defun ace-window (arg)
@@ -392,10 +398,15 @@ Windows are numbered top down, left to right."
"Return the removed top of `aw--window-ring'."
(let (res)
(condition-case nil
- (while (not (window-live-p
- (setq res (ring-remove aw--window-ring 0)))))
+ (while (or (not (window-live-p
+ (setq res (ring-remove aw--window-ring 0))))
+ (equal res (selected-window))))
(error
- (error "No previous windows stored")))
+ (if (= (length (aw-window-list)) 2)
+ (progn
+ (other-window 1)
+ (setq res (selected-window)))
+ (error "No previous windows stored"))))
res))
(defun aw-switch-to-window (window)
- [elpa] master updated (77c062f -> a4ab5a4), Oleh Krehel, 2015/06/04
- [elpa] master 4357c90 02/14: Add a require, Oleh Krehel, 2015/06/04
- [elpa] master cf91510 05/14: README.md: Add a section on midway switch, Oleh Krehel, 2015/06/04
- [elpa] master e777570 04/14: Allow to change window action midway, Oleh Krehel, 2015/06/04
- [elpa] master 1487ae1 07/14: Update README.md, Oleh Krehel, 2015/06/04
- [elpa] master eef897e 08/14: Update README.md, Oleh Krehel, 2015/06/04
- [elpa] master dd84ff6 09/14: Fix aw-ignore-current for 3 windows, Oleh Krehel, 2015/06/04
- [elpa] master 56ef753 06/14: Allow to midway switch from less than 3 windows,
Oleh Krehel <=
- [elpa] master c82d439 03/14: Update requires, Oleh Krehel, 2015/06/04
- [elpa] master 155b6c6 11/14: ace-window.el: Bump version, Oleh Krehel, 2015/06/04
- [elpa] master 4546f20 01/14: Allow to switch the action in the middle of ace-window, Oleh Krehel, 2015/06/04
- [elpa] master e5638b1 12/14: ace-window.el (aw-swap-invert): New defcustom, Oleh Krehel, 2015/06/04
- [elpa] master 243ee46 10/14: Allow to switch to all empty buffers (read-only as well), Oleh Krehel, 2015/06/04
- [elpa] master 97a2f93 13/14: Small changes to README, Oleh Krehel, 2015/06/04
- [elpa] master a4ab5a4 14/14: Merge commit '97a2f9340b19c1b8c31455b3219fb88f39d38f1b' from ace-window, Oleh Krehel, 2015/06/04