$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

yasnippet,anything-c-yasnippetをインストールした

 yasnippet.elが便利そうだったので、インストールしてみた。anything-c-yasnippetyasnippetをanythingの形式で使える便利なもの。yasnippet, anything-c-yasnippetのまとめエントリー - IMAKADO::BLOGにまとめられています。

yasnippet.elのダウンロード


yasnippet -


yet another snippet extension for Emacs. - Google Project Hosting
に置いてある、yasnippet-0.6.1c.tar.bz2をダウンロードして解凍。解凍されたフォルダをemacs設定ディレクトリのどこかに置いておきます。僕の場合は、

~/.emacs.d/elisp/yasnippet

のようにディレクトリ名を変えて配置しました。

anything-c-yasnippetのダウンロード

http://svn.coderepos.org/share/lang/elisp/anything-c-yasnippet/anything-c-yasnippet.elに置いてあるので、それをダウンロードしてくる。そのあと、emacs設定ディレクトリのどこかに置いておきます。僕の場合は、

~/.emacs.d/elisp/anything/

の下に置きました。
ただし、この後注意が必要で、yasnippet-0.6.1cの場合、このままでは動きません。そこで、yasnippet-0.6.1b(c?)を使うとanything-c-yasnippet.elが動かない - 放牧日記で書かれているパッチを当てます。

diff --git a/plugins/anything-c-yasnippet.el b/plugins/anything-c-yasnippet.el
index b74c115..948d627 100644
--- a/plugins/anything-c-yasnippet.el
+++ b/plugins/anything-c-yasnippet.el
@@ -162,15 +162,20 @@ If SNIPPET-FILE does not contain directory, it is placed in default snippet dire
         (yas/choose-tables-first nil)
         (yas/buffer-local-condition 'always))
     (let* ((result-alist '((candidates) (transformed) (template-key-alist)))
-           (hash-value-alist nil)
-           (cur-table (first (yas/get-snippet-tables anything-c-yas-cur-major-mode)))
-           (hash-table (yas/snippet-table-hash cur-table))) ;`yas/snippet-table-hash'
-      (let ((hashes (loop for table in (yas/get-snippet-tables)
+           (cur-tables
+            (if table
+                (list table)
+              (yas/get-snippet-tables anything-c-yas-cur-major-mode)))
+           (hash-value-alist nil))
+      (let ((hashes (loop for table in cur-tables
                           collect (yas/snippet-table-hash table))))
         (loop for hash in hashes
               do (maphash (lambda (k v)
-                            (setq hash-value-alist (append v hash-value-alist))
-                            )
+                            (let (a)
+                              (maphash (lambda (n te)
+                                         (setq a (append (list (cons k te)) a)))
+                                       v)
+                              (setq hash-value-alist (append a hash-value-alist))))
                           hash))
         (loop with transformed
               with templates
@@ -306,7 +311,7 @@ space match anyword greedy"
     (candidate-transformer . (lambda (candidates)
                                (anything-c-yas-get-transformed-list anything-c-yas-cur-snippets-alist anything-c-yas-initial-input)))
     (action . (("Insert snippet" . (lambda (template)
-                                     (yas/expand-snippet anything-c-yas-point-start anything-c-yas-point-end template)
+                                     (yas/expand-snippet template anything-c-yas-point-start anything-c-yas-point-end)
                                      (when anything-c-yas-display-msg-after-complete
                                        (message "this snippet is bound to [ %s ]"
                                                 (anything-c-yas-get-key-by-template template anything-c-yas-cur-snippets-alist)))))

これを、どこかにanything-c-yasnippet.patch(名前は適当)のように保存して、anything-c-yasnippet.elの置かれているフォルダに移動してpatchコマンドを使います。僕の環境では次のコマンド。

% cd ~/.emacs.d/elisp/anything
% patch < ~/anything-c-yasnippet.patch

これで大丈夫です。

設定

ファイルを置いた場所にロードパスを通してから、次のような設定をしておくと大丈夫みたいです。

(require 'yasnippet)
(require 'anything-c-yasnippet)
(setq anything-c-yas-space-match-any-greedy t) ;スペース区切りで絞り込めるようにする デフォルトは nil
(global-set-key (kbd "C-c y") 'anything-c-yas-complete) ;C-c yで起動 
(yas/initialize)
(yas/load-directory "~/.emacs.d/elisp/yasnippet/snippets/") ;snippetsのディレクトリを指定(環境に合わせて)

yasnippet, anything-c-yasnippetのまとめエントリー - IMAKADO::BLOGには以下の設定も書く事になってますが、yasnippetのあるバージョンから必要なくなったようです。

(add-to-list 'yas/extra-mode-hooks 'ruby-mode-hook)
(add-to-list 'yas/extra-mode-hooks 'cperl-mode-hook)