最近なにやら .emacs の perl の設定を晒してる人が多いので僕の晒しておくことにする。っといっても自分でゼロから書いた elisp はなくて、ほとんどが漁って拾って来た設定だったりします。ところどころ誰のを拾ったか書いてあったり、最近書かれてた設定に変えてあったりはするんですが、それは愛嬌ってことで。
;;; ================================================================ ;;;
;;; Perl Programming Settings ;;;
;;; ================================================================ ;;;
(autoload 'perl-mode "cperl-mode"
"alternate mode for editing Perl programs" t)
(setq cperl-auto-newline t)
(setq cperl-indent-parens-as-block t)
(setq cperl-close-paren-offset -4)
(setq cperl-indent-level 4)
(setq cperl-label-offset -4)
(setq cperl-continued-statement-offset 4)
(setq cperl-highlight-variables-indiscriminately t)
(add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
(setq auto-mode-alist (cons '("\\.\\(p[lm]\\|f?cgi\\|t\\)$" . cperl-mode) auto-mode-alist))
(add-hook 'cperl-mode-hook
(lambda ()
(set-face-italic-p 'cperl-hash-face nil)
(global-set-key "\C-cp" 'cperl-check-syntax) ; Syntax Check
(global-set-key "\C-ct" 'perltidy-region) ; perltidy
(global-set-key "\C-c\C-t" 'perltidy-defun)
(global-set-key "\C-c\C-ct" 'perltidy-buffer)
(global-set-key "\M-p" 'cperl-perldoc) ; perldoc
(local-set-key "\C-c\C-m" 'cperl-view-module-src-at-point) ; perldoc -m
(global-set-key "\C-c\C-cc" 'perl-eval) ; リージョンを実行
(local-set-key "\C-c\C-cp" 'cperl-prove) ; テストを実行
(require 'perlplus)
(define-key cperl-mode-map "\M-," 'perlplus-complete-symbol) ; 関数&シンボル補完
(perlplus-setup)
(require 'perl-debug)
(perl-debug-set-coding-system)
(define-key cperl-mode-map "\C-cd" 'perl-debug-lint)
(define-key cperl-mode-map "\C-c\C-d" 'perl-debug) ; デバッガの起動
(local-set-key "\C-j" (lambda () (interactive)(insert "->"))) ; powered by hiboma
(local-set-key "\M-j" (lambda () (interactive)(insert "=>")))
))
;;; Perl Debug の設定
(autoload 'perl-debug "perl-debug" nil t)
(autoload 'perl-debug-lint "perl-debug" nil t)
;;; perltidy-region powered by typester
(defun perltidy-region ()
"Run perltidy on the current region."
(interactive)
(save-excursion
(shell-command-on-region (point) (mark) "perltidy -q" nil t)))
(defun perltidy-defun ()
"Run perltidy on the current defun."
(interactive)
(save-excursion (mark-defun)
(perltidy-region)))
(defun perltidy-buffer ()
"Run perltidy on the current buffer."
(interactive)
(save-excursion (mark-whole-buffer)
(perltidy-region)))
;;; perldoc -m
(defun cperl-view-module-src-at-point (module)
"Visit perl module's source file"
(interactive
(list (let* ((default-entry (or (cperl-word-at-point) ""))
(input (read-string
(format "View perl module's source%s: "
(if (string= default-entry "")""
(format " (default %s)" default-entry))))))
(if (string= input "")
(if (string= default-entry "")
(error "No Perl module given")default-entry)input))))
(let ((file (substring (shell-command-to-string(concat "perldoc -m " module))0 -1)))
(if (string-match "No module found for" file)
(error file)
(view-file-other-window file)))
)
;;; テストを実行 by PBP
(defun cperl-prove ()
"Run the current test."
(interactive)
(save-excursion
(shell-command (concat "prove -vl "
(shell-quote-argument (buffer-file-name)))))
)
;;; リージョン内のコードを実行する by PBP
(defun perl-eval (beg end)
"Run selected region as Perl code"
(interactive "r")
(save-excursion
(shell-command-on-region beg end "perl"))
)
;;; mode-compile
(autoload 'mode-compile "mode-compile"
"Command to compile current buffer file based on the major mode" t)
(global-set-key "\C-cc" 'mode-compile)
;(global-set-key "\C-c\C-c" 'mode-compile)
(autoload 'mode-compile-kill "mode-compile"
"Command to kill a compilation launched by `mode-compile'" t)
(global-set-key "\C-ck" 'mode-compile-kill)
(global-set-key "\C-cn" 'next-error) ;; エラー箇所に飛ぶ
;;; 質問してこないように
(setq mode-compile-always-save-buffer-p t)
(setq mode-compile-never-edit-command-p t)
(setq mode-compile-expert-p t)
(setq mode-compile-reading-time 0)
;;; コンパイルウィンドウサイズ
(setq compilation-window-height 10)
コード書いている途中で実行する時は mode-compile で実行して確認とかしてます。今のところ特に不満点とかはないのですが、Hacker な人は関数補完とかしているのか気になります。
あとは今までまったく使っていないので動的略語展開(abbrev)とかを覚えたいなぁと。(出来る人達はこれで色々補完しているんだろうなぁって勝手に予想してるんですが)
キーバインドはも少し考える余地があるんだけど、面倒臭くて変更する気にならない。僕は\M より \C の方が押しやすい気がするのでほとんど \C になってるw
最近のコメント