From bcb38bb3fb4b50bce6e6cbc5539aba64f37b0db1 Mon Sep 17 00:00:00 2001 From: Dmitry Galinsky Date: Tue, 3 Mar 2009 01:51:44 +0300 Subject: [PATCH] Make the apidock search more faster. --- bundles/rails-apidock-bundle.el | 41 ++++++++++++++++++++------ bundles/rails-apidock-bundle/search.rb | 20 +++++++++---- rails-resources.el | 2 +- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/bundles/rails-apidock-bundle.el b/bundles/rails-apidock-bundle.el index cd74a99..ded3249 100644 --- a/bundles/rails-apidock-bundle.el +++ b/bundles/rails-apidock-bundle.el @@ -1,20 +1,43 @@ +(defconst rails/apidock-bundle/buffer-name "*rails-apidock-bundle*") (defconst rails/apidock-bundle/script-file-name "bundles/rails-apidock-bundle/search.rb") +(defun rails/apidock-bundle/get-proc () + (let ((proc (get-buffer-process rails/apidock-bundle/buffer-name))) + (unless proc + (setq + proc + (start-process rails/apidock-bundle/buffer-name + rails/apidock-bundle/buffer-name + rails/ruby/command + (rails/apidock-bundle/locate-script))) + (set-process-query-on-exit-flag proc nil)) + proc)) + +(defun rails/apidock-bundle/get-result (mod query) + (let ((proc (rails/apidock-bundle/get-proc))) + (with-current-buffer rails/apidock-bundle/buffer-name + (kill-region (point-min) (point-max)) + (process-send-string proc (format "%s %s\n" mod query)) + (while + (progn + (sleep-for 0 100) + (goto-char (point-max)) + (goto-char (point-at-bol 0)) + (not (string= "APIDOCK_EOF" + (buffer-substring (line-beginning-position) + (line-end-position)))))) + (read (buffer-substring-no-properties (point-min) + (point)))))) + (defun rails/apidock-bundle/locate-script () (let* ((path (file-name-directory (locate-library "rails-reloaded"))) (script (concat path rails/apidock-bundle/script-file-name))) (when (file-exists-p script) script))) -(defun rails/apidock-bundle/search (q &optional mod) - (let* ((mod (or mod "rails")) - (result (shell-command-to-string - (format "ruby %s %s %s" - (rails/apidock-bundle/locate-script) - mod - q)))) - (unless (string-ext/empty-p result) - (read result)))) +(defun rails/apidock-bundle/search (query &optional mod) + (let ((mod (or mod "rails"))) + (rails/apidock-bundle/get-result mod query))) (rails/defbundle "Apidock" (:triggers diff --git a/bundles/rails-apidock-bundle/search.rb b/bundles/rails-apidock-bundle/search.rb index 08b06f8..e0058b7 100755 --- a/bundles/rails-apidock-bundle/search.rb +++ b/bundles/rails-apidock-bundle/search.rb @@ -3,9 +3,11 @@ require 'rubygems' require 'activesupport' +LIMIT = 12 + def create_data(data_file, file) result = [] - File.open(file, "rb") do |f| + File.open(file, "r") do |f| str = f.read keywords,data = str.split(";") data.gsub!(/^[^=]+= /, "") @@ -21,7 +23,7 @@ def create_data(data_file, file) result << i end end - File.open(data_file, "wb") do |f| + File.open(data_file, "w") do |f| f.write Marshal.dump(result) end end @@ -47,7 +49,7 @@ def search(mod, str) return if result.empty? result = result.sort_by{ |a| a[:score] }.reverse - to_lisp(mod, result) + to_lisp(mod, result[0..LIMIT]) end def to_lisp(mod, data) @@ -79,6 +81,12 @@ def to_lisp(mod, data) "(" + result.join("\n") + ")" end -mod = ARGV.size > 1 ? ARGV.first : "rails" -q = ARGV.last -puts search(mod, q) if q +STDOUT.flush +loop do + line = STDIN.gets + mod, q = /(\w+)(.*)$/.match(line)[1..2] + q.strip! + puts search(mod, q) unless q.blank? + puts "APIDOCK_EOF" + STDOUT.flush +end diff --git a/rails-resources.el b/rails-resources.el index 6377eaf..2917a3b 100644 --- a/rails-resources.el +++ b/rails-resources.el @@ -310,7 +310,7 @@ ;;; --------------------------------------------------------- ;;; - Menu functions -;;; +;;; TODO: remove bellow after the toggle refactoring. (defun rails/resources/items-to-menu (menu items &optional name-func) (let ((menu menu))