summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2018-11-25 02:03:14 +0100
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2018-11-25 02:03:14 +0100
commit86a6087f928292e973526ab72edbf32cd5e3fdac (patch)
tree17b4cd4407a81675fab9a9b7e405136903b55107
parent78901a6602e7b00a8f59398985a89df56ed1ea01 (diff)
parent8b7ba29b601d1cc1b3f8d3e4aa96bdc3cd7605f6 (diff)
downloadorg-mode-86a6087f928292e973526ab72edbf32cd5e3fdac.tar.gz
Merge branch 'master' into next
-rw-r--r--lisp/org-pcomplete.el12
-rw-r--r--testing/lisp/test-org-pcomplete.el33
2 files changed, 40 insertions, 5 deletions
diff --git a/lisp/org-pcomplete.el b/lisp/org-pcomplete.el
index d245f69..062f38a 100644
--- a/lisp/org-pcomplete.el
+++ b/lisp/org-pcomplete.el
@@ -104,10 +104,11 @@ The return value is a string naming the thing at point."
(char-before)))
(cons "tex" nil))
;; Tags on a headline.
- ((and (org-at-heading-p)
- (eq ?: (save-excursion
- (skip-chars-backward "[:alnum:]_@#%")
- (char-before))))
+ ((and (org-match-line
+ (format "\\*+ \\(?:.+? \\)?\\(:\\)\\(\\(?::\\|%s\\)+\\)?[ \t]*$"
+ org-tag-re))
+ (or (org-point-in-group (point) 2)
+ (= (point) (match-end 1))))
(cons "tag" nil))
;; TODO keywords on an empty headline.
((and (string-match "^\\*+ +\\S-*$" line-to-here)
@@ -372,7 +373,8 @@ This needs more work, to handle headings with lots of spaces in them."
(setq lst (delete tag lst)))
lst))
(and (string-match ".*:" pcomplete-stub)
- (substring pcomplete-stub (match-end 0))))))
+ (substring pcomplete-stub (match-end 0)))
+ t)))
(defun pcomplete/org-mode/drawer ()
"Complete a drawer name, including \"PROPERTIES\"."
diff --git a/testing/lisp/test-org-pcomplete.el b/testing/lisp/test-org-pcomplete.el
index c9fa4c9..581eab5 100644
--- a/testing/lisp/test-org-pcomplete.el
+++ b/testing/lisp/test-org-pcomplete.el
@@ -125,6 +125,39 @@
(pcomplete)
(buffer-string)))))
+(ert-deftest test-org-pcomplete/tag ()
+ "Test tag completion."
+ ;; Complete at end of line, according to `org-current-tag-alist'.
+ (should
+ (equal "* H :foo:"
+ (org-test-with-temp-text "* H :<point>"
+ (let ((org-current-tag-alist '(("foo")))) (pcomplete))
+ (buffer-string))))
+ (should
+ (equal "* H :foo:bar:"
+ (org-test-with-temp-text "* H :foo:b<point>"
+ (let ((org-current-tag-alist '(("bar")))) (pcomplete))
+ (buffer-string))))
+ ;; If `org-current-tag-alist' is non-nil, complete against tags in
+ ;; buffer.
+ (should
+ (equal "* H1 :bar:\n* H2 :bar:"
+ (org-test-with-temp-text "* H1 :bar:\n* H2 :<point>"
+ (let ((org-current-tag-alist nil)) (pcomplete))
+ (buffer-string))))
+ ;; Do not complete in the middle of a line.
+ (should
+ (equal "* H :notag: :real:tags:"
+ (org-test-with-temp-text "* H :notag:<point> :real:tags:"
+ (let ((org-current-tag-alist '(("foo")))) (pcomplete))
+ (buffer-string))))
+ ;; Complete even when there's a match on the line.
+ (should
+ (equal "* foo: :foo:"
+ (org-test-with-temp-text "* foo: :<point>"
+ (let ((org-current-tag-alist '(("foo")))) (pcomplete))
+ (buffer-string)))))
+
(ert-deftest test-org-pcomplete/todo ()
"Test TODO completion."
(should