[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master a95d7f1 081/173: Respect yas-key-syntaxes (#422)
From: |
Dmitry Gutov |
Subject: |
[elpa] master a95d7f1 081/173: Respect yas-key-syntaxes (#422) |
Date: |
Thu, 23 Jun 2016 00:28:39 +0000 (UTC) |
branch: master
commit a95d7f1d6a25c11496f0606eb868343505db921b
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>
Respect yas-key-syntaxes (#422)
---
NEWS.md | 2 ++
company-yasnippet.el | 63 +++++++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 59 insertions(+), 6 deletions(-)
diff --git a/NEWS.md b/NEWS.md
index 30f085e..fbbd3c3 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,8 @@
## Next
+* `company-yasnippet` respects `yas-key-syntaxes`. But we use them in the
+ reverse order, preferring the longest key prefix that matches anything.
* New user option `company-search-regexp-function`.
* Completion is not started automatically when a keyboard macro is being
recorded ([#374](https://github.com/company-mode/company-mode/issues/374)).
diff --git a/company-yasnippet.el b/company-yasnippet.el
index 495cea8..6659926 100644
--- a/company-yasnippet.el
+++ b/company-yasnippet.el
@@ -33,8 +33,45 @@
(declare-function yas-expand-snippet "yasnippet")
(declare-function yas--template-content "yasnippet")
(declare-function yas--template-expand-env "yasnippet")
+(declare-function yas--warning "yasnippet")
+
+(defun company-yasnippet--key-prefixes ()
+ ;; Mostly copied from `yas--templates-for-key-at-point'.
+ (defvar yas-key-syntaxes)
+ (save-excursion
+ (let ((original (point))
+ (methods yas-key-syntaxes)
+ prefixes
+ method)
+ (while methods
+ (unless (eq method (car methods))
+ (goto-char original))
+ (setq method (car methods))
+ (cond ((stringp method)
+ (skip-syntax-backward method)
+ (setq methods (cdr methods)))
+ ((functionp method)
+ (unless (eq (funcall method original)
+ 'again)
+ (setq methods (cdr methods))))
+ (t
+ (setq methods (cdr methods))
+ (yas--warning "Invalid element `%s' in `yas-key-syntaxes'"
method)))
+ (let ((prefix (buffer-substring-no-properties (point) original)))
+ (unless (equal prefix (car prefixes))
+ (push prefix prefixes))))
+ prefixes)))
(defun company-yasnippet--candidates (prefix)
+ ;; Process the prefixes in reverse: unlike Yasnippet, we look for prefix
+ ;; matches, so the longest prefix with any matches should be the most useful.
+ (cl-loop with tables = (yas--get-snippet-tables)
+ for key-prefix in (company-yasnippet--key-prefixes)
+ thereis (company-yasnippet--completions-for-prefix prefix
+ key-prefix
+ tables)))
+
+(defun company-yasnippet--completions-for-prefix (prefix key-prefix tables)
(cl-mapcan
(lambda (table)
(let ((keyhash (yas--table-hash table))
@@ -43,18 +80,31 @@
(maphash
(lambda (key value)
(when (and (stringp key)
- (string-prefix-p prefix key))
+ (string-prefix-p key-prefix key))
(maphash
(lambda (name template)
(push
- (propertize key
+ (propertize (company-yasnippet--adjust-key key prefix
key-prefix)
'yas-annotation name
- 'yas-template template)
+ 'yas-template template
+ 'yas-prefix-offset (- (length key-prefix)
+ (length prefix)))
res))
value)))
keyhash))
res))
- (yas--get-snippet-tables)))
+ tables))
+
+(defun company-yasnippet--adjust-key (key prefix key-prefix)
+ (let ((pl (length prefix))
+ (kpl (length key-prefix)))
+ (cond
+ ((= pl kpl)
+ key)
+ ((> pl kpl)
+ (concat (substring prefix 0 (- pl kpl)) key))
+ (t
+ (substring key (- kpl pl))))))
;;;###autoload
(defun company-yasnippet (command &optional arg &rest ignore)
@@ -94,9 +144,10 @@ shadow backends that come after it. Recommended usages:
(get-text-property 0 'yas-annotation arg)))
(candidates (company-yasnippet--candidates arg))
(post-completion
- (let ((template (get-text-property 0 'yas-template arg)))
+ (let ((template (get-text-property 0 'yas-template arg))
+ (prefix-offset (get-text-property 0 'yas-prefix-offset arg)))
(yas-expand-snippet (yas--template-content template)
- (- (point) (length arg))
+ (- (point) (length arg) prefix-offset)
(point)
(yas--template-expand-env template))))))
- [elpa] master 5d68a50 069/173: [Fix #317] Allow :sorted keyword in grouped backends, (continued)
- [elpa] master 5d68a50 069/173: [Fix #317] Allow :sorted keyword in grouped backends, Dmitry Gutov, 2016/06/22
- [elpa] master 87351aa 073/173: Double space, Dmitry Gutov, 2016/06/22
- [elpa] master 8952cfe 085/173: Handle key prefix being shorter than prefix (#422), Dmitry Gutov, 2016/06/22
- [elpa] master c2e5981 017/173: Remove company-ropemacs, Dmitry Gutov, 2016/06/22
- [elpa] master d97c98f 076/173: company-search-candidates: Mention company-search-regexp-function, Dmitry Gutov, 2016/06/22
- [elpa] master 2306c9c 054/173: Support whitespace-mode newline-mark, Dmitry Gutov, 2016/06/22
- [elpa] master 4a16a55 090/173: company-dabbrev--make-regexp: Regexp can match non-word characters, Dmitry Gutov, 2016/06/22
- [elpa] master 1c36f7c 091/173: company-dabbrev--search-buffer: Use use forward search (#433), Dmitry Gutov, 2016/06/22
- [elpa] master da9b108 104/173: Refine the workaround further, Dmitry Gutov, 2016/06/22
- [elpa] master 6bf2491 102/173: Rename company-clang-obc-templatify to company-template-objc-templatify, Dmitry Gutov, 2016/06/22
- [elpa] master a95d7f1 081/173: Respect yas-key-syntaxes (#422),
Dmitry Gutov <=
- [elpa] master 5d0a9bb 118/173: company-semantic: Retain function overloads, Dmitry Gutov, 2016/06/22
- [elpa] master ca447ec 129/173: [#464] Optimisation and fixes in `company-files`, Dmitry Gutov, 2016/06/22
- [elpa] master b526978 133/173: Fix typo in dependency name, Dmitry Gutov, 2016/06/22
- [elpa] master 39eb115 113/173: company--posn-col-row: Fall back to posn-col-row, Dmitry Gutov, 2016/06/22
- [elpa] master ae0a406 139/173: Add some C++11 keywords, fixes #478, Dmitry Gutov, 2016/06/22
- [elpa] master 9b89556 149/173: company-capf: Look up `face', not `font-lock-face', Dmitry Gutov, 2016/06/22
- [elpa] master d587bd0 156/173: Fix an old typo, Dmitry Gutov, 2016/06/22
- [elpa] master 2d9bf1e 160/173: company--preprocess-candidates: Check that all CANDIDATES are strings, Dmitry Gutov, 2016/06/22
- [elpa] master 395f846 159/173: Revert "Remove completions without annotations when considering duplicates", Dmitry Gutov, 2016/06/22
- [elpa] master 69228c7 168/173: Tag company-dabbrev-ignore-buffers with package-version, Dmitry Gutov, 2016/06/22