From 2b13ca4d11960fe1d8b858a64864d7b74bf60867 Mon Sep 17 00:00:00 2001 From: Phil Sainty Date: Thu, 3 Jul 2014 22:00:54 -0400 Subject: [PATCH] * lisp/emacs-lisp/lisp.el (narrow-to-defun-include-comments): New var. (narrow-to-defun): New arg include-comments, defaulting to it. Fixes: debbugs:16328 --- lisp/ChangeLog | 6 ++++++ lisp/emacs-lisp/lisp.el | 24 ++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c0b50604897..ed9a1100d49 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2014-07-04 Phil Sainty (tiny change) + + * emacs-lisp/lisp.el (narrow-to-defun-include-comments): New var. + (narrow-to-defun): New arg include-comments, defaulting to it + (bug#16328). + 2014-07-03 Stefan Monnier * rect.el (rectangle--highlight-for-redisplay): Don't pass `orig' with diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el index 23b021df177..30fee64635c 100644 --- a/lisp/emacs-lisp/lisp.el +++ b/lisp/emacs-lisp/lisp.el @@ -522,11 +522,15 @@ it marks the next defun after the ones already marked." (beginning-of-defun)) (re-search-backward "^\n" (- (point) 1) t))))) -(defun narrow-to-defun (&optional _arg) +(defvar narrow-to-defun-include-comments nil + "If non-nil, `narrow-to-defun' will also show comments preceding the defun.") + +(defun narrow-to-defun (&optional include-comments) "Make text outside current defun invisible. -The defun visible is the one that contains point or follows point. -Optional ARG is ignored." - (interactive) +The current defun is the one that contains point or follows point. +Preceding comments are included if INCLUDE-COMMENTS is non-nil. +Interactively, the behavior depends on `narrow-to-defun-include-comments'." + (interactive (list narrow-to-defun-include-comments)) (save-excursion (widen) (let ((opoint (point)) @@ -562,6 +566,18 @@ Optional ARG is ignored." (setq end (point)) (beginning-of-defun) (setq beg (point))) + (when include-comments + (goto-char beg) + ;; Move back past all preceding comments (and whitespace). + (when (forward-comment -1) + (while (forward-comment -1)) + ;; Move forwards past any page breaks within these comments. + (when (and page-delimiter (not (string= page-delimiter ""))) + (while (re-search-forward page-delimiter beg t))) + ;; Lastly, move past any empty lines. + (skip-chars-forward "[:space:]\n") + (beginning-of-line) + (setq beg (point)))) (goto-char end) (re-search-backward "^\n" (- (point) 1) t) (narrow-to-region beg end)))) -- 2.39.5