Emacsのコーディングでスピードアップ(yasnippet)
コーディングのスピードをアップさせるためスニペットを導入。
コードの塊をポコっと挿入できます。
素晴らしいのは、各メジャーモードでスニペットを自動的に分けて管理してくれること。
EmacsLispモードで書いてる時にひらめいたスニペットをおもむろに追加。
自動的にEmacsLispモードに紐付けられた形でスニペットが保存される。
ホント素晴らしい。
さらに、挿入したスニペットのカーソル制御までできるのがVeryGoooood!!!
目次
- ダウンロード
- init.elに設定
- 使ってみる
ダウンロード
ここに置いてあります。GitHub。
https://github.com/capitaomorte/yasnippet
git使えるならcloneコマンドで落とせますね。
git使えなくても、yasnippet.elをload-pathが通っているディレクトリに保存すればOK。
init.elに設定
自分用のスニペットを保存する場所と、それ以外のスニペットを保存する場所を分けて設定。
また、他のメジャーモードやマイナーモードと併用することが考えられるので、キーバインドも変更。
(when (require 'yasnippet nil t) (setq yas-snippet-dirs '("~/.emacs.d/mode_dat/yasnippet/mySnippets" "~/.emacs.d/mode_dat/yasnippet/snippets")) (define-key yas-minor-mode-map (kbd "C-c s i") 'yas-insert-snippet) ;; 既存スニペットを挿入する (define-key yas-minor-mode-map (kbd "C-c s n") 'yas-new-snippet) ;; 新規スニペットを作成するバッファを用意する (define-key yas-minor-mode-map (kbd "C-c s v") 'yas-visit-snippet-file) ;; 既存スニペットを閲覧・編集する (yas-global-mode t))
使ってみる
早速使ってみます。
まずはバッファの作成
バッファ作成の方法・・・まぁ、特に特別なことはなく、htmlファイルやらC言語ファイルやら開けば、それに対応したモードに自動的になるはずです。
スニペット作成
init.elで指定したキーバインドで作成します。
C-c s n
ですね。
すると、*new snippet*バッファが開きます。
# -*- mode: snippet; require-final-newline: nil -*- # name: # key: # binding: direct-keybinding # --
name:とkey:の部分に呼び出したいスニペットの名前を書きます。
「# --」以降にスニペットを書きます。
EmacsLispで使うスニペットを例にすると、、、こんなかんじです。
# -*- mode: snippet; require-final-newline: nil -*- # name: _defcond # key: _defcond # binding: direct-keybinding # -- (defun $1 ($2) (cond ($0)))
$0,$1,$2はスニペット配置後のカーソルの位置。
$0は最終的にカーソルが移動する所。
TABで指定した場所にカーソルが移動します。
$0~$Xを省略した場合は、カーソルは末尾に行きます。
また、TAB移動は途中でハイライトの外に位置に移動するか、C-gで解除できます。
作成したスニペットの挿入
C-c s i
ですね。
すると、過去に作ったスニペットの一覧が表示されます。
C-p,C-nで選択してEnterキーを叩いてもよし。
直接スニペット名を入力してEnterキーを叩くもよし。
これで挿入されます。
ちょっと高度なスニペットの作り方
こんなふうに書くと、初期値を表示することが出来ます。
# -*- mode: snippet; require-final-newline: nil -*- # name: _defcond # key: _defcond # binding: direct-keybinding # -- (defun ${1:FunctionName} (${2:Parameter}) (cond ($0)))
HTMLのコーディングとかで威力を発揮するんですが、入れ子もOKです。
# -*- mode: snippet; require-final-newline: nil -*- # name: _section # key: _section # binding: direct-keybinding # -- <section${1: id="${2:id_name}"}${3: class="${4:class_name}"}> $0 </section>