Skip to content

Commit

Permalink
improve behaviour, add correct replacement of already visited buffers
Browse files Browse the repository at this point in the history
  • Loading branch information
Artawower committed Feb 20, 2023
1 parent 656f294 commit 219a39d
Showing 1 changed file with 65 additions and 22 deletions.
87 changes: 65 additions & 22 deletions buffer-hop.el
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

;; Author: Artur Yaroshenko <[email protected]>
;; URL: https://github.com/artawower/buffer-hop.el
;; Package-Requires: ((emacs "24.4"))
;; Package-Requires: ((emacs "28.1"))
;; Version: 0.1

;; This program is free software; you can redistribute it and/or modify
Expand Down Expand Up @@ -34,11 +34,16 @@
:type '(repeat string)
:group 'buffer-hop)

(defcustom buffer-hop-disabled-modes '(minibuffer-mode)
(defcustom buffer-hop-disabled-modes '(minibuffer-mode dired-mode)
"List of modes to ignore."
:type '(repeat symbol)
:group 'buffer-hop)

(defcustom buffer-hop-always-allowed-buffers-patterns '("\\*new\\*")
"List of regexps to match always allowed buffers."
:type '(repeat string)
:group 'buffer-hop)

(defvar buffer-hop--get-ordered-persp-buffers nil
"List of buffers in the order to open for active window.")

Expand All @@ -48,30 +53,60 @@
(defvar buffer-hop--buffer-changed-hook nil
"Hook to run when buffer is changed.")

(defun bh--allow-store-buffer-p (buffer-name)
"Check if BUFFER-NAME should be stored."
(or (not (cl-some (lambda (regexp)
(or (string-match-p regexp (string-trim buffer-name))
(member major-mode buffer-hop-disabled-modes)))
buffer-hop-ignored-buffers-patterns))
(cl-some (lambda (regexp)
(string-match-p regexp (string-trim buffer-name)))
buffer-hop-always-allowed-buffers-patterns)))

(defun bh--verify-existing-buffers ()
"Verify that all buffers in `buffer-hop--get-ordered-persp-buffers' are still alive."
(let ((alive-buffers (buffer-list)))
;; (dolist (persp-buffers buffer-hop--get-ordered-persp-buffers)
;; (setf (car persp-buffers)
;; (seq-filter (lambda (buffer)
;; (member buffer alive-buffers))
;; (car persp-buffers))))
))

(defun bh--store-new-buffer ()
"Store the current buffer in the list of buffers to be saved."
(unless (or (cl-some (lambda (regexp)
(or (string-match-p regexp (string-trim (buffer-name)))
(member major-mode buffer-hop-disabled-modes)))
buffer-hop-ignored-buffers-patterns)
(string= (buffer-name (current-buffer)) buffer-hop--locked-buffer))
;; (message "buffer name: %s, allow store? %s" (buffer-name) (bh--allow-store-buffer-p (buffer-name)))
(when (and (bh--allow-store-buffer-p (buffer-name))
(not (string= (buffer-name (current-buffer)) buffer-hop--locked-buffer)))
;; (message "WILL DELETE BUFF")

(bh--verify-existing-buffers)
(let* ((persp-name (bh--get-persp-name))
(stored-persp (assoc persp-name buffer-hop--get-ordered-persp-buffers))
(ordered-buffer-list (if stored-persp
(cdr stored-persp)
'()))
(current-buffer-position (seq-position ordered-buffer-list
bh--locked-buffer))
buffer-hop--locked-buffer))
(current-buffer-position (when current-buffer-position
(1+ current-buffer-position))))
(1+ current-buffer-position)))
)

;;(message "deleted buffer: %s, insert pos: %s" (buffer-name) current-buffer-position)
;;(message "locked buffer: %s" buffer-hop--locked-buffer)
(if (and (length> ordered-buffer-list 0) current-buffer-position)
(setq ordered-buffer-list (append (cl-subseq ordered-buffer-list 0 current-buffer-position)
(list (buffer-name (current-buffer)))
(cl-subseq ordered-buffer-list current-buffer-position)))
(setq ordered-buffer-list (append ordered-buffer-list (list (buffer-name (current-buffer))))))
(message "ordered-buffer-list: %s" ordered-buffer-list)
(progn
(setq ordered-buffer-list (delete (buffer-name) ordered-buffer-list))
;; (setf ordered-buffer-list
;; (cl-delete (nth (buffer-name) ordered-buffer-list) ordered-buffer-list :test 'equal))
(setq ordered-buffer-list (append (cl-subseq ordered-buffer-list 0 current-buffer-position)
(list (buffer-name (current-buffer)))
(cl-subseq ordered-buffer-list current-buffer-position)))
)
(unless (member (buffer-name (current-buffer)) ordered-buffer-list)
(setq ordered-buffer-list (append ordered-buffer-list (list (buffer-name (current-buffer)))))))

;;(message "ordered-buffer-list: %s" ordered-buffer-list)


(if stored-persp
Expand All @@ -80,13 +115,13 @@



(when (not (equal (current-buffer) buffer-hop--locked-buffer))
(when (and (not (equal (current-buffer) buffer-hop--locked-buffer))
(bh--allow-store-buffer-p (buffer-name)))
(setq buffer-hop--locked-buffer (buffer-name (current-buffer)))))


(defun bh--get-persp-name ()
"Get persp name of current opened buffer or return default."
(message "persp name: %s for buffer %s" (safe-persp-name (get-current-persp)) (buffer-name (current-buffer)))
(if (bound-and-true-p persp-mode)
(safe-persp-name (get-current-persp))
"default"))
Expand All @@ -96,22 +131,25 @@
(setq buffer-hop--locked-buffer buffer)
(switch-to-buffer buffer))

(defun bh--move-to-buffer (direction)
(defun bh--move-to-buffer (direction &optional current-buffer-name)
"Move to the next buffer in the list of buffers to be saved.
DIRECTION is the direction to move, it can be `forward' or `backward'."
DIRECTION is the direction to move, it can be `forward' or `backward'.
CURRENT-BUFFER-NAME is optional arg for recursive search."
(let* ((persp-name (bh--get-persp-name))
(stored-persp (assoc persp-name buffer-hop--get-ordered-persp-buffers))
(ordered-buffer-list (cdr-safe stored-persp))
(navigation-list (if (equal direction 'forward)
ordered-buffer-list
(reverse ordered-buffer-list)))
(before-current-buffer (member (buffer-name) navigation-list))
(before-current-buffer (member (or current-buffer-name (buffer-name)) navigation-list))
(next-buffer (or (car-safe (cdr-safe before-current-buffer))
(cl-first navigation-list))))
(message "navigation list %s" navigation-list)
(when next-buffer
(bh--change-buffer next-buffer))))

;;(message "navigation list: %s" navigation-list)
(if (get-buffer next-buffer)
(bh--change-buffer next-buffer)
(bh--move-to-buffer direction next-buffer))))

;;;###autoload
(defun bh-next ()
Expand All @@ -129,6 +167,11 @@ DIRECTION is the direction to move, it can be `forward' or `backward'."
(bh--move-to-buffer 'backward)
(previous-buffer)))

(defun bh-reset()
"Reset buffer-hop."
(interactive)
(setq buffer-hop--get-ordered-persp-buffers nil))

;;;###autoload
(define-minor-mode buffer-hop-mode
"Buffer hop mode.
Expand Down

0 comments on commit 219a39d

Please sign in to comment.