proglog

主にプログラミングに関する断片的メモ

[devel][emacs] yasnippet.elに関する覚え書き

スニペット貼り付け。

  • 略語展開による短文貼り付け
  • メニューからも選んで貼り付けも可能
  • webフレームワークのテンプレートみたいな置き換え
  • カスケード的にスニペットを管理する。

Yet Another Snippet extension 日本語訳
http://yasnippet-doc-jp.googlecode.com/svn/trunk/doc-jp/index.html

インストール

ノーマル版のyasnippet-x.y.z.tar.bz2で。
yasnippet.elをsite-lispへ。
付いてきたsnippetは以下の通りに。

設定

~/.emacs.d/以下に

/mysnippet
/3rdsnippet
/snippet

というディレクトリを作る。
それぞれ、自分が作った用、貰ってきた用、デフォルトで付いてきたのを置いとく用
というような感じ。

.emacsなどに、

(require 'yasnippet)
(yas/initialize)
(setq yas/root-directory '("~/.emacs.d/mysnippets"
                           "~/.emacs.d/3rdsnippet"
			   "~/.emacs.d/snippets"))
;;ディレクトリが一つの時は(yas/load-directory yas/root-directory)
(mapc 'yas/load-directory yas/root-directory)

順番が大事で、先頭に自分で作るスニペットのディレクトリを置く。

例えばpython-modeを使っている時にM-x:「yas/new-snippet」でスニペットを書くモードにする。
C-cC-cで保存すると「~/.emacs.d/mysnippets/python-mode」に保存され、リロードされてすぐ使える。
サブディレクトリはなければ作られる。

あとの細かい管理方法は、とりあえず忘れる。

使い方

M-x:yas/minor-mode
で、メニューから選ぶ。
こんだけでも結構便利。
キー関係は後で考える。

書き方

マニュアル
Writing snippets
http://yasnippet-doc-jp.googlecode.com/svn/trunk/doc-jp/snippet-development.html

  • 貼り付けたいものをそのまんま書く
  • 中に$0を書いておくと、そこにカーソルが行く

貼り付け後に。

  • 手動書き込みの変数

要所要所で、$1,$2などという変数を使うと、貼り付け前に[tab]キーで移動する。
そこに手動で書き込む。

$1 = [(k, v) for k, v in $2.item()]

プレースホルダという。

  • デフォルト値

${1:document}などという書き方をすると、documentがそこのデフォルトの値となる。

  • 同じ変数をペアで使うと、同時に書き換わる
<!-- start of $1 -->
$0
<!-- end of $1   -->

じつはペアじゃなくて3つ以上あってもいい。
だからマニュアルではミラーと呼ばれてる。

デフォルト値を書くとこ。
`バッククォート`で囲む

import logging

logging.basicConfig(level=logging.${1:DEBUG},
                    format='%(asctime)s : %(name)-12s: %(funcName)s:%(levelname)s %(message)s',
                    filename="${2:`(file-name-nondirectory (file-name-sans-extension (buffer-file-name)))`}" + '.log',
                    filemode='w')
logger = logging.getLogger("$2")
console = logging.StreamHandler()
console.setLevel(logging.$1)

この例だと、$2に当たるところに、ファイル名のベース名が埋めこまれる。

  • フィルタを掛けながら書き込み

手動の書き込みに対し、emacs lispでフィルタを掛けられる。
(マニュアルより)
書き込むそばから大文字に変換する。

#define "${1:mydefine$(upcase yas/text)}"
#define "${1:$$(upcase yas/text)}"

yas/textというのがそのための変数。
上が、デフォルト値を置く場合。
下が置かない場合。
デフォルト値の代わりに"$"を使う。
lispは$()の中に書く。

  • ペアにフィルタ

ペアの一方を書き込む。
その時、もう一方にフィルタ関数を作用させられる。
(マニュアルより)

${1:$(make-string (string-width text) ?\=)}
${1:Title}
${1:$(make-string (string-width text) ?\=)}

$0

まん中の$1を書き換えると上下二つの$1のとこのemacs lispが評価される。

その他

数が増えてきたら、anything.elとかとの連携を考える。