From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Andrey Kotlarski Newsgroups: gmane.emacs.devel Subject: Re: feature request: view part of file Date: Sat, 04 Aug 2012 14:58:22 +0300 Message-ID: <87fw82q36p.fsf@gmail.com> References: <87lijrszn0.fsf@gnu.org> <87y5npeg4p.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: dough.gmane.org 1344081512 21431 80.91.229.3 (4 Aug 2012 11:58:32 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Sat, 4 Aug 2012 11:58:32 +0000 (UTC) Cc: emacs-devel@gnu.org To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Aug 04 13:58:33 2012 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1Sxd00-0002ex-Ub for ged-emacs-devel@m.gmane.org; Sat, 04 Aug 2012 13:58:29 +0200 Original-Received: from localhost ([::1]:36615 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sxd00-0002qQ-BC for ged-emacs-devel@m.gmane.org; Sat, 04 Aug 2012 07:58:28 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:56006) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sxczw-0002qI-Nh for emacs-devel@gnu.org; Sat, 04 Aug 2012 07:58:25 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Sxczv-0008GX-Au for emacs-devel@gnu.org; Sat, 04 Aug 2012 07:58:24 -0400 Original-Received: from plane.gmane.org ([80.91.229.3]:56439) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sxczv-0008GH-0W for emacs-devel@gnu.org; Sat, 04 Aug 2012 07:58:23 -0400 Original-Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1Sxczu-0002aw-58 for emacs-devel@gnu.org; Sat, 04 Aug 2012 13:58:22 +0200 Original-Received: from 79.124.82.134 ([79.124.82.134]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sat, 04 Aug 2012 13:58:22 +0200 Original-Received: from m00naticus by 79.124.82.134 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sat, 04 Aug 2012 13:58:22 +0200 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 217 Original-X-Complaints-To: usenet@dough.gmane.org X-Gmane-NNTP-Posting-Host: 79.124.82.134 X-SMTP-Server: smtp.gmail.com User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux) Cancel-Lock: sha1:JglZtTcv1sDCYWi6j5QEv+pmtbc= X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 80.91.229.3 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:152168 Archived-At: Sam Steingold writes: > I put vlf.el by Mathias into elpa. Hello, thanks for putting this in gnu elpa, it's quite useful. > I rewrote it almost completely (bzr still has the original version at > revno 233). > > it works for me. > I wish I knew how to hook it into files.el, but I don't... > > vlf.el has 2 issues: > > 1. insert-file-contents hangs emacs (see `vlf-next-batch'): > > ;; replacing `erase-buffer' with replace arg to `insert-file-contents' > ;; hangs emacs > (unless append (erase-buffer)) > (insert-file-contents buffer-file-name nil vlf-end-pos end) I guess you've been using rather large file. My attempts showed that non nil REPLACE argument of insert-file-contents doesn't honour BEG END and always inserts the whole file. Anyway, I've made a few additions that I think are worth sharing. * 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 Here is a changelog entry if necessary and a diff: 2012-08-04 Andrey Kotlarski * vlf.el (vlf-mode-map): Add decrease batch key binding. (vlf-change-batch-size): Fix doc string. (vlf-format-buffer-name): Fix indentation. (vlf-next-batch): Optionally jump/insert several batches based on prefix argument. If requested batch is past the end of file, get current file length and view as much as possible. (vlf-prev-batch): Optionally jump/insert several batches based on prefix argument. (vlf): Start viewing from end of file if prefix argument is given. Add autoload cookie. diff -u vlf.el\~ vlf.el --- vlf.el~ 2012-07-23 17:34:54.000000000 +0300 +++ vlf.el 2012-07-27 23:44:43.696003339 +0300 @@ -2,7 +2,7 @@ ;; Copyright (C) 2006, 2012 Free Software Foundation, Inc. -;; Version: 0.2 +;; Version: 0.3 ;; Keywords: large files, utilities ;; Authors: 2006 Mathias Dahl ;; 2012 Sam Steingold @@ -57,6 +57,10 @@ (define-key map [M-next] 'vlf-next-batch) (define-key map [M-prior] 'vlf-prev-batch) (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) "Keymap for `vlf-mode'.") @@ -71,22 +75,22 @@ (defun vlf-change-batch-size (decrease) "Change the buffer-local value of `vlf-batch-size'. Normally, the value is doubled; -with the prefix argument it is halved." +with the prefix argument DECREASE it is halved." (interactive "P") (or (assq 'vlf-batch-size (buffer-local-variables)) (error "%s is not local in this buffer" 'vlf-batch-size)) (setq vlf-batch-size - (if decrease - (/ vlf-batch-size 2) - (* vlf-batch-size 2))) + (if decrease + (/ vlf-batch-size 2) + (* vlf-batch-size 2))) (vlf-update-buffer-name)) (defun vlf-format-buffer-name () "Return format for vlf buffer name." (format "%s(%s)[%d,%d](%d)" - (file-name-nondirectory buffer-file-name) - (file-size-human-readable vlf-file-size) - vlf-start-pos vlf-end-pos vlf-batch-size)) + (file-name-nondirectory buffer-file-name) + (file-size-human-readable vlf-file-size) + vlf-start-pos vlf-end-pos vlf-batch-size)) (defun vlf-update-buffer-name () "Update the current buffer name." @@ -94,56 +98,80 @@ (defun vlf-next-batch (append) "Display the next batch of file data. -Append to the existing buffer when the prefix argument is supplied." - (interactive "P") - (when (= vlf-end-pos vlf-file-size) - (error "Already at EOF")) - (let ((inhibit-read-only t) - (end (min vlf-file-size (+ vlf-end-pos vlf-batch-size)))) - (goto-char (point-max)) - ;; replacing `erase-buffer' with replace arg to `insert-file-contents' - ;; hangs emacs - (unless append (erase-buffer)) - (insert-file-contents buffer-file-name nil vlf-end-pos end) - (unless append - (setq vlf-start-pos vlf-end-pos)) - (setq vlf-end-pos end) - (set-buffer-modified-p nil) - (vlf-update-buffer-name))) +When prefix argument is supplied and positive + jump over APPEND number of batches. +When prefix argument is negative + append next APPEND number of batches to the existing buffer." + (interactive "p") + (let ((end (+ vlf-end-pos (* vlf-batch-size + (abs append))))) + (when (< vlf-file-size end) ; re-check file size + (setq vlf-file-size (nth 7 (file-attributes buffer-file-name))) + (cond ((= vlf-end-pos vlf-file-size) + (error "Already at EOF")) + ((< vlf-file-size end) + (setq end vlf-file-size)))) + (let ((inhibit-read-only t) + (do-append (< append 0))) + (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) "Display the previous batch of file data. -Prepend to the existing buffer when the prefix argument is supplied." - (interactive "P") - (when (= vlf-start-pos 0) - (error "Already at BOF")) +When prefix argument is supplied and positive + jump over PREPEND number of batches. +When prefix argument is negative + 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) - (start (max 0 (- vlf-start-pos vlf-batch-size)))) - (goto-char (point-min)) - (unless prepend (erase-buffer)) - (insert-file-contents buffer-file-name nil start vlf-start-pos) - (unless prepend - (setq vlf-end-pos vlf-start-pos)) - (setq vlf-start-pos start) - (set-buffer-modified-p nil) - (vlf-update-buffer-name))) + (start (max 0 (- vlf-start-pos (* vlf-batch-size + (abs prepend))))) + (do-prepend (< prepend 0))) + (if do-prepend + (goto-char (point-min)) + (setq vlf-end-pos (+ start vlf-batch-size)) + (erase-buffer)) + (insert-file-contents buffer-file-name nil start + (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. +With FROM-END prefix, view from the back. FILE is the file to open. Batches of the file data from FILE will be displayed in a read-only buffer. You can customize the number of bytes to display by customizing `vlf-batch-size'." - (interactive "fFile to open: ") + (interactive "P\nfFile to open: ") (with-current-buffer (generate-new-buffer "*vlf*") (setq buffer-file-name file - vlf-start-pos 0 - vlf-end-pos vlf-batch-size - vlf-file-size (nth 7 (file-attributes file))) + vlf-file-size (nth 7 (file-attributes file))) + (if from-end + (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) (insert-file-contents buffer-file-name nil - vlf-start-pos vlf-end-pos nil) + vlf-start-pos vlf-end-pos) (vlf-mode) (display-buffer (current-buffer))))