Merge: let snippets expand in strings/comments by default

Also make yas-buffer-local-condition into a defcustom.
This commit is contained in:
Noam Postavsky 2017-02-16 22:28:31 -05:00
commit cddb8260a0
2 changed files with 31 additions and 26 deletions

View File

@ -178,32 +178,30 @@ In particular, the following things matter:
(yas-activate-extra-mode 'rails-mode)))
#+END_SRC
- Buffer-local
[[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]]
variable
- Buffer-local [[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]] variable
This variable provides finer grained control over what snippets can
be expanded in the current buffer. The default value won't let you
expand snippets inside comments or string literals for example. See
The condition system\_ for more info.
be expanded in the current buffer. For example, the constant
[[sym:yas-not-string-or-comment-condition][=yas-not-string-or-comment-condition=]] has a value that disables
snippet expansion inside comments or string literals. See [[condition-system][the
condition system]] for more info.
** The condition system
** The condition system <<condition-system>>
Consider this scenario: you are an old Emacs hacker. You like the
abbrev-way and bind [[sym:yas-expand][=yas-expand=]] to =SPC=. However, you don't want
=if= to be expanded as a snippet when you are typing in a comment
block or a string (e.g. in =python-mode=).
If you use the =# condition := directive (see
[[./snippet-development.org][Writing Snippets]]) you could just specify
the condition for =if= to be =(not (python-syntax-comment-or-string-p))=. But how
about =while=, =for=, etc. ? Writing the same condition for all the
snippets is just boring. So has a buffer local variable
[[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]]. You can set this variable to
=(not (python-syntax-comment-or-string-p))= in =python-mode-hook=.
If you use the =# condition := directive (see [[./snippet-development.org][Writing Snippets]]) you
could just specify the condition for =if= to be =(not
(python-syntax-comment-or-string-p))=. But how about =while=, =for=,
etc? Writing the same condition for all the snippets is just boring.
So you can instead set [[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]] to =(not
(python-syntax-comment-or-string-p))= in =python-mode-hook=.
Then, what if you really want some particular snippet to expand even
inside a comment? Set [[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]] like this
inside a comment? Set [[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]] like this
#+BEGIN_SRC emacs-lisp
(add-hook 'python-mode-hook
@ -214,10 +212,10 @@ inside a comment? Set [[sym:yas-buffer-local-condition][=yas-buffer-local-condit
t))))
#+END_SRC
... and specify the condition for a snippet that you're going to expand
in comment to be evaluated to the symbol =force-in-comment=. Then it can
be expanded as you expected, while other snippets like =if= still can't
expanded in comment.
... and for a snippet that you want to expand in comments, specify a
condition which evaluates to the symbol =force-in-comment=. Then it
can be expanded as you expected, while other snippets like =if= still
can't expanded in comments.
For the full set of possible conditions, see the documentation for
[[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]].

View File

@ -456,13 +456,17 @@ Attention: These hooks are not run when exiting nested/stacked snippet expansion
'()
"Hooks to run just before expanding a snippet.")
(defvar yas-buffer-local-condition
(defconst yas-not-string-or-comment-condition
'(if (and (let ((ppss (syntax-ppss)))
(or (nth 3 ppss) (nth 4 ppss)))
(memq this-command '(yas-expand yas-expand-from-trigger-key
yas-expand-from-keymap)))
'(require-snippet-condition . force-in-comment)
t)
"Disables snippet expansion in strings and comments.
To use, set `yas-buffer-local-condition' to this value.")
(defcustom yas-buffer-local-condition t
"Snippet expanding condition.
This variable is a Lisp form which is evaluated every time a
@ -509,12 +513,15 @@ conditions.
(setq yas-buffer-local-condition
\\='(if (python-syntax-comment-or-string-p)
\\='(require-snippet-condition . force-in-comment)
t))))
The default value is similar, it filters out potential snippet
expansions inside comments and string literals, unless the
snippet itself contains a condition that returns the symbol
`force-in-comment'.")
t))))"
:type
`(choice
(const :tag "Disable snippet expansion inside strings and comments"
,yas-not-string-or-comment-condition)
(const :tag "Expand all snippets regardless of conditions" always)
(const :tag "Expand snippets unless their condition is nil" t)
(const :tag "Disable all snippet expansion" nil)
sexp))
;;; Internal variables