somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【Emacs】yasnippetの設定

略語から定型文を入力する機能を提供するyasnippetの設定に関するメモです。設定に関する情報は存在するが、まとまっていなかったので苦労しました。特に、anythingとの連携部分は大変でした。

ダウンロード

ここが一番大変でした。まずは、以下の手順でyasnippetをインストールします。ディレクトリは適当にあわせてください。

  1. https://github.com/capitaomorte/yasnippetから一式をダウンロードする。または、gitを使って https://github.com/capitaomorte/yasnippet.gitからクローンする。
  2. 上記を(展開したディレクトリの場合は名前を変更する)~/.emacs.d/pluginに移動する

次に、以下の手順でanything-c-yasnippet.elをインストールします。

  1. https://gist.github.com/711583(yanippet 0.7.0で動作するよう修正した — Gist)からelispをダウンロードする。
  2. ロードパスの通ったディレクトリにダウンロードしたファイルを格納する

これで完了です。ググるとよく出てくるインストール方法は以下のとおりです。

この2つを行った後に、さらに修正をしているのがgistからのインストール部分です。違いは以下の部分です。

@@ -168,7 +173,7 @@
               (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))))
+                          collect (yas/table-hash table))))
         (loop for hash in hashes
               do (maphash (lambda (k v)
                             (let (a)

シンボル名が間違っているようです。これを行わなくても、*Message*バッファや、*Scratch*バッファでanythingインターフェースは表示されます。init.elでは表示できずにエラーが表示されます。

設定

以下の設定を加えます。

;;; yasnippet,yasnippetをanythingと連携する
;;
;; https://github.com/capitaomorte/yasnippet
;; (auto-install-from-url "http://svn.coderepos.org/share/lang/elisp/anything-c-yasnippet/anything-c-yasnippet.el")
;; http://d.hatena.ne.jp/t9md/20100518/1274149413
;; https://gist.github.com/711583

(add-to-list 'load-path "~/.emacs.d/plugin/yasnippet")
(require 'yasnippet)
(require 'anything-c-yasnippet)

;; スペース区切りで絞り込めるようにする デフォルトは nil
(setq anything-c-yas-space-match-any-greedy t)

;; anythingインターフェースの呼び出し
(global-set-key (kbd "C-c y") 'anything-c-yas-complete)

;; yas/new-snippet などの「Writing Snippets」で記述されているようなコマンド群を使うことができる・・・らしい
(setq yas/root-directory "~/.emacs.d/plugin/yasnippet/snippets")

(yas/initialize)

;;snippetsのディレクトリを指定
(yas/load-directory yas/root-directory)
;; yas/root-directoryがリストの場合 mapc
;;(mapc 'yas/load-directory yas/root-directory)

コメントやリテラルではスニペットを展開しないといった設定もありましたが、そのままでも展開されませんでした。また、flymakeは使っていないのでいつか使い始めたら設定したいと思います。。

実行

スニペットの展開方法を下記に示します。

  • スニペットの定義名を入力後、Tabを押下する
  • M-x yas/insert-snippetを入力し、スニペットを選択する
  • C-c y(または M-x anything-c-yas-complete)を入力し、スニペットを選択する

2番目の方法は、候補の選択がめんどうです。3番目の方法は、anythingインターフェースなのでとても選択しやすいです。

phpのスニペットはなかったので、話題のyasnippetのphp-modeをインストールしてみた - 大阪 本町で働くソーシャルアプリ開発者 ダイアリーを参考に、スニペットをダウンロードしました。Javascriptは見つからないので、Yet Another Snippet extension 日本語訳を見ながら自分で作っていこうと思います。

参考