branch: master commit 243ee467fce4017598deed3f72cad5e128fd762b Author: Oleh Krehel <ohwoeo...@gmail.com> Commit: Oleh Krehel <ohwoeo...@gmail.com>
Allow to switch to all empty buffers (read-only as well) * ace-window.el (aw-window-list): Stop filtering out empty read-only buffers. (aw-empty-buffers-list): New defvar, store empty buffers here. (aw--done): Return empty buffers to their empty state (they had a single space inserted in order for overlay to work). (aw--lead-overlay): Insert a space into an empty buffer. (aw-select): Move inserting a space into `aw--lead-overlay'. --- ace-window.el | 87 ++++++++++++++++++++++++++++++-------------------------- 1 files changed, 47 insertions(+), 40 deletions(-) diff --git a/ace-window.el b/ace-window.el index 0a9d9b8..96403f9 100644 --- a/ace-window.el +++ b/ace-window.el @@ -136,15 +136,11 @@ This will make `ace-window' act different from `other-window' for (sort (cl-remove-if (lambda (w) - (let ((f (window-frame w)) - (b (window-buffer w))) + (let ((f (window-frame w))) (or (not (and (frame-live-p f) (frame-visible-p f))) (string= "initial_terminal" (terminal-name f)) - (aw-ignored-p w) - (with-current-buffer b - (and buffer-read-only - (= 0 (buffer-size b))))))) + (aw-ignored-p w)))) (cl-case aw-scope (global (cl-mapcan #'window-list (frame-list))) @@ -165,6 +161,10 @@ This will make `ace-window' act different from `other-window' for (nconc minor-mode-alist (list '(ace-window-mode ace-window-mode)))) +(defvar aw-empty-buffers-list nil + "Store the read-only empty buffers which had to be modified. +Modify them back eventually.") + (defun aw--done () "Clean up mode line and overlays." ;; mode line @@ -172,41 +172,52 @@ This will make `ace-window' act different from `other-window' for ;; background (mapc #'delete-overlay aw-overlays-back) (setq aw-overlays-back nil) - (avy--remove-leading-chars)) + (avy--remove-leading-chars) + (dolist (b aw-empty-buffers-list) + (with-current-buffer b + (when (string= (buffer-string) " ") + (let ((inhibit-read-only t)) + (delete-region (point-min) (point-max)))))) + (setq aw-empty-buffers-list nil)) (defun aw--lead-overlay (path leaf) "Create an overlay using PATH at LEAF. LEAF is (PT . WND)." - (let* ((pt (car leaf)) - (wnd (cdr leaf)) - (ol (make-overlay pt (1+ pt) (window-buffer wnd))) - (old-str (or - (ignore-errors - (with-selected-window wnd - (buffer-substring pt (1+ pt)))) - "")) - (new-str - (concat - (cl-case aw-leading-char-style - (char - (apply #'string (last path))) - (path - (apply #'string (reverse path))) - (t - (error "Bad `aw-leading-char-style': %S" - aw-leading-char-style))) - (cond ((string-equal old-str "\t") - (make-string (1- tab-width) ?\ )) - ((string-equal old-str "\n") - "\n") + (let ((wnd (cdr leaf))) + (with-selected-window wnd + (when (= 0 (buffer-size)) + (push (current-buffer) aw-empty-buffers-list) + (let ((inhibit-read-only t)) + (insert " "))) + (let* ((pt (car leaf)) + (ol (make-overlay pt (1+ pt) (window-buffer wnd))) + (old-str (or + (ignore-errors + (with-selected-window wnd + (buffer-substring pt (1+ pt)))) + "")) + (new-str + (concat + (cl-case aw-leading-char-style + (char + (apply #'string (last path))) + (path + (apply #'string (reverse path))) (t - (make-string - (max 0 (1- (string-width old-str))) - ?\ )))))) - (overlay-put ol 'face 'aw-leading-char-face) - (overlay-put ol 'window wnd) - (overlay-put ol 'display new-str) - (push ol avy--overlays-lead))) + (error "Bad `aw-leading-char-style': %S" + aw-leading-char-style))) + (cond ((string-equal old-str "\t") + (make-string (1- tab-width) ?\ )) + ((string-equal old-str "\n") + "\n") + (t + (make-string + (max 0 (1- (string-width old-str))) + ?\ )))))) + (overlay-put ol 'face 'aw-leading-char-face) + (overlay-put ol 'window wnd) + (overlay-put ol 'display new-str) + (push ol avy--overlays-lead))))) (defun aw--make-backgrounds (wnd-list) "Create a dim background overlay for each window on WND-LIST." @@ -289,10 +300,6 @@ Amend MODE-LINE to the mode line for the duration of the selection." (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)