]> code.delx.au - gnu-emacs-elpa/blobdiff - packages/yasnippet/doc/doc/faq.org
Update packages/yasnippet by merging from its external upstream subtree
[gnu-emacs-elpa] / packages / yasnippet / doc / doc / faq.org
diff --git a/packages/yasnippet/doc/doc/faq.org b/packages/yasnippet/doc/doc/faq.org
new file mode 100644 (file)
index 0000000..79249e8
--- /dev/null
@@ -0,0 +1,158 @@
+#+SETUPFILE: org-setup.inc
+
+#+TITLE: Frequently Asked Questions
+
+* Why is there an extra newline?
+
+If you have a newline at the end of the snippet definition file, then
+YASnippet will add a newline when you expanding a snippet. Please don't
+add a newline at the end if you don't want it when you saving the
+snippet file.
+
+Note 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
+for you 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.
+
+From YASnippet 0.6 you can also use the command =M-x yas-global-mode= to
+turn on YASnippet 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
+active:
+
+#+BEGIN_SRC emacs-lisp
+  (add-hook 'flyspell-incorrect-hook
+            #'(lambda (dummy1 dummy2 dymmy3)
+                (and yas-active-field-overlay
+                     (overlay-buffer yas-active-field-overlay))))
+#+END_SRC
+
+This is apparently related to overlay priorities. For some reason, the
+=keymap= property of flyspell's overlays always takes priority over the
+same property in YASnippet's overlays, even if one sets the latter's
+=priority= property to something big. If you know emacs-lisp and can
+solve this problem, drop a line in the
+[[http://groups.google.com/group/smart-snippet][discussion group]].
+
+* How to I use alternative keys, i.e. not TAB?
+
+Edit the keymaps [[sym:yas-minor-mode-map][=yas-minor-mode-map=]] and
+[[sym:yas-keymap][=yas-keymap=]] as you would any other keymap:
+
+#+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)
+
+   ;;keys for navigation
+   (define-key yas-keymap [(tab)]       nil)
+   (define-key yas-keymap (kbd "TAB")   nil)
+   (define-key yas-keymap [(shift tab)] nil)
+   (define-key yas-keymap [backtab]     nil)
+   (define-key yas-keymap (kbd "<new-next-field-key>") 'yas-next-field-or-maybe-expand)
+   (define-key yas-keymap (kbd "<new-prev-field-key>") 'yas-prev)
+#+end_src
+
+* How do I turn off the minor mode where in some buffers?
+
+The best way, since version 0.6.1c, is to set the default value of the
+variable [[sym:yas-dont-activate][=yas-dont-activate=]] to a lambda function like so:
+
+#+BEGIN_SRC emacs-lisp
+  (set-default 'yas-dont-activate
+               #'(lambda ()
+                   (and yas-root-directory
+                        (null (yas-get-snippet-tables)))))
+#+END_SRC
+
+This is also the default value starting for that version. It skips the
+minor mode in buffers where it is not applicable (no snippet tables),
+but only once you have setup your yas-root-directory.
+
+* How do I define an abbrev key containing characters not supported by the filesystem?
+
+-  *Note*: This question applies if you're still defining snippets
+   whose key /is/ the filename. This is behavior still provided by
+   version 0.6 for backward compatibilty, but is somewhat
+   deprecated...
+
+For example, you want to define a snippet by the key =<= which is not a
+valid character for filename on Windows. This means you can't use the
+filename as a trigger key in this case.
+
+You should rather use the =# key:= directive to specify the key of the
+defined snippet explicitly and name your snippet with an arbitrary valid
+filename, =lt.YASnippet= for example, using =<= for the =# key:=
+directive:
+
+#+BEGIN_SRC snippet
+  # key: <
+  # name: <...></...>
+  # --
+  <${1:div}>$0</$1>
+#+END_SRC