|
@@ -199,23 +199,29 @@ positions, and the definition, when inlined."
|
|
|
;; get fooled by unrelated closing square brackets.
|
|
|
(end (ignore-errors (scan-sexps beg 1))))
|
|
|
;; Point is really at a reference if it's located before true
|
|
|
- ;; ending of the footnote and isn't within a link or a LaTeX
|
|
|
- ;; macro. About that case, some special attention should be
|
|
|
- ;; paid. Indeed, when two footnotes are side by side, once the
|
|
|
- ;; first one is changed into LaTeX, the second one might then be
|
|
|
- ;; considered as an optional argument of the command. To
|
|
|
- ;; prevent that, we have a look at the `org-protected' property
|
|
|
- ;; of that LaTeX command.
|
|
|
- (when (and end (< (point) end)
|
|
|
- (not (save-excursion
|
|
|
- (goto-char beg)
|
|
|
- (let ((linkp
|
|
|
- (save-match-data
|
|
|
- (org-in-regexp org-bracket-link-regexp))))
|
|
|
- (and linkp (< (point) (cdr linkp))))))
|
|
|
- (or (not (org-inside-latex-macro-p))
|
|
|
- (and (get-text-property (1- beg) 'org-protected)
|
|
|
- (not (get-text-property beg 'org-protected)))))
|
|
|
+ ;; ending of the footnote.
|
|
|
+ (when (save-match-data
|
|
|
+ (and end (< (point) end)
|
|
|
+ ;; Verify match isn't a part of a link.
|
|
|
+ (not (save-excursion
|
|
|
+ (goto-char beg)
|
|
|
+ (let ((linkp (org-in-regexp org-bracket-link-regexp)))
|
|
|
+ (and linkp (< (point) (cdr linkp))))))
|
|
|
+ ;; When in message-mode, verify match doesn't belong
|
|
|
+ ;; to cited text.
|
|
|
+ (not (and (derived-mode-p 'message-mode)
|
|
|
+ (save-excursion
|
|
|
+ (beginning-of-line)
|
|
|
+ (looking-at message-cite-prefix-regexp))))
|
|
|
+ ;; Verify point doesn't belong to a LaTeX macro.
|
|
|
+ ;; Beware though, when two footnotes are side by
|
|
|
+ ;; side, once the first one is changed into LaTeX,
|
|
|
+ ;; the second one might then be considered as an
|
|
|
+ ;; optional argument of the command. Thus, check
|
|
|
+ ;; the `org-protected' property of that command.
|
|
|
+ (or (not (org-inside-latex-macro-p))
|
|
|
+ (and (get-text-property (1- beg) 'org-protected)
|
|
|
+ (not (get-text-property beg 'org-protected))))))
|
|
|
(list label beg end
|
|
|
;; Definition: ensure this is an inline footnote first.
|
|
|
(and (or (not label) (match-string 1))
|
|
@@ -230,32 +236,33 @@ footnote text is included and defined locally.
|
|
|
|
|
|
The return value will be nil if not at a footnote definition, and a list with
|
|
|
label, start, end and definition of the footnote otherwise."
|
|
|
- (save-excursion
|
|
|
- (end-of-line)
|
|
|
- (let ((lim (save-excursion (re-search-backward
|
|
|
- (concat org-outline-regexp-bol
|
|
|
- "\\|^[ \t]*$") nil t))))
|
|
|
- (when (re-search-backward org-footnote-definition-re lim t)
|
|
|
- (end-of-line)
|
|
|
- (list (match-string 2)
|
|
|
- (match-beginning 0)
|
|
|
- (save-match-data
|
|
|
- ;; In a message, limit search to signature.
|
|
|
- (let ((bound (and (derived-mode-p 'message-mode)
|
|
|
- (save-excursion
|
|
|
- (goto-char (point-max))
|
|
|
- (re-search-backward
|
|
|
- message-signature-separator nil t)))))
|
|
|
- (or (and (re-search-forward
|
|
|
- (org-re
|
|
|
- (concat "^[ \t]*$" "\\|"
|
|
|
- org-outline-regexp-bol
|
|
|
- "\\|"
|
|
|
- "^\\[\\([0-9]+\\|fn:[-_[:word:]]+\\)\\]"))
|
|
|
- bound 'move)
|
|
|
- (progn (skip-chars-forward " \t\n") (point-at-bol)))
|
|
|
- (point))))
|
|
|
- (org-trim (buffer-substring (match-end 0) (point))))))))
|
|
|
+ (when (org-footnote-in-valid-context-p)
|
|
|
+ (save-excursion
|
|
|
+ (end-of-line)
|
|
|
+ (let ((lim (save-excursion (re-search-backward
|
|
|
+ (concat org-outline-regexp-bol
|
|
|
+ "\\|^[ \t]*$") nil t))))
|
|
|
+ (when (re-search-backward org-footnote-definition-re lim t)
|
|
|
+ (end-of-line)
|
|
|
+ (list (match-string 2)
|
|
|
+ (match-beginning 0)
|
|
|
+ (save-match-data
|
|
|
+ ;; In a message, limit search to signature.
|
|
|
+ (let ((bound (and (derived-mode-p 'message-mode)
|
|
|
+ (save-excursion
|
|
|
+ (goto-char (point-max))
|
|
|
+ (re-search-backward
|
|
|
+ message-signature-separator nil t)))))
|
|
|
+ (or (and (re-search-forward
|
|
|
+ (org-re
|
|
|
+ (concat "^[ \t]*$" "\\|"
|
|
|
+ org-outline-regexp-bol
|
|
|
+ "\\|"
|
|
|
+ "^\\[\\([0-9]+\\|fn:[-_[:word:]]+\\)\\]"))
|
|
|
+ bound 'move)
|
|
|
+ (progn (skip-chars-forward " \t\n") (point-at-bol)))
|
|
|
+ (point))))
|
|
|
+ (org-trim (buffer-substring (match-end 0) (point)))))))))
|
|
|
|
|
|
(defun org-footnote-get-next-reference (&optional label backward limit)
|
|
|
"Return complete reference of the next footnote.
|
|
@@ -414,7 +421,7 @@ This command prompts for a label. If this is a label referencing an
|
|
|
existing label, only insert the label. If the footnote label is empty
|
|
|
or new, let the user edit the definition of the footnote."
|
|
|
(interactive)
|
|
|
- (unless (org-footnote-in-valid-context-p)
|
|
|
+ (unless (and (not (bolp)) (org-footnote-in-valid-context-p))
|
|
|
(error "Cannot insert a footnote here"))
|
|
|
(let* ((labels (and (not (equal org-footnote-auto-label 'random))
|
|
|
(org-footnote-all-labels)))
|