Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

yasnippetでコーディングスピードを向上!!

Emacsのコーディングでスピードアップ(yasnippet)

コーディングのスピードをアップさせるためスニペットを導入。
コードの塊をポコっと挿入できます。
素晴らしいのは、各メジャーモードでスニペットを自動的に分けて管理してくれること。

EmacsLispモードで書いてる時にひらめいたスニペットをおもむろに追加。
自動的にEmacsLispモードに紐付けられた形でスニペットが保存される。
ホント素晴らしい。

さらに、挿入したスニペットのカーソル制御までできるのがVeryGoooood!!!

目次

  1. ダウンロード
  2. init.elに設定
  3. 使ってみる

ダウンロード

ここに置いてあります。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>
スニペットの編集

init.elに指定したディレクトリにスニペットファイルがあるのでソレを直接修正してもいいですが、

C-c s v

このコマンドでスニペットの再編集が可能です。
コマンド実行すると、一覧で過去に登録したスニペットが表示されるので、カーソルキーで選ぶかスニペット名を入力するかで選択できます。