Sublime Forum

SublimePeek - quick access to help for functions

#16

hi, sorry for the late answer but yesterday was holiday here in italy so i didn’t even turn the computer on :smile:
I’ve tried the dev version of the plugin and i must say the implementation of ruby docs really rules, i especially like how you managed to handle multiple occurence of a method.
Two things comes to my mind, the first is really easy, the second seems more like a problem that i hope you have a solution for :wink:
First: Would be useful to add this 2 flags to the ri command you’re invoking : --system and --gems so that more libraries are searched for docs (including ruby on rails)
The second is tricky: me, and most rubyst, use a tool called rvm (rvm.io/) which basically is a command line tool which allow to have different rubies (and libraries and gems) versions installed on your system, and to easily switch between them. The problem is that calling ri from sublimetext always call the system default ri, and not the one of rvm, so it basically find docs only for the system ruby and not for the current ruby one is using and also can’t find docs for all the gems installed with rvm. I hope i was able to explain myself :smile:

0 Likes

#17

two more little things:
i’ve replaced your css with the one generated by rdoc (pasted at the end of the post) and also the plugin seems to not recognize when no results are found, it basically show an empty window with the string searched

/*
 * "Darkfish" Rdoc CSS
 * $Id: rdoc.css 54 2009-01-27 01:09:48Z deveiant $
 *
 * Author: Michael Granger <ged@FaerieMUD.org>
 *
 */

/* Base Green is: #6C8C22 */

* { padding: 0; margin: 0; }

body {
  background: #efefef;
  font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif;
  margin-left: 40px;
}
body.file-popup {
  font-size: 90%;
  margin-left: 0;
}

h1 {
  font-size: 300%;
  text-shadow: rgba(135,145,135,0.65) 2px 2px 3px;
  color: #6C8C22;
}
h2,h3,h4 { margin-top: 1.5em; }

:link,
:visited {
  color: #6C8C22;
  text-decoration: none;
}
:link:hover,
:visited:hover {
  border-bottom: 1px dotted #6C8C22;
}

pre {
  background: #ddd;
  padding: 0.5em 0;
}

/* @group Generic Classes */

.initially-hidden {
  display: none;
}

#search-field {
  width: 98%;
  background: #eee;
  border: none;
  height: 1.5em;
  -webkit-border-radius: 4px;
}
#search-field:focus {
  background: #f1edba;
}
#search-field:-moz-placeholder,
#search-field::-webkit-input-placeholder {
  font-weight: bold;
  color: #666;
}

.missing-docs {
  font-size: 120%;
  background: white url(images/wrench_orange.png) no-repeat 4px center;
  color: #ccc;
  line-height: 2em;
  border: 1px solid #d00;
  opacity: 1;
  padding-left: 20px;
  text-indent: 24px;
  letter-spacing: 3px;
  font-weight: bold;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
}

.target-section {
  border: 2px solid #dcce90;
  border-left-width: 8px;
  padding: 0 1em;
  background: #fff3c2;
}

/* @end */

/* @group Index Page, Standalone file pages */
.indexpage ul {
  line-height: 160%;
  list-style: none;
}
.indexpage ul :link,
.indexpage ul :visited {
  font-size: 16px;
}

.indexpage li {
  padding-left: 20px;
}

.indexpage ul > li {
  background: url(images/bullet_black.png) no-repeat left 4px;
}
.indexpage li.method {
  background: url(images/plugin.png) no-repeat left 4px;
}
.indexpage li.module {
  background: url(images/package.png) no-repeat left 4px;
}
.indexpage li.class {
  background: url(images/ruby.png) no-repeat left 4px;
}
.indexpage li.file {
  background: url(images/page_white_text.png) no-repeat left 4px;
}
.indexpage li li {
  background: url(images/tag_blue.png) no-repeat left 4px;
}
.indexpage li .toc-toggle {
  width: 16px;
  height: 16px;
  background: url(images/add.png) no-repeat;
}

.indexpage li .toc-toggle.open {
  background: url(images/delete.png) no-repeat;
}

/* @end */

/* @group Top-Level Structure */

#metadata {
  float: left;
  width: 260px;
}

#documentation {
  margin: 2em 1em 5em 300px;
  min-width: 340px;
}

#validator-badges {
  clear: both;
  margin: 1em 1em 2em;
  font-size: smaller;
}

/* @end */

