1
0
mirror of https://github.com/m00natic/vlfi.git synced 2025-02-07 05:30:47 +00:00

Improvements to the existing functionality:

- option to start viewing from the end of file
- ability to jump/insert given number of batches at once
- ability to view newly added content if the file has grown meanwhile
This commit is contained in:
Andrey Kotlarski 2013-01-12 17:30:49 +02:00
parent 78cd8fc143
commit 2d0709beca
2 changed files with 81 additions and 49 deletions

View File

@ -1,3 +1,4 @@
* View Large File * View Large File
An Emacs mode that allows viewing files in chunks. An Emacs mode that allows viewing files in chunks. This is a fork
that builds on the GNU ELPA vlf.el.

127
vlf.el
View File

@ -2,10 +2,11 @@
;; Copyright (C) 2006, 2012 Free Software Foundation, Inc. ;; Copyright (C) 2006, 2012 Free Software Foundation, Inc.
;; Version: 0.2 ;; Version: 0.3
;; Keywords: large files, utilities ;; Keywords: large files, utilities
;; Authors: 2006 Mathias Dahl <mathias.dahl@gmail.com> ;; Authors: 2006 Mathias Dahl <mathias.dahl@gmail.com>
;; 2012 Sam Steingold <sds@gnu.org> ;; 2012 Sam Steingold <sds@gnu.org>
;; 2013 Andrey Kotlarski <m00naticus@gmail.com>
;; This file is free software; you can redistribute it and/or modify ;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by ;; it under the terms of the GNU General Public License as published by
@ -57,6 +58,10 @@
(define-key map [M-next] 'vlf-next-batch) (define-key map [M-next] 'vlf-next-batch)
(define-key map [M-prior] 'vlf-prev-batch) (define-key map [M-prior] 'vlf-prev-batch)
(define-key map (kbd "C-+") 'vlf-change-batch-size) (define-key map (kbd "C-+") 'vlf-change-batch-size)
(define-key map (kbd "C--")
(lambda () "Decrease vlf batch size by factor of 2."
(interactive)
(vlf-change-batch-size t)))
map) map)
"Keymap for `vlf-mode'.") "Keymap for `vlf-mode'.")
@ -71,22 +76,22 @@
(defun vlf-change-batch-size (decrease) (defun vlf-change-batch-size (decrease)
"Change the buffer-local value of `vlf-batch-size'. "Change the buffer-local value of `vlf-batch-size'.
Normally, the value is doubled; Normally, the value is doubled;
with the prefix argument it is halved." with the prefix argument DECREASE it is halved."
(interactive "P") (interactive "P")
(or (assq 'vlf-batch-size (buffer-local-variables)) (or (assq 'vlf-batch-size (buffer-local-variables))
(error "%s is not local in this buffer" 'vlf-batch-size)) (error "%s is not local in this buffer" 'vlf-batch-size))
(setq vlf-batch-size (setq vlf-batch-size
(if decrease (if decrease
(/ vlf-batch-size 2) (/ vlf-batch-size 2)
(* vlf-batch-size 2))) (* vlf-batch-size 2)))
(vlf-update-buffer-name)) (vlf-update-buffer-name))
(defun vlf-format-buffer-name () (defun vlf-format-buffer-name ()
"Return format for vlf buffer name." "Return format for vlf buffer name."
(format "%s(%s)[%d,%d](%d)" (format "%s(%s)[%d,%d](%d)"
(file-name-nondirectory buffer-file-name) (file-name-nondirectory buffer-file-name)
(file-size-human-readable vlf-file-size) (file-size-human-readable vlf-file-size)
vlf-start-pos vlf-end-pos vlf-batch-size)) vlf-start-pos vlf-end-pos vlf-batch-size))
(defun vlf-update-buffer-name () (defun vlf-update-buffer-name ()
"Update the current buffer name." "Update the current buffer name."
@ -94,65 +99,91 @@ with the prefix argument it is halved."
(defun vlf-next-batch (append) (defun vlf-next-batch (append)
"Display the next batch of file data. "Display the next batch of file data.
Append to the existing buffer when the prefix argument is supplied." When prefix argument is supplied and positive
(interactive "P") jump over APPEND number of batches.
(when (= vlf-end-pos vlf-file-size) When prefix argument is negative
(error "Already at EOF")) append next APPEND number of batches to the existing buffer."
(let ((inhibit-read-only t) (interactive "p")
(end (min vlf-file-size (+ vlf-end-pos vlf-batch-size)))) (let ((end (+ vlf-end-pos (* vlf-batch-size
(goto-char (point-max)) (abs append)))))
;; replacing `erase-buffer' with replace arg to `insert-file-contents' (when (< vlf-file-size end) ; re-check file size
;; hangs emacs (setq vlf-file-size (nth 7 (file-attributes buffer-file-name)))
(unless append (erase-buffer)) (cond ((= vlf-end-pos vlf-file-size)
(insert-file-contents buffer-file-name nil vlf-end-pos end) (error "Already at EOF"))
(unless append ((< vlf-file-size end)
(setq vlf-start-pos vlf-end-pos)) (setq end vlf-file-size))))
(setq vlf-end-pos end) (let ((inhibit-read-only t)
(set-buffer-modified-p nil) (do-append (< append 0)))
(vlf-update-buffer-name))) (if do-append
(goto-char (point-max))
(setq vlf-start-pos (- end vlf-batch-size))
(erase-buffer))
(insert-file-contents buffer-file-name nil
(if do-append
vlf-end-pos
vlf-start-pos)
end))
(setq vlf-end-pos end))
(set-buffer-modified-p nil)
(vlf-update-buffer-name))
(defun vlf-prev-batch (prepend) (defun vlf-prev-batch (prepend)
"Display the previous batch of file data. "Display the previous batch of file data.
Prepend to the existing buffer when the prefix argument is supplied." When prefix argument is supplied and positive
(interactive "P") jump over PREPEND number of batches.
(when (= vlf-start-pos 0) When prefix argument is negative
(error "Already at BOF")) append previous PREPEND number of batches to the existing buffer."
(interactive "p")
(if (zerop vlf-start-pos)
(error "Already at BOF"))
(let ((inhibit-read-only t) (let ((inhibit-read-only t)
(start (max 0 (- vlf-start-pos vlf-batch-size)))) (start (max 0 (- vlf-start-pos (* vlf-batch-size
(goto-char (point-min)) (abs prepend)))))
(unless prepend (erase-buffer)) (do-prepend (< prepend 0)))
(insert-file-contents buffer-file-name nil start vlf-start-pos) (if do-prepend
(unless prepend (goto-char (point-min))
(setq vlf-end-pos vlf-start-pos)) (setq vlf-end-pos (+ start vlf-batch-size))
(setq vlf-start-pos start) (erase-buffer))
(set-buffer-modified-p nil) (insert-file-contents buffer-file-name nil start
(vlf-update-buffer-name))) (if do-prepend
vlf-start-pos
vlf-end-pos))
(setq vlf-start-pos start))
(set-buffer-modified-p nil)
(vlf-update-buffer-name))
(defun vlf (file) ;;;###autoload
(defun vlf (from-end file)
"View a Large File in Emacs. "View a Large File in Emacs.
With FROM-END prefix, view from the back.
FILE is the file to open. FILE is the file to open.
Batches of the file data from FILE will be displayed in a Batches of the file data from FILE will be displayed in a
read-only buffer. read-only buffer.
You can customize the number of bytes to You can customize the number of bytes to
display by customizing `vlf-batch-size'." display by customizing `vlf-batch-size'."
(interactive "fFile to open: ") (interactive "P\nfFile to open: ")
(with-current-buffer (generate-new-buffer "*vlf*") (with-current-buffer (generate-new-buffer "*vlf*")
(setq buffer-file-name file (setq buffer-file-name file
vlf-start-pos 0 vlf-file-size (nth 7 (file-attributes file)))
vlf-end-pos vlf-batch-size (if from-end
vlf-file-size (nth 7 (file-attributes file))) (setq vlf-start-pos (max 0 (- vlf-file-size vlf-batch-size))
vlf-end-pos vlf-file-size)
(setq vlf-start-pos 0
vlf-end-pos (min vlf-batch-size vlf-file-size)))
(vlf-update-buffer-name) (vlf-update-buffer-name)
(insert-file-contents buffer-file-name nil (insert-file-contents buffer-file-name nil
vlf-start-pos vlf-end-pos nil) vlf-start-pos vlf-end-pos)
(vlf-mode) (vlf-mode)
(display-buffer (current-buffer)))) (display-buffer (current-buffer))))
(defun dired-vlf () (defun dired-vlf (from-end)
"In Dired, visit the file on this line in VLF mode." "In Dired, visit the file on this line in VLF mode.
(interactive) With FROM-END prefix, view from the back."
(vlf (dired-get-file-for-visit))) (interactive "P")
(vlf from-end (dired-get-file-for-visit)))
(eval-after-load "dired" '(define-key dired-mode-map "V" 'dired-vlf)) (eval-after-load "dired"
'(define-key dired-mode-map "V" 'dired-vlf))
;;;; ChangeLog: ;;;; ChangeLog: