[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/vlf dd43af5 192/310: Manually decode and use several by
From: |
Stefan Monnier |
Subject: |
[elpa] externals/vlf dd43af5 192/310: Manually decode and use several bytes buffer when loading chunk. |
Date: |
Sat, 28 Nov 2020 00:33:13 -0500 (EST) |
branch: externals/vlf
commit dd43af51ff4ecb525ee2f8dbb1377a51aa66ca10
Author: Andrey Kotlarski <m00naticus@gmail.com>
Commit: Andrey Kotlarski <m00naticus@gmail.com>
Manually decode and use several bytes buffer when loading chunk.
---
vlf-base.el | 191 ++++++++++++++++++++++++++++--------------------------------
vlf.el | 1 +
2 files changed, 89 insertions(+), 103 deletions(-)
diff --git a/vlf-base.el b/vlf-base.el
index de978ae..124ee56 100644
--- a/vlf-base.el
+++ b/vlf-base.el
@@ -27,15 +27,9 @@
;;; Code:
-(defconst vlf-min-chunk-size 16
+(defconst vlf-sample-size 24
"Minimal number of bytes that can be properly decoded.")
-(defconst vlf-partial-decode-shown
- (cond ((< emacs-major-version 24) t)
- ((< 24 emacs-major-version) nil)
- (t ;; TODO: use (< emacs-minor-version 4) after 24.4 release
- (string-lessp emacs-version "24.3.5")))
- "Indicates whether partial decode codes are displayed.")
(defun vlf-get-file-size (file)
"Get size in bytes of FILE."
(or (nth 7 (file-attributes file)) 0))
@@ -70,7 +64,7 @@ If non-nil, UPDATE-VISITED-TIME."
(setq buffer-undo-list undo-list))))
(defun vlf-move-to-chunk (start end &optional minimal)
- "Move to chunk determined by START END.
+ "Move to chunk enclosed by START END bytes.
When given MINIMAL flag, skip non important operations.
If same as current chunk is requested, do nothing.
Return number of bytes moved back for proper decoding and number of
@@ -84,7 +78,7 @@ bytes added to the end."
shifts)))
(defun vlf-move-to-chunk-1 (start end)
- "Move to chunk determined by START END keeping as much edits if any.
+ "Move to chunk enclosed by START END keeping as much edits if any.
Return number of bytes moved back for proper decoding and number of
bytes added to the end."
(let* ((modified (buffer-modified-p))
@@ -113,8 +107,9 @@ bytes added to the end."
(let ((pos (+ (position-bytes (point)) vlf-start-pos))
(inhibit-read-only t))
(cond ((< end edit-end)
- (let* ((del-pos (1+ (byte-to-position
- (- end vlf-start-pos))))
+ (let* ((del-pos (1+ (or (byte-to-position
+ (- end vlf-start-pos))
+ 0)))
(del-len (length (encode-coding-region
del-pos (point-max)
buffer-file-coding-system
@@ -126,13 +121,11 @@ bytes added to the end."
(vlf-with-undo-disabled
(delete-region del-pos (point-max)))))
((< edit-end end)
- (if (and (not vlf-partial-decode-shown)
- (< (- end vlf-end-pos) 4))
- (setq end vlf-end-pos)
- (vlf-with-undo-disabled
- (setq shift-end (cdr (vlf-insert-file-contents
- vlf-end-pos end nil t
- (point-max))))))))
+ (vlf-with-undo-disabled
+ (setq shift-end (cdr (vlf-insert-file-contents
+ vlf-end-pos end
+ (/= start vlf-end-pos) t
+ (point-max)))))))
(cond ((< vlf-start-pos start)
(let* ((del-pos (1+ (byte-to-position
(- start vlf-start-pos))))
@@ -143,20 +136,18 @@ bytes added to the end."
(setq start (+ vlf-start-pos del-len))
(vlf-with-undo-disabled
(delete-region (point-min) del-pos))
- (vlf-shift-undo-list (- 1 del-pos))))
+ (vlf-shift-undo-list (- (point-min) del-pos))))
((< start vlf-start-pos)
- (if (and (not vlf-partial-decode-shown)
- (< (- vlf-start-pos start) 4))
- (setq start vlf-start-pos)
- (let ((edit-end-pos (point-max)))
- (vlf-with-undo-disabled
- (setq shift-start (car (vlf-insert-file-contents
- start vlf-start-pos
- t nil edit-end-pos)))
- (goto-char (point-min))
- (insert (delete-and-extract-region
- edit-end-pos (point-max))))
- (vlf-shift-undo-list (- (point-max) edit-end-pos))))))
+ (let ((edit-end-pos (point-max)))
+ (vlf-with-undo-disabled
+ (setq shift-start (car (vlf-insert-file-contents
+ start vlf-start-pos t
+ (/= end vlf-start-pos)
+ edit-end-pos)))
+ (goto-char (point-min))
+ (insert (delete-and-extract-region
+ edit-end-pos (point-max))))
+ (vlf-shift-undo-list (- (point-max) edit-end-pos)))))
(setq start (- start shift-start))
(goto-char (or (byte-to-position (- pos start))
(byte-to-position (- pos vlf-start-pos))
@@ -200,17 +191,19 @@ bytes added to the end."
(setq adjust-start (and adjust-start (not (zerop start)))
adjust-end (and adjust-end (< end vlf-file-size))
position (or position (point-min)))
+ (goto-char position)
(let ((shift-start 0)
- (shift-end 0))
+ (shift-end 0)
+ (safe-end (if adjust-end
+ (min vlf-file-size (+ end 4))
+ end)))
(if adjust-start
- (setq shift-start (vlf-adjust-start start end position
+ (setq shift-start (vlf-adjust-start start safe-end position
adjust-end)
start (- start shift-start))
- (setq shift-end (vlf-insert-content-safe start end position)
- end (+ end shift-end)))
+ (vlf-insert-file-contents-safe start safe-end position))
(if adjust-end
- (setq shift-end (+ shift-end
- (vlf-adjust-end start end position))))
+ (setq shift-end (vlf-adjust-end start end position)))
(cons shift-start shift-end)))
(defun vlf-adjust-start (start end position adjust-end)
@@ -218,83 +211,75 @@ bytes added to the end."
be properly decoded. Use buffer POSITION as start.
ADJUST-END is non-nil if end would be adjusted later.
Return number of bytes moved back for proper decoding."
- (let* ((min-end (min end (+ start vlf-min-chunk-size)))
- (chunk-size (- min-end start))
- (strict (and (not adjust-end) (= min-end end)))
- (shift (vlf-insert-content-safe start min-end position t)))
- (setq start (- start shift))
- (while (and (not (zerop start))
+ (let* ((safe-start (max 0 (- start 4)))
+ (sample-end (min end (+ safe-start vlf-sample-size)))
+ (chunk-size (- sample-end safe-start))
+ (strict (or (= sample-end vlf-file-size)
+ (and (not adjust-end) (= sample-end end))))
+ (shift 0))
+ (while (and (progn (vlf-insert-file-contents-safe
+ safe-start sample-end position)
+ (not (zerop safe-start)))
(< shift 3)
(let ((diff (- chunk-size
(length
(encode-coding-region
position (point-max)
buffer-file-coding-system t)))))
- (cond (strict (not (zerop diff)))
- (vlf-partial-decode-shown
- (or (< diff -3) (< 0 diff)))
- (t (or (< diff 0) (< 3 diff))))))
+ (if strict
+ (not (zerop diff))
+ (or (< diff 0) (< 3 diff)))))
(setq shift (1+ shift)
- start (1- start)
+ safe-start (1- safe-start)
chunk-size (1+ chunk-size))
- (delete-region position (point-max))
- (insert-file-contents buffer-file-name nil start min-end))
- (unless (= min-end end)
- (delete-region position (point-max))
- (insert-file-contents buffer-file-name nil start end))
- shift))
+ (delete-region position (point-max)))
+ (let ((cut-pos position)
+ (cut-len 0))
+ (while (< safe-start start)
+ (setq cut-len (length (encode-coding-region
+ cut-pos (1+ cut-pos)
+ buffer-file-coding-system t))
+ cut-pos (1+ cut-pos)
+ safe-start (+ safe-start cut-len)))
+ (if (< start safe-start)
+ (setq safe-start (- safe-start cut-len)
+ cut-pos (1- cut-pos)))
+ (if (= sample-end end)
+ (delete-region position cut-pos)
+ (delete-region position (point-max))
+ (vlf-insert-file-contents-safe safe-start end position)))
+ (- start safe-start)))
(defun vlf-adjust-end (start end position)
- "Adjust chunk end at absolute START to END till content can be\
-properly decoded starting at POSITION.
-Return number of bytes added for proper decoding."
- (let ((shift 0))
- (if vlf-partial-decode-shown
- (let ((new-pos (max position
- (- (point-max) vlf-min-chunk-size))))
- (if (< position new-pos)
- (setq start (+ start (length (encode-coding-region
- position new-pos
- buffer-file-coding-system
- t)))
- position new-pos))))
- (let ((chunk-size (- end start)))
- (goto-char (point-max))
- (while (and (< shift 3)
- (< end vlf-file-size)
- (or (eq (char-charset (preceding-char)) 'eight-bit)
- (/= chunk-size
- (length (encode-coding-region
- position (point-max)
- buffer-file-coding-system t)))))
- (setq shift (1+ shift)
- end (1+ end)
- chunk-size (1+ chunk-size))
- (delete-region position (point-max))
- (insert-file-contents buffer-file-name nil start end)
- (goto-char (point-max))))
- shift))
+ "Adjust chunk end at absolute START to END starting at POSITION.
+Remove characters from the end until length is closest to expected.
+Return number of bytes added over expected."
+ (let ((expected-size (- end start))
+ (current-size (length (encode-coding-region
+ position (point-max)
+ buffer-file-coding-system t)))
+ (cut-point (point-max))
+ (cut-len 0))
+ (while (< expected-size current-size)
+ (setq cut-len (length (encode-coding-region
+ (1- cut-point) cut-point
+ buffer-file-coding-system t))
+ cut-point (1- cut-point)
+ current-size (- current-size cut-len)))
+ (if (< current-size expected-size)
+ (setq cut-point (1+ cut-point)
+ current-size (+ current-size cut-len)))
+ (delete-region cut-point (point-max))
+ (- current-size expected-size)))
-(defun vlf-insert-content-safe (start end position &optional shift-start)
- "Insert file content from absolute START to END of file at\
-POSITION. Adjust start if SHIFT-START is non nil, end otherwise.
-Clean up if no characters are inserted."
- (goto-char position)
- (let ((shift 0))
- (while (and (< shift 3)
- (zerop (cadr (insert-file-contents buffer-file-name
- nil start end)))
- (if shift-start
- (not (zerop start))
- (< end vlf-file-size)))
- ;; TODO: this seems like regression after Emacs 24.3
- (message "Buffer content may be broken")
- (setq shift (1+ shift))
- (if shift-start
- (setq start (1- start))
- (setq end (1+ end)))
- (delete-region position (point-max)))
- shift))
+(defun vlf-insert-file-contents-safe (start end position)
+ "Extract decoded file bytes START to END at POSITION."
+ (let ((coding buffer-file-coding-system))
+ (insert-file-contents-literally buffer-file-name nil start end)
+ (let ((coding-system-for-read coding))
+ (decode-coding-inserted-region position (point-max)
+ buffer-file-name nil start end))
+ (setq buffer-file-coding-system last-coding-system-used)))
(defun vlf-shift-undo-list (n)
"Shift undo list element regions by N."
diff --git a/vlf.el b/vlf.el
index 137faca..cfa06ae 100644
--- a/vlf.el
+++ b/vlf.el
@@ -149,6 +149,7 @@ You can customize number of bytes displayed by customizing
(with-current-buffer (generate-new-buffer "*vlf*")
(set-visited-file-name file)
(set-buffer-modified-p nil)
+ (setq buffer-file-coding-system nil)
(vlf-mode 1)
(switch-to-buffer (current-buffer))))
- [elpa] externals/vlf d1af56d 167/310: Fix opening of files for GNU Emacs 23., (continued)
- [elpa] externals/vlf d1af56d 167/310: Fix opening of files for GNU Emacs 23., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 8ab1c6a 136/310: Disable undo and mark buffer as not modified when invoking search or, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf bb482f0 173/310: Fix file size determination for symbolic links., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 9ffb968 172/310: Remove defadvice abort-if-file-too-large argument list so it works, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 386d856 179/310: Restore undo information after temporarily disabling it., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf deec75d 186/310: Enlarge minimum sample chunk for decoding size., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 516584e 187/310: Break VLF into components., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 27e3bbb 201/310: Reuse initial ediff session for all chunks., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 9343095 193/310: Fix installation interfile dependencies and fix setting of local, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 88dba8b 195/310: Remove unnecessary addition to load-path on compile., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf dd43af5 192/310: Manually decode and use several bytes buffer when loading chunk.,
Stefan Monnier <=
- [elpa] externals/vlf 98ddc3a 198/310: Add by batch Ediff functionality., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 9646b00 202/310: Adjust chunk borders to minimize shift differences and optimize, Stefan Monnier, 2020/11/28
- [elpa] externals/vlf d5d9cd7 205/310: Improve refining of differences and readjustment., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 0fa8e8d 210/310: Update buffer name on user interruption during ediff., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 30d2bb0 208/310: VLF buffer ediff now starts from the current chunks., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf f83a212 213/310: Temporarily disable font-lock during multiple batch operations., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 074f9e9 221/310: Play nicely with hexl-mode., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 8c61b77 222/310: Fix when batch hooks are run for occur and save., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 6476c1b 227/310: Update README, wording, add links and information on hooks., Stefan Monnier, 2020/11/28
- [elpa] externals/vlf 8ba5bea 229/310: Don't run vlf-after-batch-functions hook in vlf-build-occur., Stefan Monnier, 2020/11/28