/* @group Metadata Section */
#metadata .section {
  background-color: #dedede;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  border: 1px solid #aaa;
  margin: 0 8px 8px;
  font-size: 90%;
  overflow: hidden;
}
#metadata h3.section-header {
  margin: 0;
  padding: 2px 8px;
  background: #ccc;
  color: #666;
  -moz-border-radius-topleft: 4px;
  -moz-border-radius-topright: 4px;
  -webkit-border-top-left-radius: 4px;
  -webkit-border-top-right-radius: 4px;
  border-bottom: 1px solid #aaa;
}
#metadata #home-section h3.section-header {
  border-bottom: 0;
}

#metadata ul,
#metadata dl,
#metadata p {
  padding:  8px;
  list-style: none;
}

#file-metadata {
  margin-top: 2em;
}

#file-metadata ul {
  padding-left: 28px;
  list-style-image: url(images/page_green.png);
}

dl.svninfo {
  color: #666;
  margin: 0;
}
dl.svninfo dt {
  font-weight: bold;
}

ul.link-list li {
  white-space: nowrap;
}
ul.link-list .type {
  font-size: 8px;
  text-transform: uppercase;
  color: white;
  background: #969696;
  padding: 2px 4px;
  -webkit-border-radius: 5px;
}

/* @end */

/* @group Class Metadata Section */
#class-metadata {
  margin-top: 2em;
}
/* @end */

/* @group Project Metadata Section */
#project-metadata {
  margin-top: 2em;
}

#project-metadata .section {
  border: 1px solid #aaa;
}
#project-metadata h3.section-header {
  border-bottom: 1px solid #aaa;
  position: relative;
}

#project-metadata form {
  color: #777;
  background: #ccc;
}

/* @end */

/* @group Documentation Section */
.description {
  font-size: 100%;
  color: #333;
}

.description p {
  margin: 1em 0.4em;
}

.description li p {
  margin: 0;
}

.description ol,
.description ul {
  margin-left: 1.5em;
}
.description ol li,
.description ul li {
  line-height: 1.4em;
}

.note-list {
  margin: 8px 0;
}

.label-list {
  margin: 8px 1.5em;
  border: 1px solid #ccc;
}
.description .label-list {
  font-size: 14px;
}

.note-list dt {
  font-weight: bold;
}
.note-list dd {
  padding: 0 12px;
}

.label-list dt {
  padding: 2px 4px;
  font-weight: bold;
  background: #ddd;
}
.label-list dd {
  padding: 2px 12px;
}
.label-list dd + dt,
.note-list dd + dt {
  margin-top: 0.7em;
}

#documentation .section {
  font-size: 90%;
}

#documentation h2.section-header {
  margin-top: 1em;
  padding: 0.25em 0.5em;
  background: #ccc;
  color: #333;
  font-size: 175%;
  border: 1px solid #bbb;
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
}

.documentation-section-title {
  position: relative;
}
.documentation-section-title .section-click-top {
  position: absolute;
  top: 6px;
  right: 12px;
  font-size: 10px;
  color: #9b9877;
  visibility: hidden;
  padding-right: 0.5px;
}

.documentation-section-title:hover .section-click-top {
  visibility: visible;
}

#documentation h3.section-header {
  margin-top: 1em;
  padding: 0.25em 0.5em;
  background-color: #dedede;
  color: #333;
  font-size: 150%;
  border: 1px solid #bbb;
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
}

#constants-list > dl,
#attributes-list > dl {
  margin: 1em 0 2em;
  border: 0;
}
#constants-list > dl dt,
#attributes-list > dl dt {
  padding-left: 0;
  font-weight: bold;
  font-family: Monaco, "Andale Mono";
  background: inherit;
}
#constants-list > dl dt a,
#attributes-list > dl dt a {
  color: inherit;
}
#constants-list > dl dd,
#attributes-list > dl dd {
  margin: 0 0 1em 0;
  padding: 0;
  color: #666;
}

.documentation-section h2 {
  position: relative;
}

.documentation-section h2 a {
  position: absolute;
  top: 8px;
  right: 10px;
  font-size: 12px;
  color: #9b9877;
  visibility: hidden;
}

.documentation-section h2:hover a {
  visibility: visible;
}

/* @group Method Details */

#documentation .method-source-code {
  display: none;
}

#documentation .method-detail {
  margin: 0.5em 0;
  padding: 0.5em 0;
  cursor: pointer;
}
#documentation .method-detail:hover {
  background-color: #f1edba;
}
#documentation .method-heading {
  position: relative;
  padding: 2px 4px 0 20px;
  font-size: 125%;
  font-weight: bold;
  color: #333;
  background: url(images/brick.png) no-repeat left bottom;
}
#documentation .method-heading :link,
#documentation .method-heading :visited {
  color: inherit;
}
#documentation .method-click-advice {
  position: absolute;
  top: 2px;
  right: 5px;
  font-size: 10px;
  color: #9b9877;
  visibility: hidden;
  padding-right: 20px;
  line-height: 20px;
  background: url(images/zoom.png) no-repeat right top;
}
#documentation .method-heading:hover .method-click-advice {
  visibility: visible;
}

