Files @ 7ddca4d8f018
Branch filter:

Location: workgroups2/src/workgroups-specialbufs.el - annotation

Sergey Pashinin
fixed typo
088605c05794
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
c584e55ee1e7
c584e55ee1e7
c584e55ee1e7
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
32f960186ab2
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
d777aa1725d2
d777aa1725d2
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
d78ef0ef538a
bf5012bb3730
bf5012bb3730
bf5012bb3730
088605c05794
4321de37c54f
4321de37c54f
4321de37c54f
4321de37c54f
4321de37c54f
4321de37c54f
4321de37c54f
bf5012bb3730
088605c05794
088605c05794
de99b9d820e1
088605c05794
bf5012bb3730
bf5012bb3730
bf5012bb3730
bf5012bb3730
bf5012bb3730
bf5012bb3730
443938b472d4
443938b472d4
443938b472d4
088605c05794
be77fb03e9cb
be77fb03e9cb
be77fb03e9cb
be77fb03e9cb
be77fb03e9cb
be77fb03e9cb
443938b472d4
443938b472d4
088605c05794
be77fb03e9cb
443938b472d4
443938b472d4
be77fb03e9cb
be77fb03e9cb
be77fb03e9cb
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
088605c05794
088605c05794
443938b472d4
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
443938b472d4
443938b472d4
088605c05794
088605c05794
088605c05794
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
443938b472d4
443938b472d4
088605c05794
443938b472d4
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
0426de8255a5
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
443938b472d4
088605c05794
;;; workgroups-specialbufs --- special buffers serialization
;;; Commentary:
;;
;; TODO: Possibly add restore-special-data customization option
;; TODO: These could be a little more thorough
;;
;;; Code:

