読者です 読者をやめる 読者になる 読者になる

うめすこんぶ

日々のプログラミングで残しておきたいメモ.何かの役に立てれば幸いです.

emacs 最強スニペット展開プラグイン yasnippet.elのインストール!

スポンサーリンク

目次

  1. なにこれ?
  2. ダウンロード
  3. 基本の設定
  4. キーバインド設定
  5. スニペットを試す
  6. オリジナルのスニペットを新規作成
  7. 参考
  8. 上記以外のエラー
  9. タブでスニペット展開しようとしたら,展開できない問題
  10. 古い記事を見て設定しようとする時の注意
  11. その他

なにこれ?

はじめにこの動画を見てもらうとわかりやすいです.

http://www.youtube.com/watch?feature=player_embedded&v=vOj7btx3ATg

スニペットというのは,キーとなるコマンドや数文字を打ち込むだけでコードをばっと展開してくれるもののことです. これが使えるとコードを書くときのタイピング数もすこぶる減らすことが可能なんですね. 絶対おすすめ!ぜひ入れましょう!

ダウンロード

以下のgithubからソースをダウンロード.~/.emacs.d/site-lisp上に置く.

基本の設定

emacs設定ファイル(init.el等)を開いて以下のコードを追記.

;; yasnippetを置いているフォルダにパスを通す
(add-to-list 'load-path
             (expand-file-name "~/.emacs.d/site-lisp/yasnippet"))

;;自分用のスニペットフォルダと,拾ってきたスニペットフォルダの2つを作っておきます.
;;(一つにまとめてもいいけど)
(require 'yasnippet)
(setq yas-snippet-dirs
      '("~/.emacs.d/mySnippets" 
        "~/.emacs.d/snippets"
        ))

;; yas起動
(yas-global-mode 1)

キーバインド設定

コマンド一覧です.ちなみに,キーバインドですが,初期設定'C-c & C-n' などありますが,押しにくいので,自分でキーバインド変えましょう.

初期バインド 自分用バインド コマンド名称 説明
C-c & C-n C-x i n yas-new-snippet スニペット新規作成
C-c & C-s C-x i i yas-insert-snippet スニペットを選択して挿入
C-; y なし yas/insert-snippet yas-insert-snippetと同じ機能?使用してません
C-c & C-v C-x i v yas-visit-snippet-file 編集中のファイルに関連するスニペットを選択して編集できる
init.el設定

yasnippet 8.0の導入からスニペットの書き方、anything/helm/auto-completeとの連携 - Web学びを参考にさせていただきました.ありがとうございます!

;; 既存スニペットを挿入する
(define-key yas-minor-mode-map (kbd "C-x i i") 'yas-insert-snippet)
;; 新規スニペットを作成するバッファを用意する
(define-key yas-minor-mode-map (kbd "C-x i n") 'yas-new-snippet)
;; 既存スニペットを閲覧・編集する
(define-key yas-minor-mode-map (kbd "C-x i v") 'yas-visit-snippet-file)

スニペットを試す

設定出来ましたら試してみましょう. 適当にtest.cなどのCファイルを作ってみて,ifと打ち,TABキーを押します. すると,うまく行けばスニペットが展開されて,下の図のようになります.

f:id:konbu13:20140112112204j:plain

今色が付いているconditionのところを適当に書いてまたTABを押すと,

if (true)
{
   @ 
}

このコードの@の部分にカーソルが飛び,すぐにif文の中身を編集できる状態になります. ここまで来るのに時間がかかったので,感動も一入.また,色付き部分を編集中にやっぱif文いらないなど辞めたくなったら,とりあえずC-gでquitしましょう.

[yas] elisp error! Symbol's function definition is void: end-of-file[yas] elisp error! Symbol's value as variable is void: lisp[yas] elisp error! Symbol's function definition is void: end-of-file

オリジナルのスニペットを新規作成

  • 自分でオリジナルのスニペットを作る場合,とりあえず`C-i nで新規作成画面に移ります.
  • この画面の,# --までがコメント.# --以降が展開されるスニペットになります.nameとkeyと,スニペットを書きます.今回はjavascriptでログを出すためのスニペットを書いてみました.
# -*- mode: snippet -*-
# name:console 
# key: cons
# binding: direct-keybinding
# expand-env: ((some-var some-value))
# type: command
# --
console.log($0);
  • エラーがでるので,
# binding: direct-keybinding
# expand-env: ((some-var some-value))
# type: command

の部分は消しておきます.

  • C-c C-cでセーブ.
  • ミニバッファにChoose or enter a table (yas guesses js2-mode):と出る→モードを選んでエンター.
  • [yas] look a liblary or new snippet. Save to new file → yで.
  • ファイル名を聞かれるので記入してエンター.
スニペット作成画面で使えるコマンド

ご参考.

バインド コマンド名称 説明
C-c C-c yas-load-snippet-buffer-and-close スニペットを保存する
C-c C-l yas-load-snippet-buffer スニペットをロードして使える状態にする(使う意味があまりない)
C-c C-t yas-tryout-snippet スニペットを試す(エラーが起こって使用できない…)
試す

javascriptのファイルを開き,consと押してTAB.うまく出れば成功!

その他

スニペットのもっと高度な書き方はWriting snippetsを参考に.

古い記事を見て設定しようとする時の注意

(yas/initialize)

と書いてありますが,最新版ではこれらのコードは

(yas-global-mode 1)

が代わりになってくれています.

タブでスニペット展開しようとしたら,展開できない問題

コマンドをうって展開コマンド(TAB)を打つと,ヒュン!って左に移動して,コマンドが消える謎現象が起こりました.ずっと解決できませんでしたが,やっと解決方法が分かりました.

M-x yas/new-snippetででるスニペット新規作成画面. このなかで

# binding: direct-keybinding
# expand-env: ((some-var some-value))
# type: command

となっているところを消しましょう.消したら保存してもう一度コマンドを試して見てください. それでもダメならemacs再起動やM-x yas-load-directoryスニペットをロードし直しますとうまくいきました.

上記以外のエラー

また,TABキーがyas-expandにバインドされていない場合もあります. それを確認するときは,M-x describe-keyでリターンしてTABキーを打ち込んでください. その時に出るウインドウに

<tab> runs the command yas-expand, which is an alias for
`yas-expand-from-trigger-key' in `yasnippet.el'.

とでればOKです.出なかったらemacsの設定ファイルを見直しましょう.

  • 設定の仕方:
(custom-set-variables '(yas-trigger-key "TAB"))

参考

yasnippet 8.0の導入からスニペットの書き方、anything/helm/auto-completeとの連携 - Web学び helmとの連携方法も.