Changeset - 1e66f33e06be
[Not reviewed]
0 2 0
Sergey Pashinin - 11 years ago 2014-08-03 19:30:32
sergey@pashinin.com
Added optional switch arg to restore function
2 files changed with 23 insertions and 20 deletions:
0 comments (0 inline, 0 general)
src/workgroups-buf.el
Show inline comments
 
@@ -21,107 +21,110 @@
 
(require 'workgroups-pickel)
 
(require 'workgroups-specialbufs)
 
(require 'workgroups-structs)
 

	
 
;;; Variables
 

	
 
(defvar wg-buffer-workgroup nil
 
  "A workgroup in which this buffer most recently appeared.
 
Buffer-local.")
 
(make-variable-buffer-local 'wg-buffer-workgroup)
 

	
 
(defcustom wg-default-buffer "*scratch*"
 
  "Show this in case everything else fails.
 
When a buffer can't be restored, when creating a blank wg."
 
  :type 'string
 
  :group 'workgroups)
 

	
 

	
 
;;; Functions
 

	
 
(defmacro wg-buf-list ()
 
  "Setf'able `wg-current-session' buf-list slot accessor."
 
  `(wg-session-buf-list (wg-current-session)))
 

	
 
(defun wg-restore-default-buffer ()
 
  "Switch to `wg-default-buffer'."
 
  (switch-to-buffer wg-default-buffer t))
 

	
 
(defun wg-restore-existing-buffer (buf)
 
  "Just switch to and return existing buffer."
 
  (wg-awhen (wg-find-buf-in-buffer-list buf (buffer-list))
 
    (switch-to-buffer it t)
 
(defun wg-restore-default-buffer (&optional switch)
 
  "Return `wg-default-buffer' and maybe SWITCH to it."
 
  (if switch
 
      (switch-to-buffer wg-default-buffer t)
 
    (get-buffer-create wg-default-buffer)))
 

	
 
(defun wg-restore-existing-buffer (buf &optional switch)
 
  "Return existing buffer from BUF and maybe SWITCH to it."
 
  (wg-awhen (wg-find-buf-in-buffer-list buf (wg-buffer-list-emacs))
 
    (if switch (switch-to-buffer it t))
 
    (wg-set-buffer-uid-or-error (wg-buf-uid buf))
 
    it))
 

	
 
(defun wg-restore-file-buffer (buf)
 
  "Restore BUF by finding its file.  Return the created buffer.
 
(defun wg-restore-file-buffer (buf &optional switch)
 
  "Restore BUF by finding its file and maybe SWITCH to it.
 
Return the created buffer.
 
If BUF's file doesn't exist, call `wg-restore-default-buffer'"
 
  (wg-when-let ((file-name (wg-buf-file-name buf)))
 
    (when (or wg-restore-remote-buffers
 
              (not (file-remote-p file-name)))
 
      (cond ((file-exists-p file-name)
 
             (find-file file-name)
 
             (rename-buffer (wg-buf-name buf) t)
 
             (wg-set-buffer-uid-or-error (wg-buf-uid buf))
 
             (when wg-restore-mark
 
               (set-mark (wg-buf-mark buf))
 
               (deactivate-mark))
 
             (wg-deserialize-buffer-local-variables buf)
 
             (current-buffer))
 
            (t
 
             ;; try directory
 
             (if (not (file-remote-p file-name))
 
                 (if (file-directory-p (file-name-directory file-name))
 
                     (progn
 
                       (dired (file-name-directory file-name))
 
                       (current-buffer))
 
                   (progn
 
                     (message "Attempt to restore nonexistent file: %S" file-name)
 
                     nil))
 
               nil)
 
             )))))
 

	
 
(defun wg-restore-special-buffer (buf)
 
  "Restore a buffer BUF with DESERIALIZER-FN."
 
(defun wg-restore-special-buffer (buf &optional switch)
 
  "Restore a buffer BUF with DESERIALIZER-FN and maybe SWITCH to it."
 
  (wg-when-let
 
      ((special-data (wg-buf-special-data buf))
 
       (buffer (save-window-excursion
 
                 (condition-case err
 
                     (funcall (car special-data) buf)
 
                   (error (message "Error deserializing %S: %S"
 
                                   (wg-buf-name buf) err)
 
                          nil)))))
 
    (switch-to-buffer buffer t)
 
    (if switch (switch-to-buffer it t))
 
    (wg-set-buffer-uid-or-error (wg-buf-uid buf))
 
    buffer))
 

	
 
(defun wg-restore-buffer (buf)
 
  "Restore BUF and return it."
 
  (or (wg-restore-existing-buffer buf)
 
      (wg-restore-special-buffer buf)
 
      (wg-restore-file-buffer buf)
 
      (progn (wg-restore-default-buffer) nil)))
 
(defun wg-restore-buffer (buf &optional switch)
 
  "Restore BUF, return it and maybe SWITCH to it."
 
  (or (wg-restore-existing-buffer buf switch)
 
      (wg-restore-special-buffer buf switch)
 
      (wg-restore-file-buffer buf switch)
 
      (progn (wg-restore-default-buffer switch) nil)))
 

	
 

	
 
;;; buffer object utils
 

	
 
(defun wg-buffer-uid (buffer-or-name)
 
  "Return BUFFER-OR-NAME's buffer-local value of `wg-buffer-uid'."
 
  (buffer-local-value 'wg-buffer-uid (wg-get-buffer buffer-or-name)))
 

	
 
(defun wg-bufobj-uid (bufobj)
 
  "Return BUFOBJ's uid."
 
  (cl-etypecase bufobj
 
    (buffer (wg-buffer-uid bufobj))
 
    (wg-buf (wg-buf-uid bufobj))
 
    (string (wg-bufobj-uid (wg-get-buffer bufobj)))))
 

	
 
(defun wg-bufobj-name (bufobj)
 
  "Return BUFOBJ's buffer name."
 
  (cl-etypecase bufobj
 
    (buffer (buffer-name bufobj))
 
    (wg-buf (wg-buf-name bufobj))
 
    (string (wg-buffer-name bufobj))))
 

	
 
(defun wg-bufobj-file-name (bufobj)
 
  "Return BUFOBJ's filename."
src/workgroups-win.el
Show inline comments
 
@@ -103,49 +103,49 @@
 

	
 

	
 
(defun wg-restore-window-positions (win &optional window)
 
  "Restore various positions in WINDOW from their values in WIN."
 
  (let ((window (or window (selected-window))))
 
    (wg-with-slots win
 
        ((win-point wg-win-point)
 
         (win-start wg-win-start)
 
         (win-hscroll wg-win-hscroll))
 
      (set-window-start window win-start t)
 
      (set-window-hscroll window win-hscroll)
 
      (set-window-point
 
       window
 
       (cond ((not wg-restore-point) win-start)
 
             ((eq win-point :max) (point-max))
 
             (t win-point)))
 
      (when (>= win-start (point-max)) (recenter)))))
 

	
 
(defun wg-restore-window (win)
 
  "Restore WIN in `selected-window'."
 
  (let ((selwin (selected-window))
 
        (buf (wg-find-buf-by-uid (wg-win-buf-uid win))))
 
    (if (not buf)
 
        (wg-restore-default-buffer)
 
      (when (wg-restore-buffer buf)
 
      (when (wg-restore-buffer buf t)
 
        (wg-restore-window-positions win selwin)
 
        (when wg-restore-window-dedicated-p
 
          (set-window-dedicated-p selwin (wg-win-dedicated win)))))
 
    (ignore-errors
 
      (set-window-prev-buffers
 
       selwin (wg-unpickel (wg-win-parameter win 'prev-buffers)))
 
      (set-window-next-buffers
 
       selwin (wg-unpickel (wg-win-parameter win 'next-buffers)))
 
      )))
 

	
 

	
 
(defun wg-window-point (ewin)
 
  "Return `point' or :max.  See `wg-restore-point-max'.
 
EWIN should be an Emacs window object."
 
  (let ((p (window-point ewin)))
 
    (if (and wg-restore-point-max (= p (point-max))) :max p)))
 

	
 
(defun wg-win-parameter (win parameter &optional default)
 
  "Return WIN's value for PARAMETER.
 
If PARAMETER is not found, return DEFAULT which defaults to nil.
 
SESSION nil defaults to the current session."
 
  (wg-aget (wg-win-parameters win) parameter default))
 

	
 
(defun wg-set-win-parameter (win parameter value)
0 comments (0 inline, 0 general)