Function: org-clock-find-position

org-clock-find-position is a byte-compiled function defined in org-clock.el.gz.

Signature

(org-clock-find-position FIND-UNCLOSED)

Documentation

Find the location where the next clock line should be inserted.

When FIND-UNCLOSED is non-nil, first check if there is an unclosed clock line and position cursor in that line.

Source Code

;; Defined in /usr/src/emacs/lisp/org/org-clock.el.gz
(defun org-clock-find-position (find-unclosed)
  "Find the location where the next clock line should be inserted.
When FIND-UNCLOSED is non-nil, first check if there is an unclosed clock
line and position cursor in that line."
  (org-back-to-heading t)
  (catch 'exit
    (let* ((beg (line-beginning-position))
	   (end (save-excursion (outline-next-heading) (point)))
	   (org-clock-into-drawer (org-clock-into-drawer))
	   (drawer (org-clock-drawer-name)))
      ;; Look for a running clock if FIND-UNCLOSED in non-nil.
      (when find-unclosed
	(let ((open-clock-re
	       (concat "^[ \t]*"
		       org-clock-string
		       " \\[\\([0-9]\\{4\\}-[0-9]\\{2\\}-[0-9]\\{2\\}"
		       " *\\sw+ +[012][0-9]:[0-5][0-9]\\)\\][ \t]*$")))
	  (while (re-search-forward open-clock-re end t)
	    (let ((element (org-element-at-point)))
	      (when (and (org-element-type-p element 'clock)
			 (eq (org-element-property :status element) 'running))
		(forward-line 0)
		(throw 'exit t))))))
      ;; Look for an existing clock drawer.
      (when drawer
	(goto-char beg)
	(let ((drawer-re (concat "^[ \t]*:" (regexp-quote drawer) ":[ \t]*$")))
	  (while (re-search-forward drawer-re end t)
	    (let ((element (org-element-at-point)))
	      (when (org-element-type-p element 'drawer)
		(let ((cend (org-element-contents-end element)))
		  (if (and (not org-log-states-order-reversed) cend)
		      (goto-char cend)
		    (forward-line))
		  (throw 'exit t)))))))
      (goto-char beg)
      (let ((clock-re (concat "^[ \t]*" org-clock-string))
	    (count 0)
	    positions)
	;; Count the CLOCK lines and store their positions.
	(save-excursion
	  (while (re-search-forward clock-re end t)
	    (let ((element (org-element-at-point)))
	      (when (org-element-type-p element 'clock)
		(setq positions (cons (line-beginning-position) positions)
		      count (1+ count))))))
	(cond
	 ((null positions)
          (org-fold-core-ignore-modifications
	    ;; Skip planning line and property drawer, if any.
	    (org-end-of-meta-data)
	    (unless (bolp) (insert-before-markers-and-inherit "\n"))
	    ;; Create a new drawer if necessary.
	    (when (and org-clock-into-drawer
		       (or (not (wholenump org-clock-into-drawer))
			   (< org-clock-into-drawer 2)))
	      (let ((beg (point)))
                ;; Make sure that point moves after drawer upon
                ;; inserting it.  Then, users can continue typing even
                ;; if point was right where the clock is inserted.
                (insert-before-markers-and-inherit ":" drawer ":\n:END:\n")
                (org-indent-region beg (point))
                (org-fold-region (line-end-position -1) (1- (point)) t 'drawer)
                (forward-line -1)))))
	 ;; When a clock drawer needs to be created because of the
	 ;; number of clock items or simply if it is missing, collect
	 ;; all clocks in the section and wrap them within the drawer.
	 ((if (wholenump org-clock-into-drawer)
	      (>= (1+ count) org-clock-into-drawer)
	    drawer)
	  ;; Skip planning line and property drawer, if any.
	  (org-end-of-meta-data)
          (org-fold-core-ignore-modifications
	    (let ((beg (point)))
	      (insert-and-inherit
	       (mapconcat
                (lambda (p)
		  (save-excursion
		    (goto-char p)
		    (org-trim (delete-and-extract-region
			       (save-excursion (skip-chars-backward " \r\t\n")
					       (line-beginning-position 2))
			       (line-beginning-position 2)))))
                positions "\n")
	       "\n:END:\n")
	      (let ((end (point-marker)))
                (goto-char beg)
                (save-excursion (insert-before-markers-and-inherit ":" drawer ":\n"))
                (org-fold-region (line-end-position) (1- end) t 'outline)
                (org-indent-region (point) end)
                (forward-line)
                (unless org-log-states-order-reversed
		  (goto-char end)
		  (forward-line -2))
                (set-marker end nil)))))
	 (org-log-states-order-reversed (goto-char (car (last positions))))
	 (t (goto-char (car positions))))))))