From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kaushal Modi Subject: Re: function for inserting a block Date: Sat, 2 Sep 2017 20:06:29 -0700 Message-ID: References: <877exghblx.fsf@ericabrahamsen.net> <87h8wked4b.fsf@alphapapa.net> Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="001a113e7f84defa3805584047f3" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:50070) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1doLF8-0006qG-J2 for emacs-orgmode@gnu.org; Sat, 02 Sep 2017 23:06:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1doLF3-00073U-8G for emacs-orgmode@gnu.org; Sat, 02 Sep 2017 23:06:38 -0400 Received: from mail-yw0-x229.google.com ([2607:f8b0:4002:c05::229]:34112) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1doLF3-00072b-1k for emacs-orgmode@gnu.org; Sat, 02 Sep 2017 23:06:33 -0400 Received: by mail-yw0-x229.google.com with SMTP id t188so14160692ywb.1 for ; Sat, 02 Sep 2017 20:06:31 -0700 (PDT) In-Reply-To: <87h8wked4b.fsf@alphapapa.net> 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: Adam Porter , emacs-org list --001a113e7f84defa3805584047f3 Content-Type: text/plain; charset="UTF-8" On Sat, Sep 2, 2017, 10:23 PM Adam Porter wrote: > Hi Eric, > > Thanks for doing this. I've had some similar code in my config for a > while. I'll share some of it here in case you find it useful in doing > this. You especially might find the org-read-structure-template > function useful. > And here's my version, which also uses hydra. But the function modi/org-template-expand to insert the BEGIN_../END_.. blocks can be reused. This at least tells that there's a good need to have the easy template do the right thing when it is called with a region selected. @Adam: Looks like your code is doing a lot more than just that. I'll put that to my list to understand once I get to a computer. > (defun modi/org-template-expand (str &optional lang) "Expand Org template." (let (beg old-beg end content) ;; Save restriction to automatically undo the upcoming `narrow-to-region' (save-restriction (when (use-region-p) (setq beg (region-beginning)) (setq end (region-end)) ;; Note that regardless of the direction of selection, we will always ;; have (region-beginning) < (region-end). (save-excursion ;; If `point' is at `end', exchange point and mark so that now the ;; `point' is now at `beg' (when (> (point) (mark)) (exchange-point-and-mark)) ;; Insert a newline if `beg' is *not* at beginning of the line. ;; Example: You have ^abc$ where ^ is bol and $ is eol. ;; "bc" is selected and
On Sat, Sep 2= , 2017, 10:23 PM Adam Porter <adam@alphapapa.net> wrote:
Hi Eric,

Thanks for doing this.=C2=A0 I've had some similar code in my config fo= r a
while.=C2=A0 I'll share some of it here in case you find it useful in d= oing
this.=C2=A0 You especially might find the org-read-structure-template
function useful.

And here's my version, which also uses hydra. But the functio= n modi/org-template-expand to insert the BEGIN_../END_.. blocks can be reus= ed.=C2=A0

This at least = tells that there's a good need to have the easy template do the right t= hing when it is called with a region selected.=C2=A0

@Adam: Looks like your code is doing a lot mor= e than just that. I'll put that to my list to understand once I get to = a computer.=C2=A0

(defun modi/org-te= mplate-expand (str &optional lang) "Expand Org template." (let (beg old-beg end content) ;; Save restriction to automatically undo the upcoming `narrow-to-r= egion' (save-restriction (when (use-region-p) (setq beg (region-beginning)) (setq end (region-end)) ;; Note that regardless of the direction of selection, we will = always ;; have (region-beginning) < (region-end). (save-excursion ;; If `point' is at `end', exchange point and mark so= that now the ;; `point' is now at `beg' (when (> (point) (mark)) (exchange-point-and-mark)) ;; Insert a newline if `beg' is *not* at beginning of the= line. ;; Example: You have ^abc$ where ^ is bol and $ is eol. ;; "bc" is selected and <e is pressed t= o result in: ;; a ;; #+BEGIN_EXAMPLE ;; bc ;; #+END_EXAMPLE (when (/=3D beg (line-beginning-position)) (electric-indent-just-newline 1) (setq old-beg beg) (setq beg (point)) ;; Adjust the `end' due to newline (setq end (+ end (- beg old-beg))))) (save-excursion ;; If `point' is at `beg', exchange point and mark so= that now the ;; `point' is now at `end' (when (< (point) (mark)) (exchange-point-and-mark)) ;; If the `end' position is at the beginning of a line de= crement ;; the position by 1, so that the resultant position is eol o= n ;; the previous line. (when (=3D end (line-beginning-position)) (setq end (1- end))) ;; Insert a newline if `point'/`end' is *not* at end = of the line. ;; Example: You have ^abc$ where ^ is bol and $ is eol. ;; "a" is selected and <e is pressed to= result in: ;; #+BEGIN_EXAMPLE ;; a ;; #+END_EXAMPLE ;; bc (when (not (looking-at "[[:blank:]]*$")) (electric-indent-just-newline 1))) ;; Narrow to region so that the text surround the region does ;; not mess up the upcoming `org-try-structure-completion' = eval (narrow-to-region beg end) (setq content (delete-and-extract-region beg end))) (insert str) (org-try-structure-completion) (when (string=3D "<s" str) (cond (lang (insert lang) (forward-line)) ((and content (not lang)) (insert "???") (forward-line)) (t ))) ;; At this point the cursor will be between the #+BEGIN and #+END= lines (when content (insert content) (deactivate-mark))))) (defhydra hydra-org-template (:color blue :hint nil) " org-template: _c_enter _s_rc _e_xample _v_erilog= _t_ext _I_NCLUDE: _l_atex _h_tml _V_erse _m_atlab = _L_aTeX: _H_TML: _a_scii _q_uote _E_macs-lisp _n_im = _i_ndex: _A_SCII: ^^ ^^ _S_hell _p_ython = ^^ ^^ " ("s" (modi/org-template-expand "<s")) ;#+BEGIN= _SRC ... #+END_SRC ("E" (modi/org-template-expand "<s" "emac= s-lisp")) ("v" (modi/org-template-expand "<s" "syst= emverilog")) ("m" (modi/org-template-expand "<s" "matl= ab")) ("n" (modi/org-template-expand "<s" "nim&= quot;)) ("S" (modi/org-template-expand "<s" "shel= l")) ("p" (modi/org-template-expand "<s" "pyth= on")) ("t" (modi/org-template-expand "<s" "text= ")) ("e" (modi/org-template-expand "<e")) ;#+BEGIN= _EXAMPLE ... #+END_EXAMPLE ("x" (modi/org-template-expand "<e")) ;#+BEGIN= _EXAMPLE ... #+END_EXAMPLE ("q" (modi/org-template-expand "<q")) ;#+BEGIN= _QUOTE ... #+END_QUOTE ("V" (modi/org-template-expand "<v")) ;#+BEGIN= _VERSE ... #+END_VERSE ("c" (modi/org-template-expand "<c")) ;#+BEGIN= _CENTER ... #+END_CENTER ("l" (modi/org-template-expand "<l")) ;#+BEGIN= _EXPORT latex ... #+END_EXPORT ("L" (modi/org-template-expand "<L")) ;#+LaTeX= : ("h" (modi/org-template-expand "<h")) ;#+BEGIN= _EXPORT html ... #+END_EXPORT ("H" (modi/org-template-expand "<H")) ;#+HTML: ("a" (modi/org-template-expand "<a")) ;#+BEGIN= _EXPORT ascii ... #+END_EXPORT ("A" (modi/org-template-expand "<A")) ;#+ASCII= : ("i" (modi/org-template-expand "<i")) ;#+INDEX= : line ("I" (modi/org-template-expand "<I")) ;#+INCLU= DE: line ("<" self-insert-command "<") ("o" nil "quit")) (defun modi/org-template-maybe () "Insert org-template if point is at the beginning of the line, o= r is a region is selected. Else call `self-insert-command'." (interactive) (let ((regionp (use-region-p))) (if (or regionp (and (not regionp) (looking-back "^"))) (hydra-org-template/body) (self-insert-command 1))))

--001a113e7f84defa3805584047f3--