原文: http://yasnippet.googlecode.com/svn/trunk/doc/faq.html (translated on 2010/Dec/21) ⇒ editor's room

Frequently Asked Questions

〔重要〕 このドキュメントは YASnippet の SVN trunk に対して適用されるものです。 SVN trunk はこちらから取得できます。 他のバージョンに対するドキュメントはこちらで見られます。

余計な改行がついてしまう

スニペット定義ファイルの末尾に改行がある場合、YASnippet はスニペットを展開したときに改行を追加します。 もしそうしたくない場合は、スニペット定義ファイルを保存するときにその末尾に改行を追加しないようにしてください。

一部のエディタは自動的に改行を追加することに注意してください。 Emacs の場合、変数 require-final-newlinet に設定していると、自動的にファイルの末尾に改行が追加されます。

TAB キーでスニペットを展開できない

まず最初に、モード行に 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-hookorg-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 と一緒に使うと TAB キーによる操作ができない

(訳注: 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 マイナーモードを OFF にしたい

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 に使いたい

注: この質問は、ファイル名が snippet key になるようにスニペットを定義しているときだけ適用されます。 この挙動は、YASnippet のバージョン 0.6 より古いバージョンに対する後方互換性を提供するためのもので、非推奨です(将来のバージョンでは廃止されるかもしれません)。

たとえば、文字 > をキーとするスニペットを定義したいとします。 この文字は、Windows 上のファイル名として使える文字ではありません。 つまり、ファイル名を trigger key として使うことができません。

スニペットを定義するときに明示的に snippet key を指定できる # key: ディレクティブを使うべきです。 そして、そのスニペット定義を、任意の妥当なファイル名(たとえば lt.yasnippet)で保存してください。

#key: <
#name: <...></...>
# --
<${1:div}>$0</$1>