Subscribed unsubscribe Subscribe Subscribe

Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

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日)

おしまい

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