From mboxrd@z Thu Jan 1 00:00:00 1970 From: Karl Fogel Subject: [PATCH] Use prefix arg to control scope of org-narrow-to-subtree. Date: Sun, 01 Dec 2019 02:45:45 -0600 Message-ID: <87y2vwv3gm.fsf_-_@red-bean.com> References: <87ftq7kyvt.fsf@red-bean.com> <878svyqxwc.fsf@nicolasgoaziou.fr> Reply-To: Karl Fogel Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:50771) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ibKri-0004gQ-0o for emacs-orgmode@gnu.org; Sun, 01 Dec 2019 03:46:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ibKre-0006Qo-1M for emacs-orgmode@gnu.org; Sun, 01 Dec 2019 03:46:00 -0500 Received: from mail-ot1-x334.google.com ([2607:f8b0:4864:20::334]:37746) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ibKra-0006Lf-4R for emacs-orgmode@gnu.org; Sun, 01 Dec 2019 03:45:54 -0500 Received: by mail-ot1-x334.google.com with SMTP id k14so12675122otn.4 for ; Sun, 01 Dec 2019 00:45:48 -0800 (PST) Received: from floss ([2602:306:3707:da30:c93d:4821:2abf:42d9]) by smtp.gmail.com with ESMTPSA id i20sm6227401otp.14.2019.12.01.00.45.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Dec 2019 00:45:46 -0800 (PST) In-Reply-To: <878svyqxwc.fsf@nicolasgoaziou.fr> (Nicolas Goaziou's message of "Thu, 25 Apr 2019 10:42:11 +0200") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: Org Mode --=-=-= Content-Type: text/plain This is the enhancement to `org-narrow-to-subtree' that I suggested back in May [1]. It allows you to choose what level subtree to narrow to. There are two ways to specify the subtree: use repeated C-u's to select "upward" from the current subtree, or use a direct numeric prefix arg to specify the subtree "downward" from level 1. (This is a somewhat unusual prefix argument usage, but it's useful to be able to choose from either direction, and the convenience of using C-u to select upward is quite enormous -- I expect it to be the common case, and it's pretty much the only way I use the feature.) The prefix arg is optional, of course: if you don't pass it, then `org-narrow-to-subtree' behaves the same way it has always behaved. Best regards, -Karl [1] https://lists.gnu.org/archive/html/emacs-orgmode/2019-05/msg00225.html --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-Use-prefix-arg-to-narrow-to-a-specific-subtree.patch >From bbeca3c5444646685085c134b10f4883812068a0 Mon Sep 17 00:00:00 2001 From: Karl Fogel Date: Sat, 30 Nov 2019 01:33:15 -0600 Subject: [PATCH] Use prefix arg to narrow to a specific subtree * lisp/org.el (org-narrow-to-subtree): Take a prefix arg and use it to choose which subtree to narrow to. See thread for context: https://lists.gnu.org/archive/html/emacs-orgmode/2019-05/msg00225.html From: Karl Fogel To: Org Mode Subject: Re: [PROPOSAL] Use prefix arg to control scope \ of org-narrow-to-subtree. Date: Fri, 31 May 2019 02:33:03 -0500 Message-ID: <87y32ncc40.fsf@red-bean.com> --- lisp/org.el | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 90f222c8b..9b16c59e6 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -7743,11 +7743,46 @@ If yes, remember the marker and the distance to BEG." (move-marker (car x) (+ beg (cdr x)))) (setq org-markers-to-move nil)) -(defun org-narrow-to-subtree () - "Narrow buffer to the current subtree." - (interactive) +(defun org-narrow-to-subtree (&optional steps) + "Narrow buffer to current subtree or to one specified by prefix arg STEPS. + +Interactively, use the prefix argument in one of two ways to +narrow to a specific subtree: either give one or more C-u's to +specify a subtree that many levels upward from the current +subtree (that is, go up as many levels as the number of C-u's +given -- each C-u counts for one level), or give a strictly +numeric argument to narrow to the subtree that is that many +levels downward from the current top level (level 1) subtree. + +From Lisp, if you want the C-u (upward) behavior, pass STEPS as a +list with the desired number as its sole element. Otherwise, +pass STEPS as a number to get the other (downward) behavior. + +If STEPS would specify a subtree higher than the current level 1 +subtree, then just narrow to that level 1 subtree (in other +words, you can use \"a lot of\" C-u's to narrow quickly to the +current top subtree). If STEPS would specify a subtree deeper +than the current subtree, just narrow to the current subtree." + (interactive "P") (save-excursion (save-match-data + (widen) + (if steps + (if (listp steps) + (progn + (setq steps (car steps)) + (when (< steps 0) + (error "Argument cannot be negative")) + (setq steps (round (log steps 4)))) + (when (< steps 0) ; awkward duplication, but hard to avoid + (error "Argument cannot be negative")) + (let ((cur-level (org-outline-level))) + (setq steps (max (- cur-level steps) 0)))) + (setq steps 0)) + (while (> steps 0) + (if (org-up-heading-safe) + (setq steps (1- steps)) + (setq steps 0))) (org-with-limited-levels (narrow-to-region (progn (org-back-to-heading t) (point)) -- 2.24.0 --=-=-=--