From: Noam Postavsky Date: Mon, 3 Aug 2015 14:36:46 +0000 (-0400) Subject: Add new function yas-lookup-snippet X-Git-Url: https://code.delx.au/gnu-emacs-elpa/commitdiff_plain/7bce1a647380cb5152fc17a21948ca94f1789fd6 Add new function yas-lookup-snippet * yasnippet.el (yas-lookup-snippet): New function. (yas--get-snippet-tables, yas--modes-to-activate): Add optional mode parameter. * yasnippet-tests.el (snippet-lookup): New test for yas-lookup-snippet. * doc/snippet-expansion.org (Expanding from emacs-lisp code): Mention yas-lookup-snippet. --- diff --git a/doc/snippet-expansion.org b/doc/snippet-expansion.org index a0fbe0958..fdc02ccae 100644 --- a/doc/snippet-expansion.org +++ b/doc/snippet-expansion.org @@ -104,18 +104,21 @@ prefer. Sometimes you might want to expand a snippet directly from your own elisp code. You should call [[sym:yas-expand-snippet][=yas-expand-snippet=]] instead of -[[sym:yas-expand][=yas-expand=]] in this case. +[[sym:yas-expand][=yas-expand=]] in this case. [[sym:yas-expand-snippet][=yas-expand-snippet=]] takes a string in +snippet template syntax, if you want to expand an existing snippet you +can use [[sym:yas-lookup-snippet][=yas-lookup-snippet=]] to find its contents by name. As with expanding from the menubar, the condition system and multiple -candidates doesn't affect expansion. In fact, expanding from the -YASnippet menu has the same effect of evaluating the follow code: +candidates doesn't affect expansion (the condition system does affect +[[sym:yas-lookup-snippet][=yas-lookup-snippet=]] though). In fact, expanding from the YASnippet +menu has the same effect of evaluating the follow code: #+BEGIN_SRC emacs-lisp (yas-expand-snippet template) #+END_SRC -See the internal documentation on [[sym:yas-expand-snippet][=yas-expand-snippet=]] for more -information. +See the internal documentation on [[sym:yas-expand-snippet][=yas-expand-snippet=]] and +[[sym:yas-lookup-snippet][=yas-lookup-snippet=]] for more information. * Controlling expansion diff --git a/yasnippet-tests.el b/yasnippet-tests.el index 0f113522d..0b14a5664 100644 --- a/yasnippet-tests.el +++ b/yasnippet-tests.el @@ -433,6 +433,14 @@ TODO: correct this bug!" ("lisp-interaction-mode" ("sc" . "brother from another mother")))) ,@body)))) +(ert-deftest snippet-lookup () + "Test `yas-lookup-snippet'." + (yas-with-some-interesting-snippet-dirs + (yas-reload-all 'no-jit) + (should (equal (yas-lookup-snippet "printf" 'c-mode) "printf($1);")) + (should (equal (yas-lookup-snippet "def" 'c-mode) "# define")) + (should-not (yas-lookup-snippet "no such snippet" nil 'noerror)) + (should-not (yas-lookup-snippet "printf" 'emacs-lisp-mode 'noerror)))) (ert-deftest basic-jit-loading () "Test basic loading and expansion of snippets" diff --git a/yasnippet.el b/yasnippet.el index 305bb95b6..f1bfe65b6 100644 --- a/yasnippet.el +++ b/yasnippet.el @@ -725,7 +725,7 @@ defined direct keybindings to the command yas--direct-keymaps)) yas--tables)) -(defun yas--modes-to-activate () +(defun yas--modes-to-activate (&optional mode) "Compute list of mode symbols that are active for `yas-expand' and friends." (let (dfs) @@ -740,8 +740,10 @@ and friends." (not (memq neighbour explored)) (symbolp neighbour)) append (funcall dfs neighbour explored))))) - (remove-duplicates (append yas--extra-modes - (funcall dfs major-mode))))) + (remove-duplicates (if mode + (funcall dfs mode) + (append yas--extra-modes + (funcall dfs major-mode)))))) (defvar yas-minor-mode-hook nil "Hook run when `yas-minor-mode' is turned on.") @@ -1333,15 +1335,17 @@ return an expression that when evaluated will issue an error." yas--direct-keymaps)) table)) -(defun yas--get-snippet-tables () - "Get snippet tables for current buffer. +(defun yas--get-snippet-tables (&optional mode) + "Get snippet tables for MODE. + +MODE defaults to the current buffer's `major-mode'. Return a list of `yas--table' objects. The list of modes to consider is returned by `yas--modes-to-activate'" (remove nil (mapcar #'(lambda (name) (gethash name yas--tables)) - (yas--modes-to-activate)))) + (yas--modes-to-activate mode)))) (defun yas--menu-keymap-get-create (mode &optional parents) "Get or create the menu keymap for MODE and its PARENTS. @@ -2305,6 +2309,24 @@ Honours `yas-choose-tables-first', `yas-choose-keys-first' and (remove-duplicates (mapcan #'yas--table-templates tables) :test #'equal)))) +(defun yas-lookup-snippet (name &optional mode noerror) + "Get the snippet content for the snippet NAME in MODE's tables. + +MODE defaults to the current buffer's `major-mode'. If NOERROR +is non-nil, then don't signal an error if there isn't any snippet +called NAME. + +Honours `yas-buffer-local-condition'." + (let* ((yas-choose-tables-first nil) ; avoid prompts + (yas-choose-keys-first nil) + (snippet (cl-find name (yas--all-templates + (yas--get-snippet-tables mode)) + :key #'yas--template-name :test #'string=))) + (cond + (snippet (yas--template-content snippet)) + (noerror nil) + (t (error "No snippet named: %s" name))))) + (defun yas-insert-snippet (&optional no-condition) "Choose a snippet to expand, pop-up a list of choices according to `yas-prompt-functions'.