emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 27f5627 2/4: New command ruby-find-library-file


From: Dmitry Gutov
Subject: [Emacs-diffs] master 27f5627 2/4: New command ruby-find-library-file
Date: Thu, 30 May 2019 13:29:40 -0400 (EDT)

branch: master
commit 27f5627104a073762c3b1d21e55822ec2d2e0347
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>

    New command ruby-find-library-file
    
    * lisp/progmodes/ruby-mode.el (ruby-find-library-file):
    New command.
    (ruby-mode-map): Add binding for it.
---
 etc/NEWS                    |  2 ++
 lisp/progmodes/ruby-mode.el | 23 +++++++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/etc/NEWS b/etc/NEWS
index a2306c0..5cce76f 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -733,6 +733,8 @@ it can't find the config file.
 
 *** Rubocop is called with 'bundle exec' if Gemfile mentions it.
 
+*** New command 'ruby-find-library-file' bound to 'C-c C-f'.
+
 ** Package
 
 *** Change of 'package-check-signature' for packages with multiple sigs
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 4fceda8..80e809b 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -155,6 +155,7 @@ This should only be called after matching against 
`ruby-here-doc-beg-re'."
     (define-key map (kbd "M-C-n") 'ruby-end-of-block)
     (define-key map (kbd "C-c {") 'ruby-toggle-block)
     (define-key map (kbd "C-c '") 'ruby-toggle-string-quotes)
+    (define-key map (kbd "C-c C-f") 'ruby-find-library-file)
     map)
   "Keymap used in Ruby mode.")
 
@@ -1802,6 +1803,28 @@ If the result is do-end block, it will always be 
multiline."
          (format "%s%s%s" string-quote content string-quote))
         (goto-char orig-point)))))
 
+(defun ruby-find-library-file (&optional feature-name)
+  "Visit a library file denoted by FEATURE-NAME.
+FEATURE-NAME is a relative file name, file extension is optional.
+This commands delegates to 'gem which', which searches both
+installed gems and the standard library.  When called
+interactively, defaults to the feature name in the 'require'
+statement around point."
+  (interactive)
+  (unless feature-name
+    (let ((init (save-excursion
+                  (forward-line 0)
+                  (when (looking-at "require [\"']\\(.?*\\)[\"']")
+                    (match-string 1)))))
+      (setq feature-name (read-string "Feature name: " init))))
+  (let ((out
+         (substring
+          (shell-command-to-string (concat "gem which " feature-name))
+          0 -1)))
+    (if (string-match-p "\\`ERROR" out)
+        (user-error "%s" out)
+      (find-file out))))
+
 (eval-and-compile
   (defconst ruby-percent-literal-beg-re
     "\\(%\\)[qQrswWxIi]?\\([[:punct:]]\\)"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]