原文: http://yasnippet.googlecode.com/svn/trunk/doc/faq.html (translated on 2010/Dec/21) ⇒ editor's room
〔重要〕 このドキュメントは YASnippet の SVN trunk に対して適用されるものです。 SVN trunk はこちらから取得できます。 他のバージョンに対するドキュメントはこちらで見られます。
スニペット定義ファイルの末尾に改行がある場合、YASnippet はスニペットを展開したときに改行を追加します。 もしそうしたくない場合は、スニペット定義ファイルを保存するときにその末尾に改行を追加しないようにしてください。
一部のエディタは自動的に改行を追加することに注意してください。
Emacs の場合、変数 require-final-newline
を t
に設定していると、自動的にファイルの末尾に改行が追加されます。
まず最初に、モード行に yas
と表示されているか確認してください。
もし表示されていない場合、YASnippet のマイナーモードを手動で ON にするために M-x yas/minor-mode
を実行してみて、それからもう一度 TAB キーで展開できないか試してみてください。
もしこれでうまくいったら、あなたの .emacs
で YASnippet を読み込んでいるところより前に、以下のコードを追加してください:
(add-hook 'the-major-mode-hook 'yas/minor-mode-on)
上記コードの "the-major-mode
" のところは、(yas/minor-mode
がデフォルトで有効にならなかった)メジャーモードの名前にしてください。
YASnippet のバージョン 0.6 以降では、YASnippet がすべてのメジャーモードに対して自動的に有効になるようにするために、
コマンド M-x yas/global-mode
を使うことができます。
次に、yas/minor-mode
が有効なのにスニペットが展開できない、というケースについて考えます。
まず、TAB キーに割り当てられているコマンドを確認してみましょう。
C-h k
を入力して、続けて TAB キーを押してみてください。
Emacs が結果を表示してくれるはずです。
おそらく Emacs は TAB runs the command ...
というプロンプトを表示するハズです。
あるいは、<tab> runs the command ...
かもしれません。
"TAB
" と "<tab>
" の違いは、後者のほうが優先度が高い、というだけです。
もし、yas/expand
以外のコマンドが "<tab>
" に割り当てられていた場合、
以下の回避策をお試しください(これは org-mode
の例です):
(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))))
上記の例の org-mode-hook
と org-mode-map
のところは、適当なメジャーモードの名前に置き換えてください
(あなたが今なんという名前のメジャーモードにいるのか確認するには、C-h m
を使ってください)。
別の回避策として、以下のコードも試してみてください:
(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)
TAB キーに割り当てられている「そのメジャーモード固有の」インデント関数(上記の例では ruby-indent-line
)をアドバイスするため、
最初に yas/expand
を試みます。
【私もわかりません 2010/12/30 IKKI】
もし、C-h k RET <tab>
の結果では TAB キーは確かに yas/expand
に割り当てられているのに YASnippet が機能しない場合、
あなたの設定を確認してください。
また、discussion group に助けを求めるのも手かもしれません。
いくつかの素晴らしい解決方法についてはこのスレッドを参照してください。
TAB に割り当てられているコマンドに関する情報と、モードの情報(C-h m
で得られます)を、忘れずに添付するようにしてください。
(訳注: flyspell というのはリアルタイムのスペルチェッカです)
回避策は、スニペットがアクティブになっている間は flyspell によるオーバーレイを無効にする、というものです:
(add-hook 'flyspell-incorrect-hook
#'(lambda (dummy1 dummy2 dymmy3)
(and yas/active-field-overlay
(overlay-buffer yas/active-field-overlay))))
この問題は、どうやら、オーバーレイの優先度に関係あるようです。
なんらかの理由により、flyspell のオーバーレイの keymap
プロパティは、YASnippet のオーバーレイの keymap
より常に優先されるようです。
たとえ YASnippet のほうの priority
プロパティを大きな値に設定したとしても、ダメです。
もし、あなたが emacs-lisp について知識があって、この問題を解決できるなら、discussion group に一筆書いてください。
YASnippet のバージョン 0.6.1c 以降なら、一番良い方法は、変数 yas/dont-activate
のデフォルト値を以下のようなラムダ関数にすることです:
(set-default 'yas/dont-activate
#'(lambda ()
(and yas/root-directory
(null (yas/get-snippet-tables)))))
これはまた、バージョン 0.6.1c 以降でのデフォルト値でもあります。
こうすると、yas/root-directory
が設定されていて、かつ、そのバッファに適用可能な snippet table が存在しないときに限り、YASnippet マイナーモードをスキップします。
【私もわかりません 2010/12/30 IKKI】
注: この質問は、ファイル名が snippet key になるようにスニペットを定義しているときだけ適用されます。 この挙動は、YASnippet のバージョン 0.6 より古いバージョンに対する後方互換性を提供するためのもので、非推奨です(将来のバージョンでは廃止されるかもしれません)。
たとえば、文字 >
をキーとするスニペットを定義したいとします。
この文字は、Windows 上のファイル名として使える文字ではありません。
つまり、ファイル名を trigger key として使うことができません。
スニペットを定義するときに明示的に snippet key を指定できる # key:
ディレクティブを使うべきです。
そして、そのスニペット定義を、任意の妥当なファイル名(たとえば lt.yasnippet
)で保存してください。
#key: <
#name: <...></...>
# --
<${1:div}>$0</$1>