(require 'dflet)
(require 'workgroups-misc)

;; Dired

(defun wg-deserialize-dired-buffer (buf)
  "Deserialize Dired buffer."
  (wg-dbind (this-function params) (wg-buf-special-data buf)
    (let ((dir (car params)))
      (if (or wg-restore-remote-buffers (not (wg-is-file-remote dir)))
          (if (file-exists-p dir)
              (dired dir)))
      (current-buffer))))

(defun wg-serialize-dired-buffer (buffer)
  "Serialize Dired buffer."
  (with-current-buffer buffer
    (when (eq major-mode 'dired-mode)
      (list 'wg-deserialize-dired-buffer
            (wg-take-until-unreadable (list (or (buffer-file-name) default-directory)))
            ))))

;; Info buffer serdes

(defun wg-deserialize-Info-buffer (buf)
  "Deserialize an Info buffer."
  (require 'info)
  (wg-aif (cdr (wg-buf-special-data buf))
      (if (fboundp 'Info-find-node)
          (apply #'Info-find-node it))
    (info))
  (current-buffer))

(defun wg-serialize-Info-buffer (buffer)
  "Serialize an Info buffer."
  (with-current-buffer buffer
    (when (eq major-mode 'Info-mode)
      (wg-when-boundp (Info-current-file Info-current-node)
        (list 'wg-deserialize-Info-buffer
              Info-current-file
              Info-current-node)))))


;; help buffer serdes

(defun wg-deserialize-help-buffer (buf)
  "Deserialize a help buffer BUF.
See `wg-serialize-help-buffer'."
  (require 'help-mode)
  (wg-dbind (this-function item stack forward-stack) (wg-buf-special-data buf)
    (condition-case err
        (apply (car item) (cdr item))
      (error (message "%s" err)))
    (wg-awhen (get-buffer "*Help*")
      (set-buffer it)
      (wg-when-boundp (help-xref-stack help-xref-forward-stack)
        (setq help-xref-stack stack
              help-xref-forward-stack forward-stack))
      (current-buffer))))

(defun wg-serialize-help-buffer (buffer)
  "Serialize a help buffer BUFFER.
Since `help-mode' is used by many buffers that aren't actually
*Help* buffers (e.g. *Process List*), we also check that
`help-xref-stack-item' has a local binding."
  (with-current-buffer buffer
    (when (and (eq major-mode 'help-mode)
               (local-variable-p 'help-xref-stack-item)
               (boundp 'help-xref-stack-item)
               (boundp 'help-xref-stack)
               (boundp 'help-xref-forward-stack))
      (list 'wg-deserialize-help-buffer
            (wg-take-until-unreadable help-xref-stack-item)
            (mapcar 'wg-take-until-unreadable help-xref-stack)
            (mapcar 'wg-take-until-unreadable help-xref-forward-stack)))))


;; ielm buffer serdes

(defun wg-deserialize-ielm-buffer (buf)
  "Deserialize an `inferior-emacs-lisp-mode' buffer BUF."
  (ielm)
  (current-buffer))

(defun wg-serialize-ielm-buffer (buffer)
  "Serialize an `inferior-emacs-lisp-mode' buffer BUFFER."
  (with-current-buffer buffer
    (when (eq major-mode 'inferior-emacs-lisp-mode)
      (list 'wg-deserialize-ielm-buffer))))


;; Wanderlust modes:
;; WL - folders
(defun wg-deserialize-wl-folders-buffer (buf)
  ""
  (if (fboundp 'wl)
      (wg-dbind (this-function) (wg-buf-special-data buf)
        ;;(when (not (eq major-mode 'wl-folder-mode))
        (wl)
        (goto-char (point-max))
        (current-buffer)
        )))

(defun wg-serialize-wl-folders-buffer (buffer)
  ""
  (if (fboundp 'wl)
      (with-current-buffer buffer
        (when (eq major-mode 'wl-folder-mode)
          (list 'wg-deserialize-wl-folders-buffer
                )))))

;; WL - summary mode (list of mails)
;;(defun wg-deserialize-wl-summary-buffer (buf)
;;  ""
;;  (interactive)
;;  (if (fboundp 'wl)
;;      (wg-dbind (this-function param-list) (wg-buf-special-data buf)
;;        (when (not (eq major-mode 'wl-summary-mode))
;;          (let ((fld-name (car param-list)))
;;            ;;(switch-to-buffer "*scratch*")
;;            ;;(wl)
;;            ;;(wl-folder-jump-folder fld-name)
;;            ;;(message fld-name)
;;            ;;(goto-char (point-max))
;;            ;;(insert fld-name)
;;            (current-buffer)
;;          )))))
;;
;;(defun wg-serialize-wl-summary-buffer (buffer)
;;  ""
;;  (if (fboundp 'wl)
;;      (with-current-buffer buffer
;;        (when (eq major-mode 'wl-summary-mode)
;;          (list 'wg-deserialize-wl-summary-buffer
;;                (wg-take-until-unreadable (list wl-summary-buffer-folder-name))
;;                )))))
;;
;;
;;;; mime-view-mode
;;
;;(defun wg-deserialize-mime-view-buffer (buf)
;;  ""
;;  (wg-dbind (this-function) (wg-buf-special-data buf)
;;    (when (not (eq major-mode 'mime-view-mode))
;;      ;;(wl-summary-enter-handler 3570)     ; only in wl-summary-mode
;;      ;;(wl-summary-enter-handler)     ; only in wl-summary-mode
;;      (current-buffer)
;;      )))
;;
;;(defun wg-serialize-mime-view-buffer (buffer)
;;  ""
;;  (with-current-buffer buffer
;;    (when (eq major-mode 'mime-view-mode)
;;      (list 'wg-deserialize-mime-view-buffer
;;            ))))


;; Magit buffers

(defun wg-deserialize-magit-buffer (buf)
  "Deserialize a Magit-status buffer BUF."
  (if (require 'magit nil 'noerror)
      (if (fboundp 'magit-status)
          (wg-dbind (this-function dir) (wg-buf-special-data buf)
            (let ((default-directory (car dir)))
              (if (file-exists-p default-directory)
                  (magit-status default-directory))
              (current-buffer))))))

(defun wg-serialize-magit-buffer (buf)
  "Serialize a Magit-status buffer BUF."
  (if (fboundp 'magit-status-mode)
      (with-current-buffer buf
        (when (eq major-mode 'magit-status-mode)
          (list 'wg-deserialize-magit-buffer
                (wg-take-until-unreadable (list (or (buffer-file-name) default-directory)))
                )))))


;; shell buffer serdes

(defun wg-deserialize-shell-buffer (buf)
  "Deserialize a `shell-mode' buffer BUF.
Run shell with last working dir"
  (wg-dbind (this-function dir) (wg-buf-special-data buf)
    (let ((default-directory (car dir)))
      (shell (wg-buf-name buf))
      (current-buffer)
      )))

(defun wg-serialize-shell-buffer (buffer)
  "Serialize a `shell-mode' buffer BUFFER.
Save shell directory"
  (with-current-buffer buffer
    (when (eq major-mode 'shell-mode)
      (list 'wg-deserialize-shell-buffer
            (wg-take-until-unreadable (list (or (buffer-file-name) default-directory)))
            ))))


;; org-agenda buffer

(defun wg-get-org-agenda-view-commands ()
  "Return commands to restore the state of Agenda buffer.
Can be restored using \"(eval commands)\"."
  (interactive)
  (when (boundp 'org-agenda-buffer-name)
    (if (get-buffer org-agenda-buffer-name)
        (with-current-buffer org-agenda-buffer-name
          (let* ((p (or (and (looking-at "\\'") (1- (point))) (point)))
                 (series-redo-cmd (get-text-property p 'org-series-redo-cmd)))
            (if series-redo-cmd
                (get-text-property p 'org-series-redo-cmd)
              (get-text-property p 'org-redo-cmd)))))))

(defun wg-run-agenda-cmd (f)
  "Run commands \"F\" in Agenda buffer.
You can get these commands using
\"wg-get-org-agenda-view-commands\"."
  (when (and (boundp 'org-agenda-buffer-name)
             (fboundp 'org-current-line)
             (fboundp 'org-goto-line))
    (if (get-buffer org-agenda-buffer-name)
        (save-window-excursion
          (with-current-buffer org-agenda-buffer-name
            (let* ((line (org-current-line)))
              (if f (eval f))
              (org-goto-line line)))))))

(defun wg-deserialize-org-agenda-buffer (buf)
  "Deserialize an `org-agenda-mode' buffer BUF."
  (org-agenda-list)
  (when (boundp 'org-agenda-buffer-name)
    (wg-dbind (this-function item) (wg-buf-special-data buf)
      (wg-awhen (get-buffer org-agenda-buffer-name)
        (set-buffer it)
        (wg-run-agenda-cmd item)
        (current-buffer)))))

(defun wg-serialize-org-agenda-buffer (buffer)
  "Serialize an `org-agenda-mode' buffer BUFFER."
  (with-current-buffer buffer
    (when (eq major-mode 'org-agenda-mode)
      (list 'wg-deserialize-org-agenda-buffer
            (wg-take-until-unreadable (wg-get-org-agenda-view-commands))
            ))))


;; eshell

(defun wg-deserialize-eshell-buffer (buf)
  "Deserialize an `eshell-mode' buffer BUF."
  (prog1 (eshell t)
    (rename-buffer (wg-buf-name buf) t)))

(defun wg-serialize-eshell-buffer (buffer)
  "Serialize an `eshell-mode' buffer BUFFER."
  (with-current-buffer buffer
    (when (eq major-mode 'eshell-mode)
      (list 'wg-deserialize-eshell-buffer))))


;; term and ansi-term buffer serdes

(defun wg-deserialize-term-buffer (buf)
  "Deserialize a `term-mode' buffer BUF."
  (require 'term)
  ;; flet'ing these prevents scrunched up wrapping when restoring during morph
  (dflet ((term-window-width () 80)
         (window-height () 24))
    (prog1 (term (nth 1 (wg-buf-special-data buf)))
      (rename-buffer (wg-buf-name buf) t))))

(defun wg-serialize-term-buffer (buffer)
  "Serialize a `term-mode' buffer BUFFER.
This should work for `ansi-term's, too, as there doesn't seem to
be any difference between the two except how the name of the
buffer is generated."
  (with-current-buffer buffer
    (when (eq major-mode 'term-mode)
      (wg-when-let ((process (get-buffer-process buffer)))
        (list 'wg-deserialize-term-buffer
              (wg-last1 (process-command process)))))))






;;; buffer-local variable serdes

(defun wg-serialize-buffer-mark-ring ()
  "Return a new list of the positions of the marks in `mark-ring'."
  (mapcar 'marker-position mark-ring))

(defun wg-deserialize-buffer-mark-ring (positions)
  "Set `mark-ring' to a new list of markers created from POSITIONS."
  (setq mark-ring
        (mapcar (lambda (pos) (set-marker (make-marker) pos))
                positions)))

(defun wg-deserialize-buffer-major-mode (major-mode-symbol)
  "Conditionally retore MAJOR-MODE-SYMBOL in `current-buffer'."
  (and (fboundp major-mode-symbol)
       (not (eq major-mode-symbol major-mode))
       (funcall major-mode-symbol)))

(defun wg-deserialize-buffer-local-variables (buf)
  "Restore BUF's buffer local variables in `current-buffer'."
  (loop for ((var . val) . rest) on (wg-buf-local-vars buf)
        do (wg-awhen (assq var wg-buffer-local-variables-alist)
             (wg-dbind (var ser des) it
               (if des (funcall des val)
                 (set var val))))))

(provide 'workgroups-specialbufs)
;;; workgroups-specialbufs.el ends here