[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/better-jumper dfb80f0eb4 21/48: Add savehist support for b
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/better-jumper dfb80f0eb4 21/48: Add savehist support for buffer context |
Date: |
Sun, 9 Jan 2022 22:58:10 -0500 (EST) |
branch: elpa/better-jumper
commit dfb80f0eb4b537a91130447cdf88f8c42028ef77
Author: Bryan Gilbert <gilbertw1@gmail.com>
Commit: Bryan Gilbert <gilbertw1@gmail.com>
Add savehist support for buffer context
---
Readme.md | 12 ++++++-
better-jumper.el | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 97 insertions(+), 11 deletions(-)
diff --git a/Readme.md b/Readme.md
index 7c12aa3d8d..8fa5b29474 100644
--- a/Readme.md
+++ b/Readme.md
@@ -38,7 +38,6 @@ Configure the standard jump list navigation keybindings for
evil/vim:
(define-key evil-motion-state-map (kbd "<C-i>") 'better-jumper-jump-forward))
```
-
# Configuration Options
#### Jump Context (`better-jumper-context`)
@@ -69,6 +68,17 @@ If non-nil better jumper will attach a piece of advice to
the `evil-jump`
function that will ensure that anytime a jump is added using `evil-jump` a
corresponding jump will be added using `better-jumper`.
+#### better-jumper-use-savehist (`better-jumper-use-savehist`)
+
+If non-nil better jumper will use savehist to save jump history. This is
+currently only implemented for the `'buffer` context. Persistent window
+parameters are used to save and restore jump history for windows.
+
+#### better-jumper-buffer-savehist-size (`better-jumper-buffer-savehist-size`)
+
+This number dictates how many of the most recent buffers should have their jump
+state saved to the savehist file when savehist is enabled the the context is
set
+to `'buffer`.
# Hooks
diff --git a/better-jumper.el b/better-jumper.el
index 317bf185bb..e89a08b583 100644
--- a/better-jumper.el
+++ b/better-jumper.el
@@ -42,6 +42,8 @@
;;
;;; Code:
+(require 'seq)
+
(defgroup better-jumper nil
"Better jumper configuration options."
:prefix "better-jumper"
@@ -69,6 +71,16 @@
:type 'boolean
:group 'better-jumper)
+(defcustom better-jumper-use-savehist nil
+ "Use savehist to save jump history. Currently Buffer only."
+ :type 'boolean
+ :group 'better-jumper)
+
+(defcustom better-jumper-buffer-savehist-size 20
+ "The number of buffers to save the jump ring for."
+ :type 'integer
+ :group 'better-jumper)
+
(defcustom better-jumper-pre-jump-hook nil
"Hooks to run just before jumping to a location in the jump list."
:type 'hook
@@ -84,12 +96,10 @@
:type '(repeat string)
:group 'better-jumper)
-(defcustom better-jumper-buffer-savehist-size 20
- "The number of buffers to save the jump ring for."
- :type 'integer
- :group 'better-jumper)
-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar savehist-additional-variables)
(defvar better-jumper--jumping nil
"Flag inidicating jump in progress to prevent recording unnecessary jumps.")
@@ -100,6 +110,9 @@
(defvar better-jumper--buffer-targets "\\*\\(new\\|scratch\\)\\*"
"Regexp to match against `buffer-name' to determine whether it's a valid
jump target.")
+(defvar better-jumper-savehist nil
+ "History of `better-jumper' jumps that are persisted with `savehist'.")
+
(defvar-local better-jumper--jump-struct nil
"Jump struct for current buffer.")
@@ -140,6 +153,15 @@
((eq better-jumper-context 'window)
(better-jumper--set-window-struct context struct))))
+(defun better-jumper--find-buffer-struct-savehist (buffer)
+ "Look for BUFFER jump history in savehist variable."
+ (let ((filename (buffer-file-name buffer)))
+ (when filename
+ (nth 1
+ (seq-find (lambda (e)
+ (equal (nth 0 e) filename))
+ better-jumper-savehist)))))
+
(defun better-jumper--get-buffer-struct (&optional buffer)
"Get current jump struct for BUFFER.
Creates and sets jump struct if one does not exist. buffer if BUFFER parameter
@@ -147,8 +169,10 @@ is missing."
(let* ((buffer (or buffer (current-buffer)))
(jump-struct (buffer-local-value 'better-jumper--jump-struct buffer)))
(unless jump-struct
- (setq jump-struct (make-better-jumper-jump-list-struct))
- (better-jumper--set-buffer-struct buffer jump-struct))
+ (setq jump-struct (better-jumper--find-buffer-struct-savehist buffer))
+ (unless jump-struct
+ (setq jump-struct (make-better-jumper-jump-list-struct))
+ (better-jumper--set-buffer-struct buffer jump-struct)))
jump-struct))
(defun better-jumper--get-window-struct (&optional window)
@@ -198,7 +222,7 @@ buffer if CONTEXT parameter is missing."
Creates and sets marker table if one does not exist. buffer if BUFFER parameter
is missing."
(let* ((buffer (or buffer (current-buffer)))
- (marker-table (buffer-local-value 'better-jumper--marker-map buffer)))
+ (marker-table (buffer-local-value 'better-jumper--marker-table
buffer)))
(unless marker-table
(setq marker-table (make-hash-table))
(better-jumper--set-marker-table buffer marker-table))
@@ -367,12 +391,12 @@ The argument should be either a window or buffer
depending on the context."
;;;;;;;;;;;;;;;;;;
(defun better-jumper--before-persp-deactivate (&rest args)
- "Save jump state when a perspective is deactivated. Ignore ARGS."
+ "Indicate that perspective switch is in progress. Ignore ARGS."
(ignore args)
(setq better-jumper-switching-perspectives t))
(defun better-jumper--on-persp-activate (&rest args)
- "Restore jump state when a perspective is activated. Ignore ARGS."
+ "Indicate that perspective switch is completed. Ignore ARGS."
(ignore args)
(setq better-jumper-switching-perspectives nil))
@@ -401,6 +425,58 @@ Cleans up deleted windows and copies history to newly
created windows."
(add-hook 'window-configuration-change-hook
#'better-jumper--window-configuration-hook)
+
+;;;;;;;;;;;;;;;;;;;
+;;; SAVEHIST ;;;
+;;;;;;;;;;;;;;;;;;;
+
+(defun better-jumper--load-savehist ()
+ "Load savehist state if savehist is enabled."
+ (when (and better-jumper-use-savehist
+ (eq better-jumper-context 'buffer))
+ (add-to-list 'savehist-additional-variables 'better-jumper-savehist)
+ (dolist (entry better-jumper-savehist)
+ (let* ((buffer-name (nth 0 entry))
+ (struct (nth 1 entry))
+ (found-buffer (seq-find (lambda (b)
+ (or (eq buffer-name (buffer-file-name
b))
+ (eq buffer-name (buffer-name b))))
+ (buffer-list))))
+ (when found-buffer
+ (better-jumper-set-jumps found-buffer struct)))))
+ (add-hook 'savehist-save-hook #'better-jumper--sync-savehist)
+ (remove-hook 'savehist-mode-hook #'better-jumper--load--savehist))
+
+(defun better-jumper--is-local-file-buffer (buffer)
+ "Return non-nil if BUFFER refers to a local file that exists."
+ (let ((filename (buffer-file-name buffer)))
+ (and filename
+ (not (file-remote-p filename))
+ (file-exists-p filename))))
+
+(defun better-jumper--sync-savehist ()
+ "Store current jump state in savehist variable if savehist is enabled."
+ (when (and better-jumper-use-savehist
+ (eq better-jumper-context 'buffer))
+ (let ((buffers (seq-take
+ (seq-filter #'better-jumper--is-local-file-buffer
+ (buffer-list))
+ better-jumper-buffer-savehist-size)))
+ (setq better-jumper-savehist
+ (mapcar #'(lambda (buffer)
+ (let ((filename (buffer-file-name buffer))
+ (struct (better-jumper--copy-struct
(better-jumper--get-buffer-struct buffer))))
+ (list filename struct)))
+ buffers)))))
+
+(if (bound-and-true-p savehist-loaded)
+ (better-jumper--load-savehist)
+ (add-hook 'savehist-mode-hook #'better-jumper--load-savehist))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; EVIL INTEGRATION ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
(with-eval-after-load 'evil
(defadvice evil-set-jump (before better-jumper activate)
(when better-jumper-use-evil-jump-advice
- [nongnu] elpa/better-jumper 8e82f33309 01/48: initial WIP implementation, (continued)
- [nongnu] elpa/better-jumper 8e82f33309 01/48: initial WIP implementation, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 06a98185e8 04/48: propertly maintain / cleanup buffer + window jumps, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 3624896c72 05/48: add documentation, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper d6ecaa1f96 07/48: minor refactors + cleanup, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 719e412f43 03/48: Add support restricting jump list to contexts, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper c307a253d9 09/48: Fixup copy struct function, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper f9f0180894 13/48: update documentation, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 8d2b5f4c3a 11/48: Re-implement buffer context support using locals, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 50bf0f7ee7 15/48: add finder-known-keyword to Keywords, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 055051c391 16/48: cleanup byte compiler warnings, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper dfb80f0eb4 21/48: Add savehist support for buffer context,
ELPA Syncer <=
- [nongnu] elpa/better-jumper e5768d3812 22/48: Readme updates, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 3d27c44b6a 23/48: Fix duplicate jump protection, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 2b85b3a83e 26/48: Correct typo in reference to better-jumper--load-savehist, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper f3d6c048cc 27/48: Fix byte-compiler warning about free variable, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 6d240032ca 29/48: Merge pull request #2 from hlissner/patch-2, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 7ae4011103 31/48: Don't add redundant evil jumps. Fixes #5, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper b2cc34493c 39/48: Require cl-macs to fix byte compiling, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 879ce3939f 14/48: update commentary, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 7f328a886b 45/48: Utilize evil jump var to avoid redundant jumps, ELPA Syncer, 2022/01/09
- [nongnu] elpa/better-jumper 9b214d71e6 37/48: Merge pull request #8 from sgleizes/bugfix/copy-jump-list-on-focused-new-window, ELPA Syncer, 2022/01/09