日記はScrapboxに移動しました。

Kansai.pm 第10回ミーティングで発表してきたお

Kansai.pmの第10会ミーティングで、「EmacsPerlプログラミングする上で必須な設定」というタイトルでお話してきました。初トーク!!1しかし結果は……という感じでしたが、ともあれ楽しかった。参加されたみなさま、どうもありがとうございました & お疲れさまでした!!1また次回もよろしくお願いします!!1

以下、発表資料です。

EmacsPerlプログラミングする上で必須な設定

  1. 自己紹介
  2. いろいろツール紹介
  3. まとめ

自己紹介

Perler活動

Emacsの設定

  • Emacsを使うこと自体において必須な設定ってのはたくさんあるけど……
  • キリがないので、Perlプログラミングをする上で必須、というものに絞って紹介

Ack

  • grepの代替を目指しているツール
    • Ack is designed as a replacement for 99% of the uses of grep
  • 拡張子によってファイルタイプを判別していい感じに検索
    • バックアップファイルや.svnやblib等を除外して検索
  • 詳細はperldoc ackで

Ackデモ

  • 適当に検索してみるよ

AckをEmacsから使う

  • App::Ackをcpanでインストール
  • .emacsに以下の設定を追加
    • grep-find-commandをackでおきかえているだけ
  • M-x ackで実行
