2012年12月21日金曜日

最強テンプレート補完機能: YASnippet

いくら追求しても追求し過ぎることはない

Emacsの設定における格言だと思います。
今自分で考えました。

最近また新しいelispを発見したので紹介します。
タイトルにもある通りYASnippetというものです。


何が出来るのかというと

予め登録しておいたテンプレートをその場に埋め込むことが出来ます。
しかし埋め込むだけではありません。
この動画を見れば凄さが分かるでしょう。
1分15秒辺りから見てください。

 

インストールと設定方法

ググってみたら分かる通り、ほとんどver 7以下の情報しか出てきません。
でも最新版はver 8です。
最新版のインストールはgitでcloneするだけです。
cd ~/.emacs.d/plugins/
git clone git://github.com/capitaomorte/yasnippet.git
これで~/.emacs.d/plugins/の直下にyasnippetというフォルダが出来ます。
フォルダの場所は好みで変えてください。

次はinit.el(もしくは.emacs.el)側の設定です。
;; yasnippet.el----------------------------------
(add-to-list 'load-path "~/.emacs.d/plugins/yasnippet")
(require 'yasnippet)
(setq yas-snippet-dirs
      '("~/.emacs.d/mySnippets" 
        "~/.emacs.d/plugins/yasnippet/snippets"
        ))
(yas-global-mode 1)
"mySnippets"というフォルダは自分で作ったテンプレートを保存する場所ですので好みで変えてください。

ここまで設定が終わって、何でもいいのでソースコード編集中の上部のメニューに"YASnippet"という表示があれば成功です。
試しにc-mode中に"printf"と書いて[TAB]キーを押してみてください。
世界が変わります。

anythingとの連携

古いバージョンではanything-c-yasnippet.elというものがあり、バグなんかを修正したパッチまであったのですが、ver 0.8に対していくらパッチを当てても失敗したのでこれを使うことを諦めました。
でもanythingがあると便利です。
以下のコードをinit.el(もしくは.emacs.el)に書き加えます。
;; 既存スニペットを挿入
(define-key yas-minor-mode-map (kbd "C-x y i") 'yas-insert-snippet)
;; 新規スニペットを作成するバッファを用意する
(define-key yas-minor-mode-map (kbd "C-x y n") 'yas-new-snippet)
;; 既存スニペットの閲覧、編集
(define-key yas-minor-mode-map (kbd "C-x y v") 'yas-visit-snippet-file)

;; anything interface
(eval-after-load "anything-config"
  '(progn
     (defun my-yas/prompt (prompt choices &optional display-fn)
       (let* ((names (loop for choice in choices
                           collect (or (and display-fn (funcall display-fn choice))
                                       choice)))
              (selected (anything-other-buffer
                         `(((name . ,(format "%s" prompt))
                            (candidates . names)
                            (action . (("Insert snippet" . (lambda (arg) arg))))))
                         "*anything yas/prompt*")))
         (if selected
             (let ((n (position selected names :test 'equal)))
               (nth n choices))
           (signal 'quit "user quit!"))))
     (custom-set-variables '(yas/prompt-functions '(my-yas/prompt)))
     (define-key anything-command-map (kbd "y") 'yas/insert-snippet)))

C-x y iで使用出来るテンプレート(snippet)の一覧から選んで挿入出来ます。
C-x y nでオリジナルのsnippetを作ります。
C-x y vで既存のsnippetを閲覧したり編集したりできます。

わーわー言うとりますけども

とにかく入れて損は無し!
有志たちが自作のsnippetを上げてくれてるサイトもあるっぽいです。
自作のsnippetの作り方なんかは2つ目の参考URLに載っています。

参考URL
http://wiki.grepgrape.net/index.php?Emacs%2Fyasnippet
http://fukuyama.co/yasnippet

carbon emacsを使う人達への追記 !!

carbon emacsだと最新版は動作しないようなので、下記のリンクから0.6.1cをダウンロード、解凍してemacslibに入れましょう。
http://code.google.com/p/yasnippet/downloads/detail?name=yasnippet-0.6.1c.tar.bz2&can=2&q=

また、ver0.8だと使えなかったanything-c-yasnippet.eltもver0.6なら使えるのでダウンロードしてemacslibへ。
http://svn.coderepos.org/share/lang/elisp/anything-c-yasnippet/anything-c-yasnippet.el

.emacs.elには以下を書き加えて下さい。
;; yasnippet.el----------------------------------

(setq  load-path (append '("~/emacslib/yasnippet-0.6.1c") load-path))
(require 'yasnippet)
(require 'anything-c-yasnippet)
(setq yas-snippet-dirs
     '("~/emacslib/mySnippets"
       "~/emacslib/yasnippet/snippets"
       ))
(yas/initialize)
(yas/load-directory "~/emacslib/yasnippet-0.6.1c/snippets/text-mode")

これでcarbon emacsでもyasnippetが使えるようになります!!

また、anything-c-yasnippetではanything-c-yas-create-snippet-on-regionという便利なコマンドがあります。
このコマンドを使えば、snippetに自分で作ったテンプレを追加することができます。
まず登録したいテンプレの範囲を選択して、anything-c-yas-create-snippet-on-regionコマンドを実行します。
保存場所を聞かれるので、~/emacslib/yasnippet-0.6.1c/snippets/text-mode/cc-mode/に保存しましょう(拡張子不要)。
この時つけたファイル名がsnippetを呼び出すキーになります。

これでコードを書くときにそのファイル名を書きTABを押すと、snippetを呼び出してテンプレを補完してくれます。

1 件のコメント :