org-footnote: Make `org-footnote-create-definition' non-interactive

* lisp/org-footnote.el (org-footnote-create-definition): Remove
  `interactive' status.  Allow to insert definitions outside of
  narrowed part of buffer.  Preserve position.  Return beginning
  position of created definition.
(org-footnote-new):
(org-footnote-action): Apply changes above.
This commit is contained in:
Nicolas Goaziou 2015-05-06 23:23:54 +02:00
parent 360c4633e2
commit c76006a42c
1 changed files with 56 additions and 58 deletions

View File

@ -536,51 +536,62 @@ or new, let the user edit the definition of the footnote."
(mapcar #'list all) nil nil
(and (eq org-footnote-auto-label 'confirm) propose))))))))
(cond ((not label)
(insert "[fn:: ]")
(insert "[fn::]")
(backward-char 1))
((member label all)
(insert "[" label "]")
(message "New reference to existing note"))
(org-footnote-define-inline
(insert "[" label ": ]")
(insert "[" label ":]")
(backward-char 1)
(org-footnote-auto-adjust-maybe))
(t
(insert "[" label "]")
(org-footnote-create-definition label)
(org-footnote-auto-adjust-maybe)))))
(let ((l (copy-marker (org-footnote-create-definition label))))
(org-footnote-auto-adjust-maybe)
(or (ignore-errors (org-footnote-goto-definition label l))
;; Since definition was created outside current
;; scope, edit it remotely.
(progn (set-marker l nil)
(org-edit-footnote-reference))))))))
(defvar org-blank-before-new-entry) ; silence byte-compiler
(defvar org-blank-before-new-entry) ; Silence byte-compiler.
(defun org-footnote-create-definition (label)
"Start the definition of a footnote with label LABEL."
(interactive "sLabel: ")
"Start the definition of a footnote with label LABEL.
Return buffer position at the beginning of the definition. In an
Org buffer, this function doesn't move point."
(let ((label (org-footnote-normalize-label label))
electric-indent-mode) ;; Prevent wrong indentation
electric-indent-mode) ; Prevent wrong indentation.
(cond
;; In an Org file.
;; In an Org document.
((derived-mode-p 'org-mode)
;; If `org-footnote-section' is defined, find it, or create it
;; at the end of the buffer.
(when org-footnote-section
(goto-char (point-min))
(let ((re (concat "^\\*+[ \t]+" org-footnote-section "[ \t]*$")))
(unless (or (re-search-forward re nil t)
(and (progn (widen) t)
(re-search-forward re nil t)))
(goto-char (point-max))
(skip-chars-backward " \t\r\n")
(unless (bolp) (newline))
;; Insert new section. Separate it from the previous one
;; with a blank line, unless `org-blank-before-new-entry'
;; explicitly says no.
(when (and (cdr (assq 'heading org-blank-before-new-entry))
(zerop (save-excursion (org-back-over-empty-lines))))
(insert "\n"))
(insert "* " org-footnote-section "\n"))))
;; Move to the end of this entry (which may be
;; `org-footnote-section' or the current one).
(org-footnote-goto-local-insertion-point)
(org-show-context 'link-search))
(org-with-wide-buffer
(cond
((not org-footnote-section)
(org-footnote--goto-local-insertion-point))
((save-excursion
(goto-char (point-min))
(re-search-forward
(concat "^\\*+[ \t]+" (regexp-quote org-footnote-section) "[ \t]*$")
nil t))
(goto-char (match-end 0))
(forward-line)
(unless (bolp) (insert "\n")))
(t
(goto-char (point-max))
(unless (bolp) (insert "\n"))
;; Insert new section. Separate it from the previous one
;; with a blank line, unless `org-blank-before-new-entry'
;; explicitly says no.
(when (and (cdr (assq 'heading org-blank-before-new-entry))
(zerop (save-excursion (org-back-over-empty-lines))))
(insert "\n"))
(insert "* " org-footnote-section "\n")))
(when (zerop (org-back-over-empty-lines)) (insert "\n"))
(insert "[" label "] \n")
(line-beginning-position 0)))
(t
;; In a non-Org file. Search for footnote tag, or create it if
;; specified (at the end of buffer, or before signature if in
@ -615,16 +626,11 @@ or new, let the user edit the definition of the footnote."
(skip-chars-backward " \t\r\n")
(delete-region (point) max)
(unless (bolp) (newline))
(set-marker max nil))))
;; Insert footnote label.
(when (zerop (org-back-over-empty-lines)) (newline))
(insert "[" label "] \n")
(backward-char)
;; Only notify user about next possible action when in an Org
;; buffer, as the bindings may have different meanings otherwise.
(when (derived-mode-p 'org-mode)
(message
"Edit definition and go back with `C-c &' or, if unique, with `C-c C-c'."))))
(set-marker max nil))
(when (zerop (org-back-over-empty-lines)) (insert "\n"))
(insert "[" label "] \n")
(backward-char)
(line-beginning-position)))))
;;;###autoload
(defun org-footnote-action (&optional special)
@ -651,30 +657,22 @@ offer additional commands in a menu."
;; definition.
((not label)
(goto-char (org-element-property :contents-begin context)))
;; A definition exists: move to it, if possible, or offer to
;; widen buffer to reach it.
((let ((definition (org-footnote-get-definition label)))
(when definition
(let ((begin (nth 1 definition)))
(catch 'do-nothing
(cond ((and (>= begin (point-min)) (<= begin (point-max))))
((yes-or-no-p "Definition outside scope. Widen? ")
(widen))
(t (throw 'do-nothing nil)))
(goto-char begin)
(search-forward label)
(forward-char)
t)))))
;; Check if a definition exists: then move to it.
((let ((p (nth 1 (org-footnote-get-definition label))))
(when p (org-footnote-goto-definition label p))))
;; No definition exists: offer to create it.
((yes-or-no-p (format "No definition for %s. Create one? " label))
(org-footnote-create-definition label)))))
(let ((p (org-footnote-create-definition label)))
(or (ignore-errors (org-footnote-goto-definition label p))
;; Since definition was created outside current scope,
;; edit it remotely.
(org-edit-footnote-reference)))))))
((eq type 'footnote-definition)
(org-footnote-goto-previous-reference
(org-element-property :label context)))
((or special
(zerop (current-column))
(not (org-footnote-in-valid-context-p)))
(message "Footnotes: [s]ort | [r]enumber fn:N | [S]=r+s |->[n]umeric | [d]elete")
((or special (not (org-footnote--allow-reference-p)))
(message "Footnotes: [s]ort | [r]enumber fn:N | [S]=r+s | \
->[n]umeric | [d]elete")
(let ((c (read-char-exclusive)))
(cond
((eq c ?s) (org-footnote-normalize 'sort))