perlのyasnippetを設定した

今更ながら設定した。
マジ便利!!

;; ~/.emacs.d/conf/00-yasnippet.el
(require 'cl)
;; 問い合わせを簡略化 yes/no を y/n
(fset 'yes-or-no-p 'y-or-n-p)

(require 'yasnippet)
;; ~/.emacs.d/にsnippetsというフォルダを作っておきましょう
(setq yas-snippet-dirs
      '("~/.emacs.d/snippets" ;; 作成するスニペットはここに入る
        ))
(yas-global-mode 1)

;; http://shibayu36.hatenablog.com/entry/2012/12/18/224535
;; lib/Sample/Package.pmとかだと、Sample::Packageとかを展開してくれる
(defun yas/perl-package-name ()
  (let ((file-path (file-name-sans-extension (buffer-file-name))))
    (if (string-match "lib/" file-path)
        (replace-regexp-in-string "/" "::"
                                  (car (last (split-string file-path "/lib/"))))
        (file-name-nondirectory file-path))))

(custom-set-variables '(yas-trigger-key "TAB"))

;; 既存スニペットを挿入する
(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)

これでスニペットが有効になった。
emacs.d/snippets/cperl-mode/以下に、key名でファイルを作成する。
登録したものの例は以下。

package用snippet

# -*- mode: snippet -*-
# key: package
# name: package
# binding: C-c C-c C-p
# --
package ${1:`(yas/perl-package-name)`};
use strict;
use warnings;

$0

1;

Test::More

# -*- mode: snippet; require-final-newline: nil -*-
# name: perl test
# key: test
# binding: direct-keybinding
# --
use strict;
use warnings;
use utf8;
use Test::More;
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

done_testing;

Amon2のテスト

# -*- mode: snippet; require-final-newline: nil -*-
# name: Amon2 T::W::M::PSGI test
# key: amon2-mech
# binding: direct-keybinding
# --
use strict;
use warnings;
use utf8;
use Plack::Test;
use Plack::Util;
use Test::More;
use Test::Requires 'Test::WWW::Mechanize::PSGI';
use t::Util;
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

my $app = Plack::Util::load_psgi 'script/mdplayer-server';
my $mech = Test::WWW::Mechanize::PSGI->new(app => $app);

done_testing;

参考
http://fukuyama.co/yasnippet http://shibayu36.hatenablog.com/entry/2012/12/18/224535