(defun ack ()
(interactive)
(let ((grep-find-command "ack --nocolor --nogroup "))
(call-interactively 'grep-find)))

color-moccur

  • http://www.bookshelf.jp/soft/meadow_50.html#SEC736
  • 単に検索するだけならackが速いし素敵なんだけど
  • color-moccurを使うといろいろできる
    • moccur: ファイルバッファのみを検索
    • dmoccur: 指定したディレクトリ下のファイルを検索
    • moccur-grep: grep のようにファイルを検索
    • moccur-grep-find: grep + find のようにファイルを検索
    • search-buffers: すべてのバッファを全文検索
    • grep-buffers: 開いているファイルを対象に grep

moccur-editのデモ

  • MoCoをPoCoに変更したい!!1

color-moccur/moccur-editの設定

  • なんかいろいろオプションあるけど、これだけしか設定してない。
(require 'color-moccur)
(require 'moccur-edit)
;; ~, .svnを無視
(setq dmoccur-exclusion-mask
(append '("\\~$" "\\.svn\\/\*") dmoccur-exclusion-mask))

flymake

  • 動的にシンタックスチェックを行うツール
    • Perlだけでなく、汎用のシンタックスチェックツール
  • Emacs22から標準添付
  • すぐにミスがわかるので、typoでハマったりすることが減る

flymakeデモ

  • なんか適当に書いてみるよ

flymakeの設定

(require 'flymake)
;; set-perl5lib
;; 開いたスクリプトのパスに応じて、PERL5LIBにlibを追加してくれる
;; http://svn.coderepos.org/share/lang/elisp/set-perl5lib/set-perl5lib.el
(require 'set-perl5lib)
;; エラー、ウォーニング時のフェイス
(set-face-background 'flymake-errline "red4")
(set-face-foreground 'flymake-errline "black")
(set-face-background 'flymake-warnline "yellow")
(set-face-foreground 'flymake-warnline "black")
;; エラーをミニバッファに表示
;; http://d.hatena.ne.jp/xcezx/20080314/1205475020
(defun flymake-display-err-minibuf ()
"Displays the error/warning for the current line in the minibuffer"
(interactive)
(let** ((line-no             (flymake-current-line-no))
(line-err-info-list  (nth 0 (flymake-find-err-info flymake-err-info line-no)))
(count               (length line-err-info-list)))
(while (> count 0)
(when line-err-info-list
(let** ((file       (flymake-ler-file (nth (1- count) line-err-info-list)))
(full-file  (flymake-ler-full-file (nth (1- count) line-err-info-list)))
(text (flymake-ler-text (nth (1- count) line-err-info-list)))
(line       (flymake-ler-line (nth (1- count) line-err-info-list))))
(message "[%s] %s" line text)))
(setq count (1- count)))))
;; Perl用設定
;; http://unknownplace.org/memo/2007/12/21#e001
(defvar flymake-perl-err-line-patterns
'(("\\(.*\\) at \\([^ \n]+\\) line \\([0-9]+\\)[,.\n]" 2 3 nil 1)))
(defconst flymake-allowed-perl-file-name-masks
'(("\\.pl$" flymake-perl-init)
("\\.pm$" flymake-perl-init)
("\\.t$" flymake-perl-init)))
(defun flymake-perl-init ()
(let** ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list "perl" (list "-wc" local-file))))
(defun flymake-perl-load ()
(interactive)
(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
(setq flymake-check-was-interrupted t))
(ad-activate 'flymake-post-syntax-check)
(setq flymake-allowed-file-name-masks (append flymake-allowed-file-name-masks flymake-allowed-perl-file-name-masks))
(setq flymake-err-line-patterns flymake-perl-err-line-patterns)
(set-perl5lib)
(flymake-mode t))
(add-hook 'cperl-mode-hook 'flymake-perl-load)

perly-sense

  • http://search.cpan.org/dist/Devel-PerlySense/
  • EmacsPerl IDEにすることを目論んでいるらしい
    • IntelliSenseとかよく知りませんが
  • よく使う機能
    • クラスのOverviewを見る
    • useしているモジュールへ移動
    • 親クラスへ移動
    • テストファイル実行

perly-senseのデモ

  • overview
    • ブックマークも出るよ
    • 重いのであんま使わない
  • モジュールへ移動
  • テストファイル実行

perly-senseを使ってみる

  • 設定はドキュメントの通り
  • まずはperly_senseコマンドで準備。
    • .PerlySenseProjectディレクトリが作成される
    • 必要ならば、その中のproject.ymlを編集
$ perly_sense create_project MyProject

.PerlySenseProject/project.ymlの、重要なポイント

  • @INCに含めたいパスを指定
    • 外部モジュールを利用してる時に便利
project:
moniker: 'The Project Without a Name'
inc_dir:
- modules/foo/lib
- modules/bar/lib
  • メモを書く書式を設定しておくと、overviewに一覧される
bookmark:
-
moniker: Todo
rex:
- qr/\# \s** TODO \s** : \s** (.+?) \s*$/x
  • “–nocolor”オプションをつけておかないと、Emacs内でテストファイルを実行した後の結果がおかしくなる。
run_file:
-
command: "prove -v ${INC} --nocolor \"${SOURCE_FILE}\""
moniker: Test
rex: \.t$
run_from: source_root_directory

perly-senseの設定

  • 設定長い。後でブログに張っておくのでそちらで。
  • 詳しくは、ドキュメントを参照のこと。
(setq ps/key-prefix "\C-c\C-c")
;; perly-sense-flymake
;; flymakeは自分で設定する
(setq ps/load-flymake nil)
;; load perly-sense
(setq ps/external-dir (shell-command-to-string "perly_sense external_dir"))
(if (string-match "Devel.PerlySense.external" ps/external-dir)
(progn
(message
"PerlySense elisp files  at (%s) according to perly_sense, loading..."
ps/external-dir)
(setq load-path (cons
(expand-file-name
(format "%s/%s" ps/external-dir "emacs")
) load-path))
(load "perly-sense")
)
(message "Could not identify PerlySense install dir.
    Is Devel::PerlySense installed properly?
    Does 'perly_sense external_dir' give you a proper directory? (%s)" ps/external-dir))

perl-completion

  • id:IMAKADOさん作
  • anything.elを利用して、Perlプログラミングに必要なあれこれを絞り込み
  • ってか、anything.elって何?
    • Emacs界のPlaggerのようなもの
      1. リストで入力されたものを
      2. 絞り込みをかけて
      3. いろんな形式でもって出力
    • 最近、メンテナがRuby/Emacs界で有名な日本人id:rubikitchさんに移管されたので、期待!!1

perl-completionでできること

  • 組み込み変数/関数の補完入力
  • モジュールの補完入力
  • それらのドキュメント閲覧
  • 他にもなんかあるかも

perl-completionデモ

  • 関数/変数補完
  • モジュール補完
  • 補完画面での動作

perl-completionの設定

  • 設定については後で(ry
(setq plcmp-buffer-dabbrev-expansions-number 0)
(add-hook 'cperl-mode-hook
(lambda ()
(require 'perl-completion)
(perl-completion-mode t)
(define-key plcmp-mode-map "\C-\M-f" 'plcmp-builtin-function-complete)
(define-key plcmp-mode-map "\C-\M-v" 'plcmp-builtin-variables-complete)
(define-key plcmp-mode-map "\C-\M-u" 'plcmp-installed-modules-complete)
(define-key plcmp-mode-map "\C-\M-s" 'plcmp-search-word-at-point)
(define-key plcmp-mode-map "\C-\M-c" 'plcmp-clear-all-cache)))

まとめ

We are Hiring!

  • インターン2回目: 2008年9月1日〜9月26日(平日のみ。全18日)

おしまい

  • ご清聴ありがとうございました。

1 comment

  1. 大変ためになりました。flymakeの設定で、let* が let** になっていて、ここだけ修正したらうまくいきました。

Leave a Reply

Your email address will not be published. Required fields are marked *