ポクポク

ポクッとしてツナッ

flymakeのロードパスにlocal::lib追加したりする

久々にPerl書こうとしてcarton使ったらEmacsでflymakeとperl-completion.elがうまく動かなかったので困った。cartonというか、loca::lib? でいれたやつがロードパスに含まれなくてハマってた。

カレントディレクトリから登って行って"local/lib/perl5/"みたいなパスがあればロードパスに足すようにした。elisp、単純に親ディレクトリのパス取るfunctionとか無くて、file-name-directorydirectory-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使いまくりで必要性高そうなイメージがある。

こういうのとかでPerlに対する恐怖高まってるし、来年死んでるかもしれない。