Hatena::Groupsubtech

subpop

2007-09-17

EmacsでPerlのモジュール名を補完する

15:09 | EmacsでPerlのモジュール名を補完する - subpop を含むブックマーク はてなブックマーク - EmacsでPerlのモジュール名を補完する - subpop EmacsでPerlのモジュール名を補完する - subpop のブックマークコメント

EmacsPerlモジュール名を補完するにはどうしたらいいのか。いい方法も思いつかないので、とりあえずこんな感じでやってみた。あほくさいけど……。

cperl-mode初回起動時に……

  1. @INC内のpackage名を全てぶっこぬく
  2. それらの名前を適当な名前で作成したバッファにつっこむ
  3. dabbrevの対象になってウマー

以下の通り@INC内を総ざらいしているので、cperl-mode初回起動時はちょっと時間がかかる。もっといい方法があれば教えてくだしあ><ノ

また、「とりあえず暇だったし何となく始めたブログ - 複数候補を選択して補完できる動的略語展開 dabbrev-expand-multiple」で公開されている、dabbrev-expand-multipleと併用するのがよいかも。

あんまりよくわからない感じだけど、↓一応デモってみた。

;; cperl-mode初回起動時に、モジュール名を全て詰め込んだバッファを作成し、
;; dabbrevでモジュール名を補完できるようにする。
(add-hook 'cperl-mode-hook
          (lambda ()
            (let ((buffer nil) (buffer-name "*PerlModules*"))
              (unless (get-buffer buffer-name)
                (setq buffer (generate-new-buffer buffer-name))
                (save-current-buffer
                  (shell-command
                   "find `perl -e 'print join(q{ }, @INC);'` -name '*.pm' -type f | xargs egrep -h -o 'package [a-zA-Z0-9:]+;' | perl -nle 's/package\s+(.+);/$1/; print' | sort | uniq"
                   buffer)
                  (set-buffer buffer)
                  (delete-window))))))

ちなみに、dabbrevの設定で↓こんな感じ(詳しくはヘルプで)にしとかないと、モジュール名の::が補完対象から無視されるので、あんまり面白くない。

(setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_\\|[:-_]")

EmacsでPerlのuse文を挿入

02:08 | EmacsでPerlのuse文を挿入 - subpop を含むブックマーク はてなブックマーク - EmacsでPerlのuse文を挿入 - subpop EmacsでPerlのuse文を挿入 - subpop のブックマークコメント

elisp練習第2弾。「subtech - Pink Blossom Diary - vim で perl の use 文を挿入」を、Emacsでやってみた。機能はid:secondlifeのと同じなので、動作イメージは↓を参照のこと(自分でも撮ってみたけど、ttyshare上で再生するとなんか変になった><)。

モジュール名の最後の文字の次のポイントでC-c C-mを入力すると、useなんちゃらがある場合はその最後に、ない場合はバッファの一番最初のなにもない行にuse文を挿入する。

;; キーバインドは、とりあえずC-c C-mで。
(add-hook 'cperl-mode-hook
          (lambda ()
            (local-set-key (kbd "\C-c \C-m") 'perl-insert-use-statement)))

(defun perl-insert-use-statement (current-point)
  "use statement auto-insertion."
  (interactive "d")
  (insert-use-statement
   (detect-module-name current-point)
   (detect-insert-point)))

(defun insert-use-statement (module-name insert-point)
  (save-excursion
    (goto-char insert-point)
    (insert (concat "\nuse " module-name ";\n"))))

(defun detect-insert-point ()
  (save-excursion
    (if (re-search-backward "use .+;" 1 t)
        (match-end 0)
      (progn
        (string-match "^$" (buffer-string))
        (match-end 0)))))

(defun detect-module-name (current-point)
  (let ((str (save-excursion
               (buffer-substring
                current-point
                (progn (beginning-of-line) (point))))))
    (if (string-match "\\([[:alnum:]-_:]+\\)$" str)
        (match-string 1 str)
      (error "Module name not found"))))

AmiraAmira2012/03/24 10:22It's really great that people are sharing this informatoin.

kuekhyhkwpkuekhyhkwp2012/03/26 00:18ccJR2z , [url=http://tvhzombnmdef.com/]tvhzombnmdef[/url], [link=http://duzaqywqlzpt.com/]duzaqywqlzpt[/link], http://uatfbhkeektl.com/