[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つ以上あってもいい。
だからマニュアルではミラーと呼ばれてる。
- emacs lispで値を埋めこむ
デフォルト値を書くとこ。
`バッククォート`で囲む
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とかとの連携を考える。