[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/vlf c14c7f0 058/310: Add shift forward of file contents
From: |
Stefan Monnier |
Subject: |
[elpa] externals/vlf c14c7f0 058/310: Add shift forward of file contents when edited chunk grows in size. |
Date: |
Sat, 28 Nov 2020 00:32:46 -0500 (EST) |
branch: externals/vlf
commit c14c7f00ce59c1cc738de0916a29a5dfd9bfb56f
Author: Andrey Kotlarski <m00naticus@gmail.com>
Commit: Andrey Kotlarski <m00naticus@gmail.com>
Add shift forward of file contents when edited chunk grows in size.
---
vlfi.el | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 55 insertions(+), 4 deletions(-)
diff --git a/vlfi.el b/vlfi.el
index 7322744..2945039 100644
--- a/vlfi.el
+++ b/vlfi.el
@@ -415,8 +415,9 @@ or \\[vlfi-discard-edit] to discard changes.")))
(defun vlfi-file-shift-back (size-change)
"Shift file contents SIZE-CHANGE bytes back."
- (write-region nil nil buffer-file-name vlfi-start-pos t)
(let ((coding-system buffer-file-coding-system))
+ (set-buffer-file-coding-system 'raw-text t)
+ (write-region nil nil buffer-file-name vlfi-start-pos t)
(setq buffer-file-coding-system nil)
(let ((read-start-pos vlfi-end-pos)
(reporter (make-progress-reporter "Adjusting file content"
@@ -447,8 +448,58 @@ back at WRITE-POS. Return nil if EOF is reached, t
otherwise."
(< read-end vlfi-file-size)))
(defun vlfi-file-shift-forward (size-change)
- "Shift file contents SIZE-CHANGE bytes forward."
- (ignore size-change))
+ "Shift file contents SIZE-CHANGE bytes forward.
+Done by saving content up front and then writing previous batch."
+ (let ((vlfi-buffer (current-buffer))
+ (temp-buffer (generate-new-buffer (concat " "
+ (buffer-name))))
+ (coding-system buffer-file-coding-system))
+ (let ((file buffer-file-name))
+ (set-buffer temp-buffer)
+ (setq buffer-file-name file))
+ (set-buffer vlfi-buffer)
+ (set-buffer-file-coding-system 'raw-text t)
+ (let ((read-buffer temp-buffer)
+ (write-buffer vlfi-buffer)
+ (size (+ vlfi-batch-size size-change))
+ (read-pos vlfi-end-pos)
+ (write-pos vlfi-start-pos)
+ swap-buffer
+ (reporter (make-progress-reporter "Adjusting file content"
+ vlfi-start-pos
+ vlfi-file-size)))
+ (while (vlfi-shift-batches size read-buffer read-pos
+ write-buffer write-pos)
+ (setq swap-buffer read-buffer
+ read-buffer write-buffer
+ write-buffer swap-buffer
+ write-pos (+ read-pos size-change)
+ read-pos (+ read-pos size))
+ (progress-reporter-update reporter write-pos))
+ (progress-reporter-done reporter))
+ (kill-buffer temp-buffer)
+ (set-buffer vlfi-buffer)
+ (setq buffer-file-coding-system coding-system)))
+
+(defun vlfi-shift-batches (size read-buffer read-pos
+ write-buffer write-pos)
+ "Read SIZE bytes in READ-BUFFER starting from READ-POS.
+Then write contents of WRITE-BUFFER to buffer file at WRITE-POS.
+Return nil if EOF is reached, t otherwise."
+ (let* ((file-size (nth 7 (file-attributes buffer-file-name)))
+ (read-more (< read-pos file-size)))
+ (when read-more
+ ;; read
+ (set-buffer read-buffer)
+ (erase-buffer)
+ (setq buffer-file-coding-system nil)
+ (insert-file-contents-literally buffer-file-name nil read-pos
+ (min file-size (+ read-pos
+ size))))
+ ;; write
+ (set-buffer write-buffer)
+ (write-region nil nil buffer-file-name write-pos t)
+ read-more))
(defun vlfi-write ()
"Write current chunk to file. Always return true to disable save.
@@ -468,7 +519,7 @@ Save anyway? ")))
(write-region nil nil buffer-file-name vlfi-start-pos t))
((< 0 size-change)
(vlfi-file-shift-back size-change))
- (t (vlfi-file-shift-forward size-change)))
+ (t (vlfi-file-shift-forward (- size-change))))
(goto-char pos))
(vlfi-move-to-chunk vlfi-start-pos vlfi-end-pos)
(vlfi-mode)
- [elpa] externals/vlf 9e27aeb 021/310: Keep stable cursor position when moving through chunks., (continued)
- [elpa] externals/vlf 9e27aeb 021/310: Keep stable cursor position when moving through chunks., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 81e4fe1 016/310: Merge branch 'search' of https://github.com/m00natic/vlfi into search, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf e43725e 007/310: Add autoload cookies to fix package installation., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 853386f 015/310: Add regex search forward functionality., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 2a7625a 024/310: Improve correctness of search forward., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf c36db11 034/310: Return correct search success status., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 8a33dbf 036/310: Add something like edit minor mode., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 56134a8 050/310: Make vlfi usable under GNU Emacs 23., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 24675d8 054/310: Manage modification times when attempting to save., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf c4f87f9 048/310: Move save interception to vlfi-mode., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf c14c7f0 058/310: Add shift forward of file contents when edited chunk grows in size.,
Stefan Monnier <=
- [elpa] externals/vlf e115e7e 053/310: Add custom revert function., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 2edbb6b 004/310: Add vlf as an option when opening large files., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 80ca6b6 037/310: Fix vlfi invocation when prompted for large files., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 03f3233 039/310: Don't reinsert content and move on successful search., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 2525ebf 049/310: Improvements to file saving., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf cedd0b4 059/310: Fix spaces and indent., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 6ea7a2a 065/310: Add macro for file size determination., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 91fecb7 023/310: Simplify key-bindings., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 8e65e13 029/310: Refactor and simplify search procedures. Always use batch sized, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf db3d2af 043/310: Update version, README and commentary section., Stefan Monnier, 2020/11/28