2012年1月7日土曜日

yasnippet 探検

Emacs の Org-mode でyasnippetをインストールしておくと、 "<s <tab>" と入力すると "#+begin_example" と展開されるが、設定ファイルはどうなっているのだろう?
・・・どこで設定されているのだろうか?
インストール時に作った .emacs.d/plugins の中か?
$ ls -F
cc-mode/         erlang-mode/     markdown-mode/   rst-mode/        sql-mode/
css-mode/        f90-mode/        nxml-mode/       ruby-mode/       time
emacs-lisp-mode/ html-mode/       perl-mode/       scala-mode/ 
email            latex-mode/      python-mode/     snippet-mode/ 
org-mode はない・・・。perl-mode がある・・・。
中身は?
$ ls -F perl-mode
cperl-mode/ for         if          ifee        unless      xfore       xunless 
eval        fore        ife         sub         while       xif         xwhile  


実行してみる

if の場合

if ファイルの中身は、
#name : if (...) { ... }
# --
if ($1) {
    $0
}
Emacs の perl-mode で
if<tab> 
を入力すると、
if () {
    
}
が展開されて()の中にカーソルがくる。 ()の中に条件を書いて、<tab> を打つと{}の中にカーソルが移動する(上の設定ファイル中の '$0' の位置)。 便利。


fore の場合

fore<tab>
を入力すると、
foreach my $x (@array) {
    # body...
}
が展開されて、"x" の上にカーソルがくる。ここで、
  1. そのまま変数名を打ち込むと x がその変数名に置き換わる。
  2. <tab> を打つとカーソルは 'array' のところにくる。そのまま配列名を打ち込むと array がその配列名に置き換わる。
  3. ここで <tab> を打つと今度はカーソルは '# body…' のところにくる。処理を書いて <tab> を打つと{}の外にカーソルが移動する。
便利。便利。 fore の設定の中身は、
#name : foreach ... { ... }
# --
foreach my \$${1:x} (@${2:array}) {
    ${3:# body...}
}


for の場合

for の場合は、
for<tab>
を入力すると、
for (my $var = 0; $var < expression; $var++) {
    # body...
}
が展開されて、最初の var の上にカーソルがくる。この変数を書き換えると、残りの "var" も同時に書き換わる。 すごい。
for の中身は、
#name : for (...) { ... }
# --
for (my \$${1:var} = 0; \$$1 < ${2:expression}; \$$1++) {
    ${3:# body...}
}


構文

テンプレートの構文 を参考に。

1.  $0 とか $1。 
  タブストップと呼ばれる。 tab と s-tab で行ったり来たり出来る領域。(うちでは s-tab は効かなかった。ので戻れない。)

2.  {1:var} の "var" や {2:expression} の "expression" 。 
  プレースホルダーと呼ばれる。タブストップのデフォルト値。 ユーザーが何か入力するとその文字に置き換わる。

3.  ミラー 
  同じ番号のタブストップが幾つかあった場合、プレースホルダーを書き換えると、同じ番号のタブストップにも反映される。

設定が面倒かと思ってこれまで yasnippet はインストールしていなかったが、何も設定しなくてもインストールするだけでたくさんのスニペットが使えるようになっている。 もっと早くインストールすべきだった。
で、"<s" の設定はどこにあるのでしょう?


参考:テンプレートの構文





0 件のコメント:

コメントを投稿