emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
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 --]

  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

  List information: https://www.orgmode.org/

* 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 public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).