From: Kaushal Modi <kaushal.modi@gmail.com>
To: Michael Ax <michaelax@gmail.com>, Org-mode <emacs-orgmode@gnu.org>
Subject: Re: making work by pasting code and examples
Date: Fri, 30 Jun 2017 18:28:34 +0000 [thread overview]
Message-ID: <CAFyQvY1JJRBr6yW48nQG3ja1bSoLuVWyQapBEbeSXRqmR0V_yQ@mail.gmail.com> (raw)
In-Reply-To: <17c0306f-db9f-774d-b88f-cb3201d54008@gMail.com>
[-- Attachment #1: Type: text/plain, Size: 6181 bytes --]
On Fri, Jun 30, 2017 at 10:59 AM Michael Ax <michaelax@gmail.com> wrote:
> when i paste blog content mixing text & code i usually want to wrap bits
> of the paste in an org-structure-template.
>
> i do it by
> - mark a region
> - cut the region
> - type <x tab to get the template
> - paste the region
>
> i would like to not cut and paste.
>
> any tips on advising or an advise for the org-structure-template expander?
> i would like it to check the lossage and be smart about wrapping itself
> around the stuff i mean.
>
I have been using this[1] for the last year and a half and it works pretty
awesome. You would need to install the hydra package. The examples in the
comments pretty much describes your use case.
How to use the below:
1. Install the hydra package.
2. Evaluate the below code.
3. In an org buffer, select some text.
4. Press "<x" (no tab needed).. and the selected text will be wrapped in
"#+BEGIN_EXAMPLE" and "#+END_EXAMPLE".
=====
(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 <e is pressed to result in:
;; a
;; #+BEGIN_EXAMPLE
;; bc
;; #+END_EXAMPLE
(when (/= 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 decrement
;; the position by 1, so that the resultant position is eol on
;; the previous line.
(when (= 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 "\\s-*$"))
(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= "<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 _S_hell
_i_ndex: _A_SCII:
^^ ^^ ^^ _p_ython
^^ ^^
"
("s" (modi/org-template-expand "<s")) ; #+BEGIN_SRC ... #+END_SRC
("E" (modi/org-template-expand "<s" "emacs-lisp"))
("v" (modi/org-template-expand "<s" "systemverilog"))
("m" (modi/org-template-expand "<s" "matlab"))
("S" (modi/org-template-expand "<s" "shell"))
("p" (modi/org-template-expand "<s" "python"))
("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")) ; #+INCLUDE: line
("<" self-insert-command "<")
("o" nil "quit"))
(defun modi/org-template-maybe ()
"Insert org-template if point is at the beginning of the line, or 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))))
(define-key org-mode-map (kbd "<") #'modi/org-template-maybe)
=====
[1]:
https://github.com/kaushalmodi/.emacs.d/blob/4495b6126ddeb20959d438dbe2ad9de50e5ed336/setup-files/setup-org.el#L684-L1229
--
Kaushal Modi
[-- Attachment #2: Type: text/html, Size: 9465 bytes --]
next prev parent reply other threads:[~2017-06-30 18:28 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-30 14:57 making work by pasting code and examples Michael Ax
2017-06-30 18:28 ` Kaushal Modi [this message]
2017-06-30 18:33 ` Kaushal Modi
2017-06-30 20:09 ` Michael Ax
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAFyQvY1JJRBr6yW48nQG3ja1bSoLuVWyQapBEbeSXRqmR0V_yQ@mail.gmail.com \
--to=kaushal.modi@gmail.com \
--cc=emacs-orgmode@gnu.org \
--cc=michaelax@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.