久々にPerl書こうとしてcarton使ったらEmacsでflymakeとperl-completion.elがうまく動かなかったので困った。cartonというか、loca::lib? でいれたやつがロードパスに含まれなくてハマってた。
カレントディレクトリから登って行って"local/lib/perl5/"みたいなパスがあればロードパスに足すようにした。elisp、単純に親ディレクトリのパス取るfunctionとか無くて、file-name-directory
とdirectory-file-name
を交互に使っていく感じになってて渋い。
flymakeは期待する感じに動いた。perl-completion.elはしばらく試行錯誤してもむりだった。plcmp-additional-PERL5LIB-directories
に追加してもうまく動かない、Perl力低すぎて諦めた。
他の人どうやってるのかと思ってdotfiles見たけどコメントアウトしてる人多かった。ちゃんと動くときはかなり良いのに、参照できないmoduleをuseしてるとブロックしまくって3文字打つたびに3秒待つみたいな感じになってつらい。deferred版ほしい。
(defun my:find-climb-up (filename &optional current-dir) (setq current-dir (or current-dir (file-name-directory(buffer-file-name)))) (if (string= current-dir (directory-file-name current-dir)) nil (let ((filepath (concat current-dir filename))) (if (file-exists-p filepath) filepath (my:find-climb-up filename (file-name-directory (directory-file-name current-dir)))) ))) ;; よくある感じのflymake-perlの設定にlocal/lib/perl5/を追加 (defadvice flymake-perl-init (after add-carton-inc-flymake-advice activate) (let ((lib-dir (my:find-climb-up "local/lib/perl5/"))) (if (stringp lib-dir) (setf (nth 1 ad-return-value) (pushnew (format "%s%s" "-I" lib-dir) (nth 1 ad-return-value)))) )) ;; perl-completionこれじゃうまくうごかない (add-hook 'perl-completion-mode-hook (lambda () (add-to-list 'plcmp-additional-PERL5LIB-directories (my:find-climb-up "local/lib/perl5/")) (add-to-list 'plcmp-additional-PERL5LIB-directories (my:find-climb-up "lib/"))) )
そもそもあんまりcarton使ってる人いないんでしょうか、RubyでGemfileあると安心するしPerlのほうがライブラリの粒度小さくてCPAN使いまくりで必要性高そうなイメージがある。