#documentation .method-alias .method-heading {
  color: #666;
  background: url(images/brick_link.png) no-repeat left bottom;
}

#documentation .method-description,
#documentation .aliases {
  margin: 0 20px;
  color: #666;
}

#documentation .method-description p,
#documentation .aliases p {
  line-height: 1.2em;
}

#documentation .aliases {
  padding-top: 4px;
  font-style: italic;
  cursor: default;
}
#documentation .method-description p {
  margin-bottom: 0.5em;
}
#documentation .method-description ul {
  margin-left: 1.5em;
}
pre {
  margin: 0.5em 0;
}

#documentation .attribute-method-heading {
  background: url(images/tag_green.png) no-repeat left bottom;
}
#documentation #attribute-method-details .method-detail:hover {
  background-color: transparent;
  cursor: default;
}
#documentation .attribute-access-type {
  font-size: 60%;
  text-transform: uppercase;
  vertical-align: super;
  padding: 0 2px;
}
/* @end */

/* @end */

/* @group Source Code */

pre {
  overflow: auto;
  background: #262626;
  color: white;
  border: 1px dashed #999;
  padding: 0.5em;
}

.description pre {
  margin: 0 0.4em;
}

.ruby-constant   { color: #7fffd4; background: transparent; }
.ruby-keyword    { color: #00ffff; background: transparent; }
.ruby-ivar       { color: #eedd82; background: transparent; }
.ruby-operator   { color: #00ffee; background: transparent; }
.ruby-identifier { color: #ffdead; background: transparent; }
.ruby-node       { color: #ffa07a; background: transparent; }
.ruby-comment    { color: #dc0000; font-weight: bold; background: transparent; }
.ruby-regexp     { color: #ffa07a; background: transparent; }
.ruby-value      { color: #7fffd4; background: transparent; }

/* @end */


/* @group search results */
#search-results h1 {
  font-size: 1em;
  font-weight: normal;
  text-shadow: none;
}

#search-results .current {
  background: #ccc;
  border-bottom: 1px solid transparent;
}

#search-results li {
  list-style: none;
  border-bottom: 1px solid #aaa;
  -moz-border-radius: 4px;
  -webkit-border-radius: 4px;
  border-radius: 4px;
  margin-bottom: 0.5em;
}

#search-results li:last-child {
  border-bottom: none;
  margin-bottom: 0;
}

#search-results li p {
  padding: 0;
  margin: 0.5em;
}

#search-results .search-namespace {
  font-weight: bold;
}

#search-results li em {
  background: yellow;
  font-style: normal;
}

#search-results pre {
  margin: 0.5em;
}

/* @end */

0 Likes

#18

I have added the two options, fixed the ‘no results’ bug, and updated the CSS style file. I didn’t use the one you posted but updated my own style file to clearly indicate code sections. There are a lot of other style definitions in your file, which I am not sure whether they are used at all. Let me know if I am missing something.
About the tricky problem: I run ri on the console from ST2. So if you know a way how I can call a different ri from the console, I can easily implement that in ST2. The second question is whether I can detect the current ruby (probably not?). The alternative would be to add an option that allows the user to choose, which ri is called.

0 Likes

#19

i don’t know if is it possibile, but can python run the command as it was calling it in the bash shell?
basically rvm works by adding these lines in .bashrc:


PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
 -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

so in my terminal when i call ri, it always get called the one for the current ruby version set by rvm. Examples:

MacBook-Pro-di-francesco:~ francesco$ which ri
/Users/francesco/.rvm/rubies/ruby-1.8.7-head/bin/ri
MacBook-Pro-di-francesco:~ francesco$ rvm use 1.9.2
Using /Users/francesco/.rvm/gems/ruby-1.9.2-p320
MacBook-Pro-di-francesco:~ francesco$ which ri
/Users/francesco/.rvm/gems/ruby-1.9.2-p320/bin/ri
MacBook-Pro-di-francesco:~ francesco$ rvm use system
Now using system ruby.
MacBook-Pro-di-francesco:~ francesco$ which ri
/usr/bin/ri
0 Likes

#20

mmmh, I made a small change that might fix the problem. Can you give it a try?
I am not really satisfied with the solution though because the Python call to subprocess now uses shell=True as an argument, which is less secure for untrusted arguments (not a problem, I think) and requires manual escaping of certain characters. I am not sure about the escaping details but it might be the case that some help topics fail. Let me know if you come across something.

Edit: Some of the problems with shell=True are discussed here: stackoverflow.com/questions/3172 … subprocess
I would prefer not using this possible solution. An alternative would be to provide a user option for the ri path. But that only makes sense when people do not change their Ruby version all the time…

0 Likes

#21

hi, last solution doesn’t seem to work, i’m still getting the documentation from the system ri. I guess i can work this around by installing the library i want the documentation for also to system ruby, but unfortunately as you also said we can have documentation only for one version of ruby in this way

0 Likes

#22

Ok, i’ve found the solution and it was right there from the begging, i just needed to run ri without any arguments to find out that…:

By default ri searches for documentation in the following directories:
(...)
 /$HOME/.rdoc
(...)

so i just put all the documentation i care of there and it works…
only thing to modify in the script for this to work is to add the --home flag

0 Likes

#23

I have updated the plugin with a number of new features:
- Added support for JavaScript, PHP, Ruby, and Stata
**- Improved Python support **
- Overview of all available help topics based on the familiar ST2 quick select panel
(the same as the command panel, or the one for jumping from project to project)

  • Help files are now downloaded and compiled in the background
  • Bug fixes

francescob, I have revered the non-working solution with the shell=true argument. I could still add an option that sets the ri path so that you don’t have to overwrite default Ruby. You should go back to the main channel through Package Control. I am not sure how updating works when you installed the plugin manually from the dev branch.

0 Likes

#24

Just tried SublimePeek… I was desperately looking for something like that. THANKS!!

0 Likes

#25

Great plugins!!!
is there any way to add keyboard shortcut for closing popups?

0 Likes

#26

[quote=“vitaLee”]Great plugins!!!
is there any way to add keyboard shortcut for closing popups?[/quote]

esc ?

0 Likes

#27

@francescob that’s how you close sublime dropdown dialog, while i was referring to the actual popup displaying the doc snippets.
not sure if you got my point right.
im using v2181 and cant dismiss the popup with ESC.

0 Likes

#28

Hi, are you using Mac OS X 10.6? My experience is that you can close the quicklook window from the package with esc or space on 10.7. I tried 10.6 once and it didn’t work that way. If that is the case, I can try to fix it but not before sometime next week…

0 Likes

#29

Hi, yes i’m running OSX 10.6.8.
thanks.

0 Likes

#30

Firstly, you can pass a “packages.json” (or similar) to Package Control which will allow installation only from Mac OS.

Then, I’d love to be able to use something like this on Windows. I’ve been searching for this (not actively, but I have) and even considered to make it on my own, even though I clearly don’t have the time.
Drop me a message here, contact me on github or whatever. I’m open to testing and I know (some) package developing, but I’m also fine with testing :wink:

0 Likes

#31

FichteFoll, we can make it work for windows. It should not be hard but I just do not have a windows computer. Can you comment on this issue on github so that we can continue the discussion there (just so that we both get messages posted there):
github.com/jlegewie/SublimePeek/issues/4
I will add details next week.

Anyone with a unix system?
github.com/jlegewie/SublimePeek/issues/5

vitaLee, I will get to that next week.

0 Likes

#32

hi, it’s me again, i’m having a problem with ruby doc when looking up for certain words (a small number atm), this is the error i see in the sublime text console:

Traceback (most recent call last):
  File "/Applications/Sublime Text 2.app/Contents/MacOS/sublime_plugin.py", line 362, in run_
    return self.run(edit)
  File "./SublimePeek.py", line 84, in run
  File "./SublimePeek.py", line 222, in create_help_file
  File "./SublimePeek.py", line 175, in write_html_file
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 3598: ordinal not in range(128)

and here: https://gist.github.com/2725230 is an example of the html produced by ri for words that give this error

0 Likes

#33

thanks for the report. I will look into it but it might take some time. Meanwhile, do you see any pattern in the keywords? The help file you posted is from .belongs_to, right? What are other examples?

0 Likes

#34

It seems to happen more often, but non exclusively, with methods from ActiveRecord::Base class

0 Likes

#35

Just because it came up multiple times on github: The current stable build of ST2 (2181) produces an error when you try to use the plugin with HTML, javascript, PHP or css because the ok_cancel_dialog was added after 2181. It works with the dev build of ST2: sublimetext.com/dev
You can switch back to the stable channel after using SublimePeek once with every language you want to use. I am reluctant to fix this because I am hoping for a new st2 stable release soon.

0 Likes