ripl-fresh 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gemspec +3 -1
- data/CHANGELOG.rdoc +19 -0
- data/README.rdoc +42 -37
- data/Rakefile +7 -0
- data/lib/bond/completions/ripl-fresh.rb +8 -9
- data/lib/ripl/fresh/commands.rb +6 -9
- data/lib/ripl/fresh/config.rb +41 -0
- data/lib/ripl/fresh/prompt.rb +7 -7
- data/lib/ripl/fresh.rb +99 -118
- metadata +24 -7
data/.gemspec
CHANGED
@@ -11,8 +11,10 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.summary = "Fresh Ruby Enhanced SHell"
|
12
12
|
s.description = "Fresh Ruby Enhanced SHell automatically detects, if your current command should be Ruby or a system command."
|
13
13
|
s.required_rubygems_version = ">= 1.3.6"
|
14
|
+
s.required_ruby_version = ">= 1.9"
|
14
15
|
s.executables = ['ripl-fresh', 'fresh']
|
15
|
-
s.add_dependency 'ripl', '>= 0.2.
|
16
|
+
s.add_dependency 'ripl', '>= 0.2.6'
|
17
|
+
s.add_dependency 'ripl-multi_line', '>= 0.2.0'
|
16
18
|
s.files = Dir.glob(%w[{lib,test}/**/*.rb bin/* [A-Z]*.{txt,rdoc} ext/**/*.{rb,c} **/deps.rip]) + %w{Rakefile .gemspec}
|
17
19
|
s.extra_rdoc_files = ["README.rdoc", "LICENSE"]
|
18
20
|
s.license = 'MIT'
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,2 +1,21 @@
|
|
1
|
+
== 0.2.0
|
2
|
+
* Better system command error handling
|
3
|
+
* Refactored command mode detection, changed configuration settings
|
4
|
+
* Now you can redirect system results to ruby vars using => variable
|
5
|
+
* Compatible with ripl-0.2.6 and ripl-multi_line-0.2.0
|
6
|
+
* No more Ruby 1.8 support!
|
7
|
+
* More little changes and doc updates
|
8
|
+
|
9
|
+
== 0.1.2
|
10
|
+
* Command mode detection changes
|
11
|
+
* Added flexible fresh_prompt configuration
|
12
|
+
* set config[:fresh_prompt] to :PS1 to get your shell prompt, thanks to fallwith
|
13
|
+
* Improved auto-completion
|
14
|
+
|
15
|
+
== 0.1.1
|
16
|
+
* Fixed cd command
|
17
|
+
* Changed command_mode detection (using PATH)
|
18
|
+
* Better autocompletion
|
19
|
+
|
1
20
|
== 0.1.0
|
2
21
|
* Initial release
|
data/README.rdoc
CHANGED
@@ -26,23 +26,20 @@ Note, that it will also load your <tt>.irbrc</tt> file. To avoid this, you can d
|
|
26
26
|
|
27
27
|
== Usage & configuration options
|
28
28
|
|
29
|
-
For an example session, see {this blog entry}[http://rbjl.net/43-use-fresh-ruby-as-your-shell].
|
29
|
+
Just start the shell and play around, to get a fresh feeling. For an example session, see {this blog entry}[http://rbjl.net/43-use-fresh-ruby-as-your-shell].
|
30
30
|
|
31
|
-
The main regexp to determine if the command should be interpreted as system command is similar to this one: <tt
|
31
|
+
The main regexp to determine if the command should be interpreted as system command is similar to this one: <tt>/^\\w+\\s+.*/</tt> (match a single word followed by at least one space). See below for details.
|
32
32
|
|
33
|
-
|
33
|
+
You can use the output of system commands and redirect it to a Ruby variable (or similar Ruby expression) like this:
|
34
34
|
|
35
|
-
|
35
|
+
ls => variable
|
36
36
|
|
37
|
-
|
37
|
+
Please note: The "=> variable" part has to be at the line ending.
|
38
|
+
The output of the <tt>ls</tt> command is now stored as array in <tt>variable</tt> and can be used in the next line. There are three variations of this command:
|
39
|
+
* <tt>=>></tt> append result to the array specified (or create it)
|
40
|
+
* <tt>~></tt> use command as string instead of an array
|
41
|
+
* <tt>~>></tt> use command as string instead of an array and append (or create it)
|
38
42
|
|
39
|
-
As a fallback, _fresh_ checks <tt>Kernel.respond_to?</tt>, if there is a ruby method with that name.
|
40
|
-
|
41
|
-
If the regexp does match, but the command could not be found in any of the three word arrays, the command mode will be set to <tt>Ripl.config[:fresh_match_default]</tt> (<tt>:ruby</tt>). If the regexp does not match, <tt>Ripl.config[:fresh_default]</tt> is used (also defaults to <tt>:ruby</tt>).
|
42
|
-
|
43
|
-
Of course, there is a way to explicitly set your command mode: You can prefix your input with a space to force Ruby mode as well as you can prefix it with <tt>^</tt> to force system mode. The strings used for this can be customized in <tt>Ripl.config[:fresh_system_prefix]</tt> and <tt>Ripl.config[:fresh_ruby_prefix]</tt>.
|
44
|
-
|
45
|
-
You need to take a look at <tt>get_input</tt> method in the source file to 100% understand the command mode detection way.
|
46
43
|
|
47
44
|
=== Prompt
|
48
45
|
There is <tt>Riplc.config[:fresh_prompt]</tt> option, which takes a wide range of possible values. You can pass in a proc or a direct string. Furthermore, you can pass a symbol to get one of the following:
|
@@ -52,26 +49,34 @@ There is <tt>Riplc.config[:fresh_prompt]</tt> option, which takes a wide range o
|
|
52
49
|
* <tt>:irb</tt> - use irbs :PROMPT_I (if set)
|
53
50
|
* <tt>:simple</tt> - ">> "
|
54
51
|
|
52
|
+
=== Command mode determination
|
53
|
+
|
54
|
+
There are three different command modes: <tt>:ruby</tt>, <tt>:system</tt> and <tt>:mixed</tt>.
|
55
|
+
|
56
|
+
<tt>:ruby</tt> is usual Ruby, <tt>:system</tt> means system command and <tt>:mixed</tt> looks like system command, but is just redirected to the Ruby method with that name.
|
57
|
+
|
58
|
+
The input is matched against the regexps in <tt>Ripl.config[:fresh_patterns]</tt>. These regexps also contain named groups, to determine the command or if the command should be stored in a variable.
|
59
|
+
|
60
|
+
When a regexp has matched, the command is searched for in <tt>Ripl.config[:fresh_ruby_commands]</tt>, <tt>Ripl.config[:fresh_system_commands]</tt> and <tt>Ripl.config[:fresh_mixed_commands]</tt> (in this order).
|
61
|
+
|
62
|
+
The ruby command array contains some common Ruby words, e.g. <tt>def </tt>. The system command array is set to your <tt>ENV['PATH']</tt>. The mixed array currently contains only +cd+. You can adjust the arrays as you want to.
|
63
|
+
|
64
|
+
As a fallback, _fresh_ checks <tt>Kernel.respond_to?</tt>, if there is a ruby method with that name.
|
65
|
+
|
66
|
+
If the regexp did match, but the command could not be found in any of the three word arrays and <tt>respond_to?</tt> has not been successful, the command mode will be set to <tt>Ripl.config[:fresh_unknown_command_mode]</tt> (default <tt>:ruby</tt>). If the regexp did not match, <tt>Ripl.config[:fresh_default_mope]</tt> is used (default <tt>:ruby</tt>).
|
67
|
+
|
68
|
+
You need to take a look at <tt>get_input</tt> method in the source file to 100% understand the command mode detection way.
|
69
|
+
|
70
|
+
=== Patterns
|
71
|
+
|
72
|
+
The <tt>Ripl.config[:fresh_patterns]</tt> contains three Regexps, which do the following:
|
73
|
+
* match <tt>^</tt> to force system mode
|
74
|
+
* match a single word
|
75
|
+
* match a word followed by a space
|
76
|
+
|
55
77
|
=== Defaults
|
56
78
|
|
57
|
-
|
58
|
-
Ripl.config[:fresh_system_prefix] = %w[^]
|
59
|
-
Ripl.config[:fresh_ruby_prefix] = [' ']
|
60
|
-
# word arrays
|
61
|
-
Ripl.config[:fresh_ruby_words] = %w[begin case class def for if module undef unless until while puts warn print p pp ap raise fail loop require load lambda proc system]
|
62
|
-
Ripl.config[:fresh_system_words] =
|
63
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).uniq.map {|e|
|
64
|
-
File.directory?(e) ? Dir.entries(e) : []
|
65
|
-
}.flatten.uniq - ['.', '..']
|
66
|
-
Ripl.config[:fresh_mixed_words] = %w[cd]
|
67
|
-
# main regexp
|
68
|
-
Ripl.config[:fresh_match_regexp] = /^([a-z\/_-]+)\s+(?!(?:[=%*]|!=|\+=|-=|\/=))/i
|
69
|
-
# regex matched but word not in one of the three arrays, possible values: :ruby, :system, :mixed
|
70
|
-
Ripl.config[:fresh_match_default] = :ruby
|
71
|
-
# regex did not match
|
72
|
-
Ripl.config[:fresh_default] = :ruby
|
73
|
-
# configure prompt
|
74
|
-
Ripl.config[:fresh_prompt] = :default
|
79
|
+
See <tt>lib/ripl/fresh/config.rb</tt> for all configuration options and its defaults.
|
75
80
|
|
76
81
|
== Customization
|
77
82
|
|
@@ -87,20 +92,20 @@ There are lots of things which can get better:
|
|
87
92
|
|
88
93
|
* Improve auto-completion
|
89
94
|
* More cool (and colorful?) <tt>:mixed</tt> Ruby commands
|
90
|
-
*
|
91
|
-
* <tt>ripl-multi_line</tt> for system commands
|
92
|
-
* Result of system commands should be available for ruby, not only printed to stdout
|
93
|
-
* Respect "..." (single argument) for :mixed commands
|
94
|
-
* Improve default configuration
|
95
|
+
* Respect "..." (single argument) for :mixed commands
|
95
96
|
* Add tests
|
97
|
+
* Be compatible (and installable) with JRuby/Rubinius
|
96
98
|
* Fresh ideas
|
97
99
|
|
98
100
|
Feel free to fork in your improvements ;)
|
99
101
|
|
100
102
|
== Other gems you might find interesting
|
101
103
|
|
102
|
-
* {rush}[https://github.com/adamwiggins/rush]
|
103
|
-
* {ripl}[https://github.com/cldwalker/ripl]
|
104
|
+
* {rush}[https://github.com/adamwiggins/rush] - Another Ruby shell, different concept
|
105
|
+
* {ripl}[https://github.com/cldwalker/ripl] - An irb alternative, _fresh_ is based on it
|
106
|
+
* {rubsh}[https://github.com/danielb2/rubsh] - Some similar ideas
|
107
|
+
* {urchin}[https://github.com/Spakman/urchin] - More unix like approach
|
108
|
+
* {rubish}[https://github.com/hayeah/rubish] - And another approach
|
104
109
|
|
105
110
|
== Copyright
|
106
111
|
|
data/Rakefile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# no advanced auto completion, yet
|
2
|
-
#
|
2
|
+
# TODO meaningful, fine-tuned, good autocompletion
|
3
3
|
|
4
4
|
require 'readline'
|
5
5
|
|
@@ -18,16 +18,15 @@ everything_completion = proc{ # TODO: improve
|
|
18
18
|
}
|
19
19
|
|
20
20
|
|
21
|
-
complete :
|
22
|
-
:
|
23
|
-
|
21
|
+
complete on: Regexp.union( *Ripl.config[:fresh_patterns].compact ),
|
22
|
+
search: false,
|
23
|
+
&file_completion
|
24
24
|
|
25
25
|
# TODO fires only when space after ^
|
26
|
-
complete :
|
27
|
-
|
28
|
-
&system_command_completion
|
26
|
+
complete on: Ripl.config[:fresh_patterns][0],
|
27
|
+
&system_command_completion
|
29
28
|
|
30
|
-
complete :
|
31
|
-
|
29
|
+
complete on: /^[a-z\/_-]*/i,
|
30
|
+
&everything_completion
|
32
31
|
|
33
32
|
# J-_-L
|
data/lib/ripl/fresh/commands.rb
CHANGED
@@ -4,16 +4,11 @@ require 'fileutils'
|
|
4
4
|
module Ripl
|
5
5
|
module Fresh
|
6
6
|
module Commands
|
7
|
-
=begin
|
8
|
-
def ls(path='.')
|
9
|
-
Dir[ File.join( path, '*' )].map{|res| res =~ /^#{path}\/?/; $' }
|
10
|
-
end
|
11
|
-
alias dir ls
|
12
|
-
=end
|
13
|
-
|
14
7
|
def cd( path = File.expand_path('~') )
|
15
8
|
new_last_path = FileUtils.pwd
|
16
|
-
if path
|
9
|
+
if path =~ /^\.{3,}$/
|
10
|
+
path = File.join( %w[..] * ($&.size-1) )
|
11
|
+
elsif path == '-'
|
17
12
|
if @last_path
|
18
13
|
path = @last_path
|
19
14
|
else
|
@@ -29,4 +24,6 @@ module Ripl
|
|
29
24
|
end
|
30
25
|
end
|
31
26
|
|
32
|
-
Ripl::Commands.send :include, Ripl::Fresh::Commands
|
27
|
+
Ripl::Commands.send :include, Ripl::Fresh::Commands
|
28
|
+
|
29
|
+
# J-_-L
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# configure prompt
|
2
|
+
Ripl.config[:fresh_prompt] = :default
|
3
|
+
|
4
|
+
# word arrays
|
5
|
+
Ripl.config[:fresh_ruby_commands] = %w[begin case class def for if module undef unless until while puts warn print p pp ap raise fail loop require load lambda proc]
|
6
|
+
Ripl.config[:fresh_system_commands] =
|
7
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).uniq.map {|e|
|
8
|
+
File.directory?(e) ? Dir.entries(e) : []
|
9
|
+
}.flatten.uniq - ['.', '..']
|
10
|
+
Ripl.config[:fresh_mixed_commands] = %w[cd]
|
11
|
+
|
12
|
+
# a regex matched but command is not in one of the three arrays
|
13
|
+
# or regex did not match
|
14
|
+
# possible values: :ruby, :system, :mixed
|
15
|
+
Ripl.config[:fresh_unknown_command_mode] = :ruby
|
16
|
+
Ripl.config[:fresh_default_mode] = :ruby
|
17
|
+
|
18
|
+
# main regexes
|
19
|
+
# $<command>: whole command_line
|
20
|
+
# $<command_line>: only the system command (if possible)
|
21
|
+
# $<result_operator>: (optional) result operator
|
22
|
+
# $<result_storage>: (optional) variable to store command result
|
23
|
+
# $<force>: force system command prefix
|
24
|
+
# please note: although the main regexp looks pretty complicated, it's just an detailed version of
|
25
|
+
# /\w+\s+(=> \w)?/
|
26
|
+
force = '(?<force>[\^])'
|
27
|
+
command = '(?<command>[a-zA-Z\/_-]+)'
|
28
|
+
result_operator = '(?<result_operator>[=|~]>{1,2})'
|
29
|
+
result_storage = '(?<result_storage>[a-zA-Z@\$_][a-zA-Z0-9@_\[\]:"\']*)'
|
30
|
+
_store = "(?:#{ result_operator }\s*#{ result_storage })?" # matches for example: "=> here"
|
31
|
+
_anything_but_these = '(?!(?:[=%*]|!=|\+=|-=|\/=)).*?'
|
32
|
+
|
33
|
+
Ripl.config[:fresh_patterns] = [
|
34
|
+
/^#{ force }(?<command_line>.*?)#{ _store }$/, # [0] force system
|
35
|
+
nil, nil, nil, nil,
|
36
|
+
/^(?<command_line>#{ command })\s*#{ _store }$/, # [5] single word
|
37
|
+
nil, nil, nil, nil,
|
38
|
+
/^(?<command_line>#{ command }\s+#{ _anything_but_these })#{ _store }$/, # [10] command + space
|
39
|
+
]
|
40
|
+
|
41
|
+
# J-_-L
|
data/lib/ripl/fresh/prompt.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
require 'socket'
|
2
|
-
require 'etc'
|
3
|
-
|
4
1
|
# save current prompt
|
5
|
-
ripl_prompt = Ripl.config[:prompt] #
|
2
|
+
ripl_prompt = Ripl.config[:prompt] # FIXME currently not working
|
6
3
|
|
7
4
|
# setup default prompt
|
8
|
-
default_prompt = proc{ |path|
|
5
|
+
default_prompt = proc{ |path = FileUtils.pwd|
|
9
6
|
path.gsub! /#{ File.expand_path('~') }/, '~'
|
10
7
|
path + '> '
|
11
8
|
}
|
12
9
|
|
13
10
|
# PS environment variable prompt
|
14
11
|
ps_prompt = proc{ |prompt_number|
|
12
|
+
require 'socket'
|
13
|
+
require 'etc'
|
14
|
+
|
15
15
|
prompt = ENV['PS' + prompt_number.to_s].dup
|
16
16
|
prompt.gsub!('\a', '') # unsupported
|
17
17
|
prompt.gsub!('\d', Time.now.strftime("%a %b %d"))
|
@@ -69,7 +69,7 @@ Ripl.config[:prompt] = proc{
|
|
69
69
|
|
70
70
|
# call if proc or return directly
|
71
71
|
if fp.respond_to? :call
|
72
|
-
fp
|
72
|
+
fp[ FileUtils.pwd ]
|
73
73
|
else
|
74
74
|
case fp
|
75
75
|
when nil, false
|
@@ -78,7 +78,7 @@ Ripl.config[:prompt] = proc{
|
|
78
78
|
fp
|
79
79
|
else
|
80
80
|
Ripl.config[:fresh_prompt] = :default
|
81
|
-
default_proc.call
|
81
|
+
default_proc.call
|
82
82
|
end
|
83
83
|
end
|
84
84
|
}
|
data/lib/ripl/fresh.rb
CHANGED
@@ -3,151 +3,132 @@ require 'fileutils'
|
|
3
3
|
|
4
4
|
module Ripl
|
5
5
|
module Fresh
|
6
|
-
VERSION = '0.
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
/^(#{
|
16
|
-
option.map{ |char|
|
17
|
-
Regexp.escape char.to_s
|
18
|
-
}*'|'
|
19
|
-
})/
|
20
|
-
else
|
21
|
-
option.to_s
|
22
|
-
end
|
23
|
-
end
|
6
|
+
VERSION = '0.2.0'
|
7
|
+
|
8
|
+
def before_loop
|
9
|
+
@command_mode = :ruby
|
10
|
+
@real_buffer = nil
|
11
|
+
super
|
12
|
+
# register bond completion
|
13
|
+
Ripl.config[:completion][:gems] ||= []
|
14
|
+
Ripl.config[:completion][:gems] << 'ripl-fresh'
|
24
15
|
end
|
25
16
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
#
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
17
|
+
# determine @command_mode
|
18
|
+
def get_input
|
19
|
+
command_line = super
|
20
|
+
|
21
|
+
# This case statement decides the command mode,
|
22
|
+
# and which part of the input should be used for what...
|
23
|
+
# Note: Regexp match groups are used!
|
24
|
+
@result_storage = @result_operator = nil
|
25
|
+
|
26
|
+
@command_mode = case command_line
|
27
|
+
# force ruby with a space
|
28
|
+
when /^ /
|
29
|
+
:ruby
|
30
|
+
# regexp match shell commands
|
31
|
+
when *Array( Ripl.config[:fresh_patterns] ).compact
|
32
|
+
command_line = $~[:command_line] if $~.names.include? 'command_line'
|
33
|
+
command = $~[:command] if $~.names.include? 'command'
|
34
|
+
@result_operator = $~[:result_operator] if $~.names.include? 'result_operator'
|
35
|
+
@result_storage = $~[:result_storage] if $~.names.include? 'result_storage'
|
36
|
+
forced = !! $~[:force] if $~.names.include? 'force'
|
37
|
+
|
38
|
+
if forced
|
46
39
|
:system
|
47
|
-
|
48
|
-
|
49
|
-
|
40
|
+
elsif Ripl.config[:fresh_ruby_commands].include?( command )
|
41
|
+
:ruby
|
42
|
+
elsif Ripl.config[:fresh_mixed_commands].include?( command )
|
43
|
+
:mixed
|
44
|
+
elsif Ripl.config[:fresh_system_commands].include?( command )
|
45
|
+
:system
|
46
|
+
elsif Kernel.respond_to? command.to_sym
|
50
47
|
:ruby
|
51
|
-
# single words, and main regex to match shell commands
|
52
|
-
when /^([a-z_-]+)$/i, Ripl.config[:fresh_match_regexp]
|
53
|
-
if Ripl.config[:fresh_ruby_words].include?($1)
|
54
|
-
:ruby
|
55
|
-
elsif Ripl.config[:fresh_mixed_words].include?($1)
|
56
|
-
:mixed
|
57
|
-
elsif Ripl.config[:fresh_system_words].include?($1)
|
58
|
-
:system
|
59
|
-
elsif Kernel.respond_to? $1.to_sym
|
60
|
-
:ruby
|
61
|
-
else
|
62
|
-
Ripl.config[:fresh_match_default]
|
63
|
-
end
|
64
|
-
# default is still ruby ;)
|
65
48
|
else
|
66
|
-
Ripl.config[:
|
49
|
+
Ripl.config[:fresh_unknown_command_mode]
|
67
50
|
end
|
68
|
-
|
69
|
-
|
51
|
+
else
|
52
|
+
Ripl.config[:fresh_default_mode]
|
70
53
|
end
|
71
54
|
|
72
|
-
|
73
|
-
|
74
|
-
if input == ''
|
75
|
-
@command_mode = :system and return
|
76
|
-
end
|
77
|
-
|
78
|
-
case @command_mode
|
79
|
-
when :system # execute command
|
80
|
-
ret = system input
|
81
|
-
case ret
|
82
|
-
when false
|
83
|
-
warn '[non-nil exit status]' # too verbose?
|
84
|
-
when nil
|
85
|
-
warn "[command error #{$?.exitstatus}]" # add message?
|
86
|
-
end
|
87
|
-
ret
|
88
|
-
|
89
|
-
when :mixed # call the ruby method, but with shell style arguments
|
90
|
-
m, *args = *input.split
|
91
|
-
super "#{m}(*#{args.to_s})"
|
55
|
+
command_line
|
56
|
+
end
|
92
57
|
|
93
|
-
|
94
|
-
|
95
|
-
|
58
|
+
# get result (depending on @command_mode)
|
59
|
+
def loop_eval(input)
|
60
|
+
if input == ''
|
61
|
+
@command_mode = :system and return
|
96
62
|
end
|
97
63
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
@command_mode == :system ||
|
103
|
-
@command_mode == :mixed && (!result || result == '')
|
104
|
-
# don't display anything
|
64
|
+
case @command_mode
|
65
|
+
when :system # generate ruby code to execute the command
|
66
|
+
if !@result_storage
|
67
|
+
ruby_command_code = "_ = system '#{ input }'\n"
|
105
68
|
else
|
106
|
-
|
69
|
+
temp_file = "/tmp/ripl-fresh_#{ rand 12345678901234567890 }"
|
70
|
+
ruby_command_code = "_ = system '#{ input } 2>&1', :out => '#{ temp_file }'\n"
|
71
|
+
|
72
|
+
# assign result to result storage variable
|
73
|
+
case @result_operator
|
74
|
+
when '=>', '=>>'
|
75
|
+
result_literal = "[]"
|
76
|
+
formatted_result = "File.read('#{ temp_file }').split($/)"
|
77
|
+
operator = @result_operator == '=>>' ? '+=' : '='
|
78
|
+
when '~>', '~>>'
|
79
|
+
result_literal = "''"
|
80
|
+
formatted_result = "File.read('#{ temp_file }')"
|
81
|
+
operator = @result_operator == '~>>' ? '<<' : '='
|
82
|
+
end
|
83
|
+
ruby_command_code << %Q%
|
84
|
+
#{ @result_storage } ||= #{ result_literal }
|
85
|
+
#{ @result_storage } #{ operator } #{ formatted_result }
|
86
|
+
FileUtils.rm '#{ temp_file }'
|
87
|
+
%
|
107
88
|
end
|
108
|
-
end
|
109
89
|
|
110
|
-
|
111
|
-
|
90
|
+
# ruby_command_code << "raise( SystemCallError.new $?.exitstatus ) if !_\n" # easy auto indent
|
91
|
+
ruby_command_code << "if !_
|
92
|
+
raise( SystemCallError.new $?.exitstatus )
|
93
|
+
end;"
|
94
|
+
|
95
|
+
super @input = "(#{ ruby_command_code })"
|
96
|
+
|
97
|
+
when :mixed # call the ruby method, but with shell style arguments TODO more shell like (e.g. "")
|
98
|
+
method_name, *args = *input.split
|
99
|
+
super @input = "#{ method_name }(*#{ args })"
|
100
|
+
|
101
|
+
else # good old :ruby
|
112
102
|
super
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# system commands don't have output values and Ruby is displayed normally
|
107
|
+
def print_result(result)
|
108
|
+
if @error_raised ||
|
109
|
+
@command_mode == :system ||
|
110
|
+
@command_mode == :mixed && (!result || result == '')
|
111
|
+
# don't display anything
|
112
|
+
else
|
113
|
+
super # puts(format_result(result))
|
117
114
|
end
|
118
115
|
end
|
119
116
|
end
|
120
117
|
end
|
121
118
|
|
122
|
-
# hook in (and work around readline loading behaviour)
|
119
|
+
# load plugins and hook in (and work around readline loading behaviour)
|
123
120
|
Ripl.config[:readline] = false
|
124
121
|
require 'ripl/readline'
|
125
|
-
|
122
|
+
require 'ripl/multi_line'
|
123
|
+
Ripl::Shell.send :include, Ripl::Fresh
|
126
124
|
|
127
125
|
# load :mixed commands
|
128
126
|
require File.dirname(__FILE__) + '/fresh/commands'
|
129
127
|
|
130
|
-
|
131
|
-
|
132
|
-
# prefixes
|
133
|
-
Ripl.config[:fresh_system_prefix] = %w[^]
|
134
|
-
Ripl.config[:fresh_ruby_prefix] = [' ']
|
135
|
-
# word arrays
|
136
|
-
Ripl.config[:fresh_ruby_words] = %w[begin case class def for if module undef unless until while puts warn print p pp ap raise fail loop require load lambda proc system]
|
137
|
-
Ripl.config[:fresh_system_words] =
|
138
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).uniq.map {|e|
|
139
|
-
File.directory?(e) ? Dir.entries(e) : []
|
140
|
-
}.flatten.uniq - ['.', '..']
|
141
|
-
Ripl.config[:fresh_mixed_words] = %w[cd]
|
142
|
-
# main regexp
|
143
|
-
Ripl.config[:fresh_match_regexp] = /^([a-z\/_-]+)\s+(?!(?:[=%*]|!=|\+=|-=|\/=))/i
|
144
|
-
# regex matched but word not in one of the three arrays, possible values: :ruby, :system, :mixed
|
145
|
-
Ripl.config[:fresh_match_default] = :ruby
|
146
|
-
# regex did not match
|
147
|
-
Ripl.config[:fresh_default] = :ruby
|
148
|
-
# configure prompt
|
149
|
-
Ripl.config[:fresh_prompt] = :default
|
128
|
+
# fresh config
|
129
|
+
require File.dirname(__FILE__) + '/fresh/config'
|
150
130
|
|
131
|
+
# fresh_prompt management
|
151
132
|
require File.dirname(__FILE__) + '/fresh/prompt'
|
152
133
|
|
153
134
|
# J-_-L
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
- 1
|
8
7
|
- 2
|
9
|
-
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jan Lelis
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-12-03 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -28,10 +28,25 @@ dependencies:
|
|
28
28
|
segments:
|
29
29
|
- 0
|
30
30
|
- 2
|
31
|
-
-
|
32
|
-
version: 0.2.
|
31
|
+
- 6
|
32
|
+
version: 0.2.6
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: ripl-multi_line
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
- 2
|
46
|
+
- 0
|
47
|
+
version: 0.2.0
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
35
50
|
description: Fresh Ruby Enhanced SHell automatically detects, if your current command should be Ruby or a system command.
|
36
51
|
email: mail@janlelis.de
|
37
52
|
executables:
|
@@ -45,6 +60,7 @@ extra_rdoc_files:
|
|
45
60
|
files:
|
46
61
|
- lib/ripl/fresh/commands.rb
|
47
62
|
- lib/ripl/fresh/prompt.rb
|
63
|
+
- lib/ripl/fresh/config.rb
|
48
64
|
- lib/ripl/fresh.rb
|
49
65
|
- lib/ripl-fresh/bond_workaround.rb
|
50
66
|
- lib/bond/completions/ripl-fresh.rb
|
@@ -71,8 +87,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
71
87
|
- - ">="
|
72
88
|
- !ruby/object:Gem::Version
|
73
89
|
segments:
|
74
|
-
-
|
75
|
-
|
90
|
+
- 1
|
91
|
+
- 9
|
92
|
+
version: "1.9"
|
76
93
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
94
|
none: false
|
78
95
|
requirements:
|