zencoding-mode.el は既に、yasnippet との協調を実装している

スニペット補完後のカーソルの位置が、あまり使いやすくない。

zencoding-mode.el を眺めていて気づいたんだけど、zencoding-mode はすでにyasnippetとの協調を実装していて、これによって上の要望を解決している模様 (zencoding-mode:version 0.5(2009-11-20)版)。

zencoding-expand-yas という関数が、それ。

比較例

次の文字列を入力して、展開する。

div>p*2

zencoding-expand-line (yasnippetと協調しない) の場合

次のように展開される。[] は、展開直後のポイントの位置。まぁこれは確かにポイントをp要素に移動させるのが面倒くさい。

   <div>
      <p>
      </p>
      <p>
      </p>
   </div>[]
zencoding-expand-yas (yasnippet協調) の場合

次のように展開される。

   <div>
      
      <p>
         []
      </p>
      <p>
         
      </p>
   </div>

ここで [TAB] *1 を押すと、ポイントが次のp要素へジャンプする。超便利。

例2

この自動ジャンプはどれぐらい賢いのか、コードを追うのは面倒くさいのでw ちょっと複雑なスニペットを試すことで確認してみる。

div>(p>ul>li*2)+p*2

上のを zencoding-expand-yas コマンドで展開すると

   <div>
      
      <p>
         
         <ul>
            
            <li>
               [1]
            </li>
            <li>
               [2]
            </li>
         </ul>
      </p>
      <p>
         [3]
      </p>
      <p>
         [4]
      </p>
   </div>

[TAB] を押下するごとに、[1] - [4] の順番にポイントが移動する。どうやらツリー構造の末端を移動していく仕様のようだ。

結論

yasnippet を利用している環境でzencoding-modeを使う人は、zencoding-expand-line の代わりに zencoding-expand-yas を利用すべし。

(define-key zencoding-mode-keymap (kbd "<C-return>") 'zencoding-expand-yas)

*1:yasnippet.el で "yas/next-field-or-maybe-expand" にバインドされている