emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] making work by pasting code and examples


From: Kaushal Modi
Subject: Re: [O] making work by pasting code and examples
Date: Fri, 30 Jun 2017 18:28:34 +0000

On Fri, Jun 30, 2017 at 10:59 AM Michael Ax <address@hidden> 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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]