2007-09-17
EmacsでPerlのモジュール名を補完する
EmacsでPerlのモジュール名を補完するにはどうしたらいいのか。いい方法も思いつかないので、とりあえずこんな感じでやってみた。あほくさいけど……。
cperl-mode初回起動時に……
以下の通り@INC内を総ざらいしているので、cperl-mode初回起動時はちょっと時間がかかる。もっといい方法があれば教えてくだしあ><ノ
また、「とりあえず暇だったし何となく始めたブログ - 複数候補を選択して補完できる動的略語展開 dabbrev-expand-multiple」で公開されている、dabbrev-expand-multipleと併用するのがよいかも。
あんまりよくわからない感じだけど、↓一応デモってみた。
- Demonstration of Perl Module Names Completion and "use statement" Auto-Insertion on Emacs - TTYShare
;; 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文を挿入
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"))))
Amira2012/03/24 10:22It's really great that people are sharing this informatoin.
kuekhyhkwp2012/03/26 00:18ccJR2z , [url=http://tvhzombnmdef.com/]tvhzombnmdef[/url], [link=http://duzaqywqlzpt.com/]duzaqywqlzpt[/link], http://uatfbhkeektl.com/