Function: org-insert-drawer
org-insert-drawer is an interactive and byte-compiled function defined
in org.el.gz.
Signature
(org-insert-drawer &optional ARG DRAWER)
Documentation
Insert a drawer at point.
When optional argument ARG is non-nil, insert a property drawer.
Optional argument DRAWER, when non-nil, is a string representing drawer's name. Otherwise, the user is prompted for a name.
If a region is active, insert the drawer around that region instead.
Point is left between drawer's boundaries.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/org/org.el.gz
(defun org-insert-drawer (&optional arg drawer)
"Insert a drawer at point.
When optional argument ARG is non-nil, insert a property drawer.
Optional argument DRAWER, when non-nil, is a string representing
drawer's name. Otherwise, the user is prompted for a name.
If a region is active, insert the drawer around that region
instead.
Point is left between drawer's boundaries."
(interactive "P")
(let* ((drawer (if arg "PROPERTIES"
(or drawer (read-from-minibuffer "Drawer: ")))))
(cond
;; With C-u, fall back on `org-insert-property-drawer'
(arg
(org-insert-property-drawer)
(org-back-to-heading-or-point-min t)
;; Move inside.
(re-search-forward org-property-end-re)
(forward-line 0)
(unless (org-element-contents-begin (org-element-at-point))
;; Empty drawer.
(insert "\n")
(forward-char -1))
(org-reveal))
;; Check validity of suggested drawer's name.
((not (string-match-p org-drawer-regexp (format ":%s:" drawer)))
(user-error "Invalid drawer name"))
;; With an active region, insert a drawer at point.
((not (org-region-active-p))
(progn
(unless (bolp) (insert "\n"))
(insert (format ":%s:\n\n:END:\n" drawer))
(forward-line -2)))
;; Otherwise, insert the drawer at point
(t
(let ((rbeg (region-beginning))
(rend (copy-marker (region-end))))
(unwind-protect
(progn
(goto-char rbeg)
(forward-line 0)
(when (save-excursion
(re-search-forward org-outline-regexp-bol rend t))
(user-error "Drawers cannot contain headlines"))
;; Position point at the beginning of the first
;; non-blank line in region. Insert drawer's opening
;; there, then indent it.
(org-skip-whitespace)
(forward-line 0)
(insert ":" drawer ":\n")
(forward-line -1)
(indent-for-tab-command)
;; Move point to the beginning of the first blank line
;; after the last non-blank line in region. Insert
;; drawer's closing, then indent it.
(goto-char rend)
(skip-chars-backward " \r\t\n")
(insert "\n:END:")
(deactivate-mark t)
(indent-for-tab-command)
(unless (eolp) (insert "\n"))
;; Leave point inside drawer boundaries.
(search-backward ":END:")
(forward-char -1))
;; Clear marker, whatever the outcome of insertion is.
(set-marker rend nil)))))))