ripl-fresh 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|