mirror of
https://github.com/joaotavora/yasnippet.git
synced 2026-02-04 06:32:24 +00:00
Use :filter instead of yas--fallback
Instead of making yas-expand and yas-expand-from-keymap search for the command that would have been called, use a conditional keybinding so the Emacs' builtin keybinding lookup code will do the searching instead. * doc/faq.org: Remove section about old method binding method. Update example to use new method. * doc/snippet-expansion.org (Trigger key): Update explanation for new method. * yasnippet.el (yas-fallback-behavior): Mark obsolete. (yas--maybe-expand-key-filter): New function. (yas-maybe-expand): New conditional binding. (yas-minor-mode-map): Bind it to TAB and <tab>. (yas--maybe-expand-from-keymap-filter): New function, extracted from `yas-expand-from-keymap'. (yas-maybe-expand-from-keymap): New conditional binding. * yasnippet-tests.el (yas--key-binding): New function, like `key-binding' but overrides `this-command-keys-vector'. (snippet-load-uuid): Use it. (test-yas-tab-binding, test-yas-in-org): Insert snippet key before testing binding.
This commit is contained in:
69
doc/faq.org
69
doc/faq.org
@@ -13,73 +13,6 @@ Note that some editors will automatically add a newline for you. In
|
||||
Emacs, if you set =require-final-newline= to =t=, it will add the
|
||||
final newline automatically.
|
||||
|
||||
* Why doesn't TAB expand a snippet?
|
||||
|
||||
First check the mode line to see if there's =yas=. If not, then try
|
||||
=M-x yas-minor-mode= to manually turn on the minor mode and try to
|
||||
expand the snippet again. If it works, then, you can add the following
|
||||
code to your =.emacs= /before/ loading YASnippet:
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'the-major-mode-hook 'yas-minor-mode-on)
|
||||
#+END_SRC
|
||||
|
||||
where =the-major-mode= is the major mode in which [[sym:yas-minor-mode][=yas-minor-mode=]] isn't
|
||||
enabled by default.
|
||||
|
||||
The command =M-x yas-global-mode= turns YASnippet on automatically for
|
||||
/all/ major modes.
|
||||
|
||||
If [[sym:yas-minor-mode][=yas-minor-mode=]] is on but the snippet still not expanded. Then try
|
||||
to see what command is bound to the =TAB= key: press =C-h k= and then
|
||||
press =TAB=. Emacs will show you the result.
|
||||
|
||||
You'll see a buffer prompted by Emacs saying that
|
||||
=TAB runs the command ...=. Alternatively, you might see
|
||||
=<tab> runs the command ...=, note the difference between =TAB= and
|
||||
=<tab>= where the latter has priority. If you see =<tab>= bound to a
|
||||
command other than [[sym:yas-expand][=yas-expand=]], (e.g. in =org-mode=) you can try the
|
||||
following code to work around:
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'org-mode-hook
|
||||
(let ((original-command (lookup-key org-mode-map [tab])))
|
||||
`(lambda ()
|
||||
(setq yas-fallback-behavior
|
||||
'(apply ,original-command))
|
||||
(local-set-key [tab] 'yas-expand))))
|
||||
#+END_SRC
|
||||
|
||||
replace =org-mode-hook= and =org-mode-map= with the major mode hook you
|
||||
are dealing with (Use =C-h m= to see what major mode you are in).
|
||||
|
||||
As an alternative, you can also try
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(defun yas-advise-indent-function (function-symbol)
|
||||
(eval `(defadvice ,function-symbol (around yas-try-expand-first activate)
|
||||
,(format
|
||||
"Try to expand a snippet before point, then call `%s' as usual"
|
||||
function-symbol)
|
||||
(let ((yas-fallback-behavior nil))
|
||||
(unless (and (interactive-p)
|
||||
(yas-expand))
|
||||
ad-do-it)))))
|
||||
|
||||
(yas-advise-indent-function 'ruby-indent-line)
|
||||
#+END_SRC
|
||||
|
||||
To /advise/ the modes indentation function bound to TAB, (in this case
|
||||
=ruby-indent-line=) to first try to run [[sym:yas-expand][=yas-expand=]].
|
||||
|
||||
If the output of =C-h k RET <tab>= tells you that =<tab>= is indeed
|
||||
bound to [[sym:yas-expand][=yas-expand=]] but YASnippet still doesn't work, check your
|
||||
configuration and you may also ask for help on the [[http://groups.google.com/group/smart-snippet][discussion group]].
|
||||
See this particular [[http://code.google.com/p/yasnippet/issues/detail?id=93&can=1][thread]] for quite some solutions and alternatives.
|
||||
|
||||
Don't forget to attach the information on what command is bound to TAB
|
||||
as well as the mode information (Can be obtained by =C-h m=).
|
||||
|
||||
* Why doesn't TAB navigation work with flyspell
|
||||
|
||||
A workaround is to inhibit flyspell overlays while the snippet is
|
||||
@@ -107,7 +40,7 @@ Edit the keymaps [[sym:yas-minor-mode-map][=yas-minor-mode-map=]] and
|
||||
#+begin_src emacs-lisp :exports code
|
||||
(define-key yas-minor-mode-map (kbd "<tab>") nil)
|
||||
(define-key yas-minor-mode-map (kbd "TAB") nil)
|
||||
(define-key yas-minor-mode-map (kbd "<the new key>") 'yas-expand)
|
||||
(define-key yas-minor-mode-map (kbd "<the new key>") yas-maybe-expand)
|
||||
|
||||
;;keys for navigation
|
||||
(define-key yas-keymap [(tab)] nil)
|
||||
|
||||
@@ -32,17 +32,30 @@
|
||||
** Trigger key
|
||||
|
||||
[[sym:yas-expand][=yas-expand=]] tries to expand a /snippet abbrev/ (also known as
|
||||
/snippet key/) before point.
|
||||
/snippet key/) before point. YASnippet also provides a /conditional
|
||||
binding/ for this command: the variable [[sym:yas-expand][=yas-maybe-expand=]] contains a
|
||||
special value which, when bound in a keymap, tells Emacs to call
|
||||
[[sym:yas-expand][=yas-expand=]] if and only if there is a snippet abbrev before point. If there is not
|
||||
|
||||
When [[sym:yas-minor-mode][=yas-minor-mode=]] is enabled, it binds [[sym:yas-expand][=yas-expand=]] to =TAB= and
|
||||
=<tab>= by default, however, you can freely set it to some other key:
|
||||
When [[sym:yas-minor-mode][=yas-minor-mode=]] is enabled, it binds [[sym:yas-maybe-expand][=yas-maybe-expand=]] to =TAB=
|
||||
and =<tab>= by default, however, you can freely remove those bindings:
|
||||
|
||||
#+begin_src emacs-lisp :exports code
|
||||
(define-key yas-minor-mode-map (kbd "<tab>") nil)
|
||||
(define-key yas-minor-mode-map (kbd "TAB") nil)
|
||||
(define-key yas-minor-mode-map (kbd "<the new key>") 'yas-expand)
|
||||
#+end_src
|
||||
|
||||
And set your own:
|
||||
|
||||
#+begin_src emacs-lisp :exports code
|
||||
;; Bind `SPC' to `yas-expand' when snippet expansion available (it
|
||||
;; will still call `self-insert-command' otherwise).
|
||||
(define-key yas-minor-mode-map (kbd "SPC") yas-maybe-expand)
|
||||
;; Bind `C-c y' to `yas-expand' ONLY.
|
||||
(define-key yas-minor-mode-map (kbd "C-c y") #'yas-expand)
|
||||
#+end_src
|
||||
|
||||
|
||||
To enable the YASnippet minor mode in all buffers globally use the
|
||||
command [[sym:yas-global-mode][=yas-global-mode=]]. This will enable a modeline indicator,
|
||||
=yas=:
|
||||
@@ -50,24 +63,14 @@ command [[sym:yas-global-mode][=yas-global-mode=]]. This will enable a modeline
|
||||
[[./images/minor-mode-indicator.png]]
|
||||
|
||||
When you use [[sym:yas-global-mode][=yas-global-mode=]] you can also selectively disable
|
||||
YASnippet in some buffers by setting the buffer-local variable
|
||||
[[sym:yas-dont-active][=yas-dont-active=]] in the buffer's mode hook.
|
||||
YASnippet in some buffers by calling [[sym:yas-minor-mode][=yas-minor-mode=]] with a negative
|
||||
argument in the buffer's mode hook.
|
||||
|
||||
*** Fallback behaviour
|
||||
|
||||
[[sym:yas-fallback-behaviour][=yas-fallback-behaviour=]] is a customization variable bound to
|
||||
'=call-other-command= by default. If [[sym:yas-expand][=yas-expand=]] failed to find any
|
||||
suitable snippet to expand, it will disable the minor mode temporarily
|
||||
and find if there's any other command bound to the same key.
|
||||
|
||||
If found, the command will be called. Usually this works very well
|
||||
--when there's a snippet, expand it, otherwise, call whatever command
|
||||
originally bind to the trigger key.
|
||||
|
||||
However, you can change this behavior by customizing the
|
||||
[[sym:yas-fallback-behavior][=yas-fallback-behavior=]] variable. If you set this variable to
|
||||
'=return-nil=, it will return =nil= instead of trying to call the
|
||||
/original/ command when no snippet is found.
|
||||
YASnippet used to support a more complicated way of sharing
|
||||
keybindings before [[sym:yas-expand][=yas-maybe-expand=]] was added. This is now
|
||||
obsolete.
|
||||
|
||||
** Insert at point
|
||||
|
||||
|
||||
Reference in New Issue
Block a user