mirror of
https://github.com/m00natic/vlfi.git
synced 2025-04-18 16:50:19 +01:00
Add intelligent recenter chunk around point functionality.
This commit is contained in:
parent
290c4ac885
commit
4134de068f
13
README.org
13
README.org
@ -79,6 +79,9 @@ refresh with *C-c C-v g*.
|
|||||||
|
|
||||||
** Move around
|
** Move around
|
||||||
|
|
||||||
|
Scrolling automatically triggers moving to previous or next chunk at
|
||||||
|
the beginning or end respectively of the current one.
|
||||||
|
|
||||||
*C-c C-v n* and *C-c C-v p* move batch by batch. With positive
|
*C-c C-v n* and *C-c C-v p* move batch by batch. With positive
|
||||||
prefix argument they move prefix number of batches. With negative -
|
prefix argument they move prefix number of batches. With negative -
|
||||||
append prefix number of batches.
|
append prefix number of batches.
|
||||||
@ -93,6 +96,16 @@ how many chunks there are (using the current batch size), look at the
|
|||||||
parenthesized part of the buffer name, batch size is also indicated at
|
parenthesized part of the buffer name, batch size is also indicated at
|
||||||
the end.
|
the end.
|
||||||
|
|
||||||
|
** Follow point
|
||||||
|
|
||||||
|
Intelligent continuous recenter around point in current buffer can be
|
||||||
|
enabled with:
|
||||||
|
|
||||||
|
*M-x vlf-start-following*
|
||||||
|
|
||||||
|
You are asked for number of idle seconds interval for automatic
|
||||||
|
update. To cancel following invoke *M-x vlf-stop-following*.
|
||||||
|
|
||||||
** Search whole file
|
** Search whole file
|
||||||
|
|
||||||
*C-c C-v s* and *C-c C-v r* search forward and backward respectively
|
*C-c C-v s* and *C-c C-v r* search forward and backward respectively
|
||||||
|
51
vlf.el
51
vlf.el
@ -73,6 +73,11 @@ Possible values are: nil to never use it;
|
|||||||
(defvar vlf-file-size 0 "Total size of presented file.")
|
(defvar vlf-file-size 0 "Total size of presented file.")
|
||||||
(put 'vlf-file-size 'permanent-local t)
|
(put 'vlf-file-size 'permanent-local t)
|
||||||
|
|
||||||
|
(defvar vlf-follow-timer nil
|
||||||
|
"Contains timer and it's repeat interval if vlf buffer is set to\
|
||||||
|
continuously recenter.")
|
||||||
|
(put 'vlf-follow-timer 'permanent-local t)
|
||||||
|
|
||||||
(defvar vlf-mode-map
|
(defvar vlf-mode-map
|
||||||
(let ((map (make-sparse-keymap)))
|
(let ((map (make-sparse-keymap)))
|
||||||
(define-key map "n" 'vlf-next-batch)
|
(define-key map "n" 'vlf-next-batch)
|
||||||
@ -125,11 +130,13 @@ Possible values are: nil to never use it;
|
|||||||
(vlf-get-file-size buffer-file-truename))
|
(vlf-get-file-size buffer-file-truename))
|
||||||
(set (make-local-variable 'vlf-start-pos) 0)
|
(set (make-local-variable 'vlf-start-pos) 0)
|
||||||
(set (make-local-variable 'vlf-end-pos) 0)
|
(set (make-local-variable 'vlf-end-pos) 0)
|
||||||
|
(set (make-local-variable 'vlf-follow-timer) nil)
|
||||||
(let* ((pos (position-bytes (point)))
|
(let* ((pos (position-bytes (point)))
|
||||||
(start (* (/ pos vlf-batch-size) vlf-batch-size)))
|
(start (* (/ pos vlf-batch-size) vlf-batch-size)))
|
||||||
(goto-char (byte-to-position (- pos start)))
|
(goto-char (byte-to-position (- pos start)))
|
||||||
(vlf-move-to-batch start)))
|
(vlf-move-to-batch start)))
|
||||||
(kill-local-variable 'revert-buffer-function)
|
(kill-local-variable 'revert-buffer-function)
|
||||||
|
(vlf-stop-following)
|
||||||
(when (or (not large-file-warning-threshold)
|
(when (or (not large-file-warning-threshold)
|
||||||
(< vlf-file-size large-file-warning-threshold)
|
(< vlf-file-size large-file-warning-threshold)
|
||||||
(y-or-n-p (format "Load whole file (%s)? "
|
(y-or-n-p (format "Load whole file (%s)? "
|
||||||
@ -563,6 +570,50 @@ This seems to be the case with GNU/Emacs before 24.4."
|
|||||||
(t ;; TODO: use (< emacs-minor-version 4) after 24.4 release
|
(t ;; TODO: use (< emacs-minor-version 4) after 24.4 release
|
||||||
(string-lessp emacs-version "24.3.5"))))
|
(string-lessp emacs-version "24.3.5"))))
|
||||||
|
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
;;; follow point
|
||||||
|
|
||||||
|
(defun vlf-recenter (vlf-buffer)
|
||||||
|
"Recenter chunk around current point in VLF-BUFFER."
|
||||||
|
(and vlf-follow-timer
|
||||||
|
(eq (current-buffer) vlf-buffer)
|
||||||
|
(or (pos-visible-in-window-p (point-min))
|
||||||
|
(pos-visible-in-window-p (point-max)))
|
||||||
|
(let ((current-pos (+ vlf-start-pos (position-bytes (point))))
|
||||||
|
(half-batch (/ vlf-batch-size 2)))
|
||||||
|
(if (buffer-modified-p)
|
||||||
|
(progn
|
||||||
|
(let ((edit-end (+ (position-bytes (point-max))
|
||||||
|
vlf-start-pos)))
|
||||||
|
(vlf-move-to-chunk (min vlf-start-pos
|
||||||
|
(- current-pos half-batch))
|
||||||
|
(max edit-end
|
||||||
|
(+ current-pos half-batch))))
|
||||||
|
(goto-char (byte-to-position (- current-pos
|
||||||
|
vlf-start-pos))))
|
||||||
|
(vlf-move-to-batch (- current-pos half-batch))
|
||||||
|
(and (< half-batch current-pos)
|
||||||
|
(< half-batch (- vlf-file-size current-pos))
|
||||||
|
(goto-char (byte-to-position half-batch)))))))
|
||||||
|
|
||||||
|
(defun vlf-stop-following ()
|
||||||
|
"Stop continuous recenter."
|
||||||
|
(interactive)
|
||||||
|
(when vlf-follow-timer
|
||||||
|
(cancel-timer (car vlf-follow-timer))
|
||||||
|
(setq vlf-follow-timer nil)))
|
||||||
|
|
||||||
|
(defun vlf-start-following (interval)
|
||||||
|
"Continuously recenter chunk around point every INTERVAL seconds."
|
||||||
|
(interactive "nNumber of seconds: ")
|
||||||
|
(when vlf-mode
|
||||||
|
(vlf-stop-following)
|
||||||
|
(setq vlf-follow-timer (cons (run-with-idle-timer interval interval
|
||||||
|
'vlf-recenter
|
||||||
|
(current-buffer))
|
||||||
|
interval))
|
||||||
|
(add-hook 'kill-buffer-hook 'vlf-stop-following nil t)))
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;; search
|
;;; search
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user