Re: get the body of a heading up to the next subheading
Hi John, John Kitchin writes: > Here is a new version that might fail some other way! > > (defun canvas-org-get-heading-body () > "Return the body of the current heading up to the next heading." > (interactive) > (save-excursion > (unless (org-at-heading-p) > (org-previous-visible-heading 1)) > (org-end-of-meta-data) > (buffer-substring (point) > (progn (org-next-visible-heading 1) (point) Maybe this is useful enough to end up in https://orgmode.org/worg/org-hacks.html ? We obviously need to make this page more readable and useful, but new contents is always welcome. Thanks, -- Bastien
Re: get the body of a heading up to the next subheading
> I don't think there's anything built-in, no. I have needed this in > various places, and did something similar to the above, except with a > combination of `org-back-to-heading', `org-end-of-meta-data', then > `outline-next-heading'. Hmm. I just noticed a reference to built-in org-agenda-get-some-entry-text in the function I sent earlier. I do not see why it cannot be used outside agenda. Maybe something like (let ((org-agenda-entry-text-cleanup-hook nil)) (org-agenda-get-some-entry-text (point-marker) #x4000)) Eric Abrahamsen writes: > John Kitchin writes: > >> Thanks! Here is what I am currently using: >> >> (defun canvas-org-get-heading-body () >> "Return the body of the current heading up to the next heading." >> (interactive) >> (save-excursion >> (unless (org-at-heading-p) >> (org-previous-visible-heading 1)) >> (org-end-of-meta-data) >> (buffer-substring (point) >>(progn (re-search-forward org-heading-regexp nil 'mv) >> (line-beginning-position) >> >> So far it gets what I want. I am pretty sure I have reinvented this, >> maybe even from code I wrote before... I couldn't find my answer on SO >> or my blog though. > > I don't think there's anything built-in, no. I have needed this in > various places, and did something similar to the above, except with a > combination of `org-back-to-heading', `org-end-of-meta-data', then > `outline-next-heading'. -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yanta...@gmail.com, ihor_radche...@alumni.sutd.edu.sg
Re: get the body of a heading up to the next subheading
John Kitchin writes: > Thanks! Here is what I am currently using: > > (defun canvas-org-get-heading-body () > "Return the body of the current heading up to the next heading." > (interactive) > (save-excursion > (unless (org-at-heading-p) > (org-previous-visible-heading 1)) > (org-end-of-meta-data) > (buffer-substring (point) > (progn (re-search-forward org-heading-regexp nil 'mv) >(line-beginning-position) > > So far it gets what I want. I am pretty sure I have reinvented this, > maybe even from code I wrote before... I couldn't find my answer on SO > or my blog though. I don't think there's anything built-in, no. I have needed this in various places, and did something similar to the above, except with a combination of `org-back-to-heading', `org-end-of-meta-data', then `outline-next-heading'.
Re: get the body of a heading up to the next subheading
good point, thanks! Here is a new version that might fail some other way! (defun canvas-org-get-heading-body () "Return the body of the current heading up to the next heading." (interactive) (save-excursion (unless (org-at-heading-p) (org-previous-visible-heading 1)) (org-end-of-meta-data) (buffer-substring (point) (progn (org-next-visible-heading 1) (point) John --- Professor John Kitchin Doherty Hall A207F Department of Chemical Engineering Carnegie Mellon University Pittsburgh, PA 15213 412-268-7803 @johnkitchin http://kitchingroup.cheme.cmu.edu On Wed, May 13, 2020 at 10:42 AM Ihor Radchenko wrote: > > Thanks! Here is what I am currently using: > > Note that your code may fail if there is an inline task in the body. > > Best, > Ihor > > John Kitchin writes: > > > Thanks! Here is what I am currently using: > > > > (defun canvas-org-get-heading-body () > > "Return the body of the current heading up to the next heading." > > (interactive) > > (save-excursion > > (unless (org-at-heading-p) > > (org-previous-visible-heading 1)) > > (org-end-of-meta-data) > > (buffer-substring (point) > > (progn (re-search-forward org-heading-regexp nil 'mv) > >(line-beginning-position) > > > > So far it gets what I want. I am pretty sure I have reinvented this, > > maybe even from code I wrote before... I couldn't find my answer on SO > > or my blog though. > > > > Ihor Radchenko writes: > > > >> You may use something similar to org-quick-peek--get-entry-text from > >> org-quick-peek package (https://github.com/alphapapa/org-quick-peek): > >> > >> (cl-defun org-quick-peek--get-entry-text (marker &key keep-drawers > keep-planning) > >> "Return Org entry text from node at MARKER. > >> If KEEP-DRAWERS is non-nil, drawers will be kept, otherwise > >> removed." > >> ;; Modeled after `org-agenda-get-some-entry-text' > >> (let (text) > >> (with-current-buffer (marker-buffer marker) > >> ;; Get raw entry text > >> (org-with-wide-buffer > >>(goto-char marker) > >>;; Skip heading > >>(end-of-line 1) > >>;; Get entry text > >>(setq text (buffer-substring > >>(point) > >>(or (save-excursion (outline-next-heading) (point)) > >>(point-max)) > >> (with-temp-buffer > >> (org-mode) > >> (insert text) > >> (unless keep-drawers > >> (goto-char (point-min)) > >> (while (re-search-forward org-drawer-regexp nil t) > >> ;; Remove drawers > >> (delete-region (match-beginning 0) > >> (progn (re-search-forward > >> "^[ \t]*:END:.*\n?" nil 'move) > >> (point) > >> (unless keep-planning > >> (goto-char (point-min)) > >> (while (re-search-forward org-planning-line-re nil t) > >> ;; Remove planning line > >> (kill-whole-line))) > >> (setq text (buffer-substring (point-min) (point-max > >> (-reduce-r #'funcall (reverse (cons text (cons #'identity > org-quick-peek-filter-functions)) > >> > >> Best, > >> Ihor > >> > >> John Kitchin writes: > >> > >>> Hi everyone, > >>> > >>> I am trying to get the body of a heading up to the next subheading. For > >>> example with this org file, > >>> > >>> * quiz one > >>> > >>> This is the description. > >>> Use emacs for this. > >>> > >>> ** question 1 > >>> what is 40 + 2 > >>> > >>> If the point is in the first heading, I want to run a function that > would > >>> return the string "This is the description.\nUse emacs for this." > >>> > >>> I thought there was a simple way to do that, but so far it has eluded > my > >>> google fu. Any hints? > >>> > >>> John > >>> > >>> --- > >>> Professor John Kitchin > >>> Doherty Hall A207F > >>> Department of Chemical Engineering > >>> Carnegie Mellon University > >>> Pittsburgh, PA 15213 > >>> 412-268-7803 > >>> @johnkitchin > >>> http://kitchingroup.cheme.cmu.edu > > > > > > -- > > Professor John Kitchin > > Doherty Hall A207F > > Department of Chemical Engineering > > Carnegie Mellon University > > Pittsburgh, PA 15213 > > 412-268-7803 > > @johnkitchin > > http://kitchingroup.cheme.cmu.edu > > -- > Ihor Radchenko, > PhD, > Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) > State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong > University, Xi'an, China > Email: yanta...@gmail.com, ihor_radche...@alumni.sutd.edu.sg >
Re: get the body of a heading up to the next subheading
> Thanks! Here is what I am currently using: Note that your code may fail if there is an inline task in the body. Best, Ihor John Kitchin writes: > Thanks! Here is what I am currently using: > > (defun canvas-org-get-heading-body () > "Return the body of the current heading up to the next heading." > (interactive) > (save-excursion > (unless (org-at-heading-p) > (org-previous-visible-heading 1)) > (org-end-of-meta-data) > (buffer-substring (point) > (progn (re-search-forward org-heading-regexp nil 'mv) >(line-beginning-position) > > So far it gets what I want. I am pretty sure I have reinvented this, > maybe even from code I wrote before... I couldn't find my answer on SO > or my blog though. > > Ihor Radchenko writes: > >> You may use something similar to org-quick-peek--get-entry-text from >> org-quick-peek package (https://github.com/alphapapa/org-quick-peek): >> >> (cl-defun org-quick-peek--get-entry-text (marker &key keep-drawers >> keep-planning) >> "Return Org entry text from node at MARKER. >> If KEEP-DRAWERS is non-nil, drawers will be kept, otherwise >> removed." >> ;; Modeled after `org-agenda-get-some-entry-text' >> (let (text) >> (with-current-buffer (marker-buffer marker) >> ;; Get raw entry text >> (org-with-wide-buffer >>(goto-char marker) >>;; Skip heading >>(end-of-line 1) >>;; Get entry text >>(setq text (buffer-substring >>(point) >>(or (save-excursion (outline-next-heading) (point)) >>(point-max)) >> (with-temp-buffer >> (org-mode) >> (insert text) >> (unless keep-drawers >> (goto-char (point-min)) >> (while (re-search-forward org-drawer-regexp nil t) >> ;; Remove drawers >> (delete-region (match-beginning 0) >> (progn (re-search-forward >> "^[ \t]*:END:.*\n?" nil 'move) >> (point) >> (unless keep-planning >> (goto-char (point-min)) >> (while (re-search-forward org-planning-line-re nil t) >> ;; Remove planning line >> (kill-whole-line))) >> (setq text (buffer-substring (point-min) (point-max >> (-reduce-r #'funcall (reverse (cons text (cons #'identity >> org-quick-peek-filter-functions)) >> >> Best, >> Ihor >> >> John Kitchin writes: >> >>> Hi everyone, >>> >>> I am trying to get the body of a heading up to the next subheading. For >>> example with this org file, >>> >>> * quiz one >>> >>> This is the description. >>> Use emacs for this. >>> >>> ** question 1 >>> what is 40 + 2 >>> >>> If the point is in the first heading, I want to run a function that would >>> return the string "This is the description.\nUse emacs for this." >>> >>> I thought there was a simple way to do that, but so far it has eluded my >>> google fu. Any hints? >>> >>> John >>> >>> --- >>> Professor John Kitchin >>> Doherty Hall A207F >>> Department of Chemical Engineering >>> Carnegie Mellon University >>> Pittsburgh, PA 15213 >>> 412-268-7803 >>> @johnkitchin >>> http://kitchingroup.cheme.cmu.edu > > > -- > Professor John Kitchin > Doherty Hall A207F > Department of Chemical Engineering > Carnegie Mellon University > Pittsburgh, PA 15213 > 412-268-7803 > @johnkitchin > http://kitchingroup.cheme.cmu.edu -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yanta...@gmail.com, ihor_radche...@alumni.sutd.edu.sg
Re: get the body of a heading up to the next subheading
Thanks! Here is what I am currently using: (defun canvas-org-get-heading-body () "Return the body of the current heading up to the next heading." (interactive) (save-excursion (unless (org-at-heading-p) (org-previous-visible-heading 1)) (org-end-of-meta-data) (buffer-substring (point) (progn (re-search-forward org-heading-regexp nil 'mv) (line-beginning-position) So far it gets what I want. I am pretty sure I have reinvented this, maybe even from code I wrote before... I couldn't find my answer on SO or my blog though. Ihor Radchenko writes: > You may use something similar to org-quick-peek--get-entry-text from > org-quick-peek package (https://github.com/alphapapa/org-quick-peek): > > (cl-defun org-quick-peek--get-entry-text (marker &key keep-drawers > keep-planning) > "Return Org entry text from node at MARKER. > If KEEP-DRAWERS is non-nil, drawers will be kept, otherwise > removed." > ;; Modeled after `org-agenda-get-some-entry-text' > (let (text) > (with-current-buffer (marker-buffer marker) > ;; Get raw entry text > (org-with-wide-buffer >(goto-char marker) >;; Skip heading >(end-of-line 1) >;; Get entry text >(setq text (buffer-substring >(point) >(or (save-excursion (outline-next-heading) (point)) >(point-max)) > (with-temp-buffer > (org-mode) > (insert text) > (unless keep-drawers > (goto-char (point-min)) > (while (re-search-forward org-drawer-regexp nil t) > ;; Remove drawers > (delete-region (match-beginning 0) > (progn (re-search-forward > "^[ \t]*:END:.*\n?" nil 'move) > (point) > (unless keep-planning > (goto-char (point-min)) > (while (re-search-forward org-planning-line-re nil t) > ;; Remove planning line > (kill-whole-line))) > (setq text (buffer-substring (point-min) (point-max > (-reduce-r #'funcall (reverse (cons text (cons #'identity > org-quick-peek-filter-functions)) > > Best, > Ihor > > John Kitchin writes: > >> Hi everyone, >> >> I am trying to get the body of a heading up to the next subheading. For >> example with this org file, >> >> * quiz one >> >> This is the description. >> Use emacs for this. >> >> ** question 1 >> what is 40 + 2 >> >> If the point is in the first heading, I want to run a function that would >> return the string "This is the description.\nUse emacs for this." >> >> I thought there was a simple way to do that, but so far it has eluded my >> google fu. Any hints? >> >> John >> >> --- >> Professor John Kitchin >> Doherty Hall A207F >> Department of Chemical Engineering >> Carnegie Mellon University >> Pittsburgh, PA 15213 >> 412-268-7803 >> @johnkitchin >> http://kitchingroup.cheme.cmu.edu -- Professor John Kitchin Doherty Hall A207F Department of Chemical Engineering Carnegie Mellon University Pittsburgh, PA 15213 412-268-7803 @johnkitchin http://kitchingroup.cheme.cmu.edu
Re: get the body of a heading up to the next subheading
You may use something similar to org-quick-peek--get-entry-text from org-quick-peek package (https://github.com/alphapapa/org-quick-peek): (cl-defun org-quick-peek--get-entry-text (marker &key keep-drawers keep-planning) "Return Org entry text from node at MARKER. If KEEP-DRAWERS is non-nil, drawers will be kept, otherwise removed." ;; Modeled after `org-agenda-get-some-entry-text' (let (text) (with-current-buffer (marker-buffer marker) ;; Get raw entry text (org-with-wide-buffer (goto-char marker) ;; Skip heading (end-of-line 1) ;; Get entry text (setq text (buffer-substring (point) (or (save-excursion (outline-next-heading) (point)) (point-max)) (with-temp-buffer (org-mode) (insert text) (unless keep-drawers (goto-char (point-min)) (while (re-search-forward org-drawer-regexp nil t) ;; Remove drawers (delete-region (match-beginning 0) (progn (re-search-forward "^[ \t]*:END:.*\n?" nil 'move) (point) (unless keep-planning (goto-char (point-min)) (while (re-search-forward org-planning-line-re nil t) ;; Remove planning line (kill-whole-line))) (setq text (buffer-substring (point-min) (point-max (-reduce-r #'funcall (reverse (cons text (cons #'identity org-quick-peek-filter-functions)) Best, Ihor John Kitchin writes: > Hi everyone, > > I am trying to get the body of a heading up to the next subheading. For > example with this org file, > > * quiz one > > This is the description. > Use emacs for this. > > ** question 1 > what is 40 + 2 > > If the point is in the first heading, I want to run a function that would > return the string "This is the description.\nUse emacs for this." > > I thought there was a simple way to do that, but so far it has eluded my > google fu. Any hints? > > John > > --- > Professor John Kitchin > Doherty Hall A207F > Department of Chemical Engineering > Carnegie Mellon University > Pittsburgh, PA 15213 > 412-268-7803 > @johnkitchin > http://kitchingroup.cheme.cmu.edu -- Ihor Radchenko, PhD, Center for Advancing Materials Performance from the Nanoscale (CAMP-nano) State Key Laboratory for Mechanical Behavior of Materials, Xi'an Jiaotong University, Xi'an, China Email: yanta...@gmail.com, ihor_radche...@alumni.sutd.edu.sg
Re: get the body of a heading up to the next subheading
Emacs was created to do such things--in fact the name E-macs is a terse form of Editor-Macros {originally a derivative of TECO} {There is a huge list of what Emacs should stand for--my fave is: Emacs Makes All Computing Simple} Now, what I'm suggesting is you make a macro, and store and reuse it--to get you started, I suggest something like this Cs* Cn C@ Cs** Cx ( replace-string Cqj Return \n Return Cx ) name-last-macro Give it a name & save it & re-use it and/or EXTEND it later On Mon, May 11, 2020 at 7:05 PM John Kitchin wrote: > Hi everyone, > > I am trying to get the body of a heading up to the next subheading. For > example with this org file, > > * quiz one > > This is the description. > Use emacs for this. > > ** question 1 > what is 40 + 2 > > If the point is in the first heading, I want to run a function that would > return the string "This is the description.\nUse emacs for this." > > I thought there was a simple way to do that, but so far it has eluded my > google fu. Any hints? > > John > > --- > Professor John Kitchin > Doherty Hall A207F > Department of Chemical Engineering > Carnegie Mellon University > Pittsburgh, PA 15213 > 412-268-7803 > @johnkitchin > http://kitchingroup.cheme.cmu.edu > >
get the body of a heading up to the next subheading
Hi everyone, I am trying to get the body of a heading up to the next subheading. For example with this org file, * quiz one This is the description. Use emacs for this. ** question 1 what is 40 + 2 If the point is in the first heading, I want to run a function that would return the string "This is the description.\nUse emacs for this." I thought there was a simple way to do that, but so far it has eluded my google fu. Any hints? John --- Professor John Kitchin Doherty Hall A207F Department of Chemical Engineering Carnegie Mellon University Pittsburgh, PA 15213 412-268-7803 @johnkitchin http://kitchingroup.cheme.cmu.edu