From: Koji Arai Date: 2003-04-12T16:03:37+09:00 Subject: [ruby-list:37554] refe.el (Re: ReFe 0.7 (Re: ReFe 0.6)) 新井です。 In message "[ruby-list:37551] Re: ReFe 0.7 (Re: ReFe 0.6)" on 11 Apr 2003 20:38:39 +0900, Kazuhiro NISHIYAMA wrote: > 西山和広です。 > [ruby-list:37547]の方の話ですが、今だとKernel#Arrayのような > クラス名と同名のメソッドがひけないみたいです。 refe と同様 Kernel#Array とすれば出ますね。 > Net::HTTP#get > Net::HTTP.get > Net::HTTP.get_print > もgetがひけませんでした。 これらは、--- で始まらない説明が出るために前提が崩れますね。 ":" 始まりも許せばいいのでしょうけど。 [ruby-list:37547] を実装しました。例によって即興です。 -- 新井康司 (Koji Arai) (defvar refe-program-name (if (featurep 'meadow) "ruby" "refe")) (defvar refe-program-args (if (featurep 'meadow) '("-S" "refe") nil)) (defvar refe-buffer-name "*Refe*") (defvar refe-completion-table nil) (defun refe-call-process (buf &rest args) (let ((coding-system-for-read 'euc-japan)) (apply 'call-process refe-program-name nil buf nil (append refe-program-args args)))) (defun refe-make-completion-table () (setq refe-completion-table (make-vector 547 0)) (with-temp-buffer (refe-call-process t) (goto-char (point-min)) (while (looking-at "^[A-Z][A-Za-z_0-9:]*") (intern (match-string 0) refe-completion-table) (forward-line))) (with-temp-buffer (refe-call-process t "*") (goto-char (point-min)) (while (looking-at "^[A-Z][A-Za-z_0-9:]*[#.]\\(.*\\)") (intern (match-string 1) refe-completion-table) (intern (match-string 0) refe-completion-table) (forward-line))) nil) (refe-make-completion-table) (defun refe-get-word-at-point () (save-excursion (while (looking-at "\\sw\\|\\s_") (forward-char 1)) (if (or (re-search-backward "\\sw\\|\\s_" (save-excursion (beginning-of-line) (point)) t) (re-search-forward "\\(\\sw\\|\\s_\\)+" (save-excursion (end-of-line) (point)) t)) (progn (goto-char (match-end 0)) (buffer-substring (point) (progn (forward-sexp -1) (while (looking-at "\\s'") (forward-char 1)) (point)))) nil))) (defun refe () (interactive) (let* ((default (refe-get-word-at-point)) (completion-ignore-case t) (word (completing-read (if default (format "Class or Method (default %s): " default) "Class or Method: ") refe-completion-table nil nil nil nil default)) (buf (or (get-buffer refe-buffer-name) (generate-new-buffer refe-buffer-name))) (pop-up-windows t) (pop-up-frames nil)) (set-buffer buf) (setq buffer-read-only nil) (erase-buffer) (refe-call-process buf word) (goto-char (point-min)) (if (re-search-forward "^---" nil t) nil (let ((klass-table (make-vector 17 0)) (completion-ignore-case t) klass) (goto-char (point-min)) (while (looking-at "^\\([A-Z][A-Za-z_0-9:]*\\)[#.]") (intern (match-string 1) klass-table) (forward-line)) (if (= (point) (point-min)) nil ; (message "no such class or method: %s" word) (setq klass (completing-read "Class: " klass-table nil nil nil nil nil)) (erase-buffer) (refe-call-process buf klass word)))) (set-buffer-modified-p nil) (setq buffer-read-only t) (goto-char (point-min)) (display-buffer buf)))