From 4a9be5b1a7a19c5d092ed14a86d29ad83122e9a8 Mon Sep 17 00:00:00 2001 From: Puneeth Chaganti Date: Sun, 9 Jan 2011 00:48:51 +0530 Subject: [PATCH] Include only specified range of line numbers of a file * doc/org.texi (Include files): Document :lines. * lisp/org-exp.el (org-export-handle-include-files): Support :lines property. (org-get-file-contents): New argument lines to include specify a range of lines to include. On Fri, Jan 7, 2011 at 1:29 PM, Puneeth wrote: > On Fri, Jan 7, 2011 at 10:03 AM, Venkatesh Choppella > wrote: >> I would like to include a part of a file (between a given range of >> line numbers) instead of the whole file. Is there a way to do that >> in org-mode? > > It isn't possible to include files using line numbers, as of now. > Here's a quick patch that would add this feature. I have tested it > with small files and works fine. Can somebody tell me if it looks > good? > > :lines "5-10" will include the lines from 5 to 10, 10 excluded. > :lines "-10" will include the lines from 1 to 10, 10 excluded. > :lines "5-" will include the lines from 1 to the end of the file. > > HTH, > Puneeth --- doc/org.texi | 11 +++++++++++ lisp/org-exp.el | 24 ++++++++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/doc/org.texi b/doc/org.texi index e83909d..62f90e9 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -8891,6 +8891,17 @@ use #+INCLUDE: "~/snippets/xx" :prefix1 " + " :prefix " " @end example +You can also include a portion of a file, by specifying a range of line +numbers using the @code{:lines} parameter. The line with the line number +equal to the end of the range, will not be included. The start or/and the +end limits of the range, may be omitted to use the obvious defaults. + address@hidden +#+INCLUDE: "~/.emacs" :lines "5-10" @r{Include lines 5 to 10, 10 excluded} +#+INCLUDE: "~/.emacs" :lines "-10" @r{Include lines 1 to 10, 10 excluded} +#+INCLUDE: "~/.emacs" :lines "10-" @r{Include lines from 10 to EOF} address@hidden example + @table @kbd @kindex C-c ' @item C-c ' diff --git a/lisp/org-exp.el b/lisp/org-exp.el index 3d466fa..ea81386 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -2130,13 +2130,14 @@ TYPE must be a string, any of: (defun org-export-handle-include-files () "Include the contents of include files, with proper formatting." (let ((case-fold-search t) - params file markup lang start end prefix prefix1 switches all minlevel) + params file markup lang start end prefix prefix1 switches all minlevel lines) (goto-char (point-min)) (while (re-search-forward "^#\\+INCLUDE:?[ \t]+\\(.*\\)" nil t) (setq params (read (concat "(" (match-string 1) ")")) prefix (org-get-and-remove-property 'params :prefix) prefix1 (org-get-and-remove-property 'params :prefix1) minlevel (org-get-and-remove-property 'params :minlevel) + lines (org-get-and-remove-property 'params :lines) file (org-symname-or-string (pop params)) markup (org-symname-or-string (pop params)) lang (and (member markup '("src" "SRC")) @@ -2159,7 +2160,7 @@ TYPE must be a string, any of: end (format "#+end_%s" markup)))) (insert (or start "")) (insert (org-get-file-contents (expand-file-name file) - prefix prefix1 markup minlevel)) + prefix prefix1 markup minlevel lines)) (or (bolp) (newline)) (insert (or end "")))) all)) @@ -2176,15 +2177,30 @@ TYPE must be a string, any of: (when intersection (error "Recursive #+INCLUDE: %S" intersection)))))) -(defun org-get-file-contents (file &optional prefix prefix1 markup minlevel) +(defun org-get-file-contents (file &optional prefix prefix1 markup minlevel lines) "Get the contents of FILE and return them as a string. If PREFIX is a string, prepend it to each line. If PREFIX1 is a string, prepend it to the first line instead of PREFIX. If MARKUP, don't protect org-like lines, the exporter will -take care of the block they are in." +take care of the block they are in. If LINES is a string, +include only the lines specified." (if (stringp markup) (setq markup (downcase markup))) (with-temp-buffer (insert-file-contents file) + (when lines + (let (beg end) + (setq lines (split-string lines "-") + beg (if (string= "" (car lines)) + (point-min) + (goto-char (point-min)) + (forward-line (1- (string-to-number (car lines)))) + (point)) + end (if (string= "" (cadr lines)) + (point-max) + (goto-char (point-min)) + (forward-line (1- (string-to-number (cadr lines)))) + (point))) + (narrow-to-region beg end))) (when (or prefix prefix1) (goto-char (point-min)) (while (not (eobp)) -- 1.7.1