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

計算物理屋の研究備忘録

Linux, Cygwin, Mac, zsh, emacs等の使い方、設定などのメモ

Emacsでyasnippetを使う

Emacs

yasnippet

github.com

定型文を貼り付けてさらにカーソル移動までしてくれる。Emacsに入れておくと便利。
helmと連携させて使うことにする。

インストール

package.elを使ってMELPAとかからインストールするだけ。helmと連携させて使う場合はhelm-c-yasnippetもインストールする。

設定

ここを参考にする。
helm-c-yasnippet.el : 最強テンプレートシステムYasnippetを絞り込んで展開・編集などを行う

Emacs の環境設定(2) - はまったり、はまらなかったりする日記

init.el

(require 'yasnippet)
(setq yas-snippet-dirs
      '("~/.dotfiles/.emacs.d/mysnippets"  ;; 自作スニペット
        yas-installed-snippets-dir         ;; package に最初から含まれるスニペット
        ))
(require 'helm-c-yasnippet)
(setq helm-yas-space-match-any-greedy t)
(global-set-key (kbd "C-c y") 'helm-yas-complete)
(push '("emacs.+/snippets/" . snippet-mode) auto-mode-alist)
(yas-global-mode 1)

setq yas-snippet-dirsで指定したディレクトリの最初のところにyas-new-snippetで作成したスニペットが保存される。デフォルトで登録されているスニペットを使う場合はyas-installed-snippets-dirもちゃんと2番めに書いておかないといけない。

C-c yでhelmが起動してスニペットを絞り込むことができる。

——– 2017年2月14日追記 ———-

使い方

登録されているスニペットkeyを打ち込んでtabを押すとそのスニペットが貼り付けられる。

keyを忘れた場合はC-c yと打って、helmで絞り込み

スニペット作成

ここを参考にする

fukuyama.co

python用のスニペットを作成してみる。

  • まずpythonモードでemacsを起動する必要があるので、適当なpythonファイルを開く
  • デフォルトではC-x i nで新規スニペット作成できるが、キーバインドが他に奪われてできなかったのでM-x yas-new-snippetで作成画面へ

下記のように入力

# -*- mode: snippet -*-
# name: shebang
# key: shebang
# --
#!/usr/bin/env python
# -*- coding: utf-8 -*-

$0

nameスニペットの名前、keyはキーワードでこの場合、shebangとタイプしてタブを押すとこのスニペットが展開される。nameとkeyは同じにしてある。

この他にもbindingが登録できるがキーバインディングが奪われるので使わない。

$0スニペット貼り付け後のカーソル位置の指定

書き終えたら

  • C-c C-cで作成。Choose or enter a table (yas guesses python-mode):と聞いてくるのでそのままエンター。
  • [yas] Looks like a library or new snippet. Save to new file? (y or n)と聞いてくるのでyをタイプ。
  • Guessed directory (/xxxxxxxxx/.emacs.d/mysnippets/python-mode) for table "python-mode" does not exist! Create? (y or n)と聞いてくるのでディレクトリを作ってもらう。yを押してエンター

これで登録された。pythonモードでshebangと打ってタブを打てば

#!/usr/bin/env python
# -*- coding: utf-8 -*-

■<-- ここにカーソル

こんな感じで挿入されて、1行空いたところにカーソルが来る。

もう少しカーソル位置を制御する

こんな感じでスニペットを作成する。pythonのpickle.dumpするときのテンプレ。

# -*- mode: snippet -*-
# name: pickledump
# key: pickledump
# --
with open('${1:filename}', 'wb') as f:
    pickle.dump(${2:data_to_save}, f, protocol=2)
  • 基本的には$1, $2の順番にカーソルが移動する
  • ${1:test}みたいに書けば初期値を指定できる。タブキーでそのまま初期値を残して次へ行くこともできるし、C-dをタイプすれば削除して次に行く。単純に上書きしたいならそのままタイプして、タブで次に行けば良い
  • $0スニペット貼り付け後に行くカーソル位置を指定するのは同じ。今回のように省略するとスニペットの最後にカーソルが行く。