interactive_editor 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -14,7 +14,7 @@ Put the following in your .irbrc:
14
14
 
15
15
  Then, from within irb:
16
16
 
17
- $ irb
17
+ $ irb # or ripl
18
18
  > vi # (use vi w/ temp file)
19
19
  > vi 'filename.rb' # (open filename.rb in vi)
20
20
  > ed # (use EDITOR env variable)
@@ -27,6 +27,10 @@ To try it out without installing the gem:
27
27
  $ cd interactive_editor
28
28
  $ rake console
29
29
 
30
+ interactive_editor also works with the IRB alternative [ripl][].
31
+
30
32
  ## Credits
31
33
 
32
34
  Giles Bowkett, Greg Brown, and several audience members from Giles' Ruby East presentation: [Use vi or any text editor from within IRB](http://gilesbowkett.blogspot.com/2007/10/use-vi-or-any-text-editor-from-within.html).
35
+
36
+ [ripl]: https://github.com/cldwalker/ripl
@@ -7,8 +7,8 @@ Gem::Specification.new do |s|
7
7
  ## If your rubyforge_project name is different, then edit it and comment out
8
8
  ## the sub! line in the Rakefile
9
9
  s.name = 'interactive_editor'
10
- s.version = '0.0.6'
11
- s.date = '2010-12-08'
10
+ s.version = '0.0.7'
11
+ s.date = '2011-03-11'
12
12
  s.rubyforge_project = 'interactive_editor'
13
13
 
14
14
  ## Make sure your summary is short. The description may be as long
@@ -6,9 +6,10 @@ require 'irb'
6
6
  require 'fileutils'
7
7
  require 'tempfile'
8
8
  require 'shellwords'
9
+ require 'yaml'
9
10
 
10
11
  class InteractiveEditor
11
- VERSION = '0.0.6'
12
+ VERSION = '0.0.7'
12
13
 
13
14
  attr_accessor :editor
14
15
 
@@ -16,30 +17,47 @@ class InteractiveEditor
16
17
  @editor = editor.to_s
17
18
  end
18
19
 
19
- def edit(file=nil)
20
- @file = if file
21
- FileUtils.touch(file) unless File.exist?(file)
22
- File.new(file)
20
+ def edit(object, file=nil)
21
+ object = object == TOPLEVEL_BINDING.eval('self') ? nil : object
22
+
23
+ current_file = if file
24
+ FileUtils.touch(file) unless File.exist?(file)
25
+ File.new(file)
26
+ else
27
+ if @file && File.exist?(@file.path) && !object
28
+ @file
23
29
  else
24
- (@file && File.exist?(@file.path)) ? @file : Tempfile.new(["irb_tempfile", ".rb"])
30
+ Tempfile.new( object ? ["yobj_tempfile", ".yml"] : ["irb_tempfile", ".rb"] )
31
+ end
32
+ end
33
+
34
+ if object
35
+ File.open( current_file, 'w' ) { |f| f << object.to_yaml }
36
+ else
37
+ @file = current_file
38
+ mtime = File.stat(@file.path).mtime
25
39
  end
26
- mtime = File.stat(@file.path).mtime
27
40
 
28
- args = Shellwords.shellwords(@editor) #parse @editor as arguments could be complexe
29
- args << @file.path
30
- Exec.system(*args)
41
+ args = Shellwords.shellwords(@editor) #parse @editor as arguments could be complex
42
+ args << current_file.path
43
+ current_file.close rescue nil
44
+ Exec.system(*args)
31
45
 
32
- execute if mtime < File.stat(@file.path).mtime
46
+ if object
47
+ File.exists?(current_file.path) ? YAML.load_file(current_file.path) : object
48
+ elsif mtime < File.stat(@file.path).mtime
49
+ execute
50
+ end
33
51
  end
34
52
 
35
53
  def execute
36
54
  eval(IO.read(@file.path), TOPLEVEL_BINDING)
37
55
  end
38
56
 
39
- def self.edit(editor, file=nil)
57
+ def self.edit(editor, self_, file=nil)
40
58
  #maybe serialise last file to disk, for recovery
41
59
  (IRB.conf[:interactive_editors] ||=
42
- Hash.new { |h,k| h[k] = InteractiveEditor.new(k) })[editor].edit(file)
60
+ Hash.new { |h,k| h[k] = InteractiveEditor.new(k) })[editor].edit(self_, file)
43
61
  end
44
62
 
45
63
  module Exec
@@ -68,16 +86,20 @@ class InteractiveEditor
68
86
  :emacs => nil,
69
87
  :nano => nil,
70
88
  :mate => 'mate -w',
71
- :mvim => 'mvim -g -f -c "au VimLeave * !open -a Terminal"'
89
+ :mvim => 'mvim -g -f' + case ENV['TERM_PROGRAM']
90
+ when 'iTerm.app'; ' -c "au VimLeave * !open -a iTerm"'
91
+ when 'Apple_Terminal'; ' -c "au VimLeave * !open -a Terminal"'
92
+ else '' #don't do tricky things if we don't know the Term
93
+ end
72
94
  }.each do |k,v|
73
95
  define_method(k) do |*args|
74
- InteractiveEditor.edit(v || k, *args)
96
+ InteractiveEditor.edit(v || k, self, *args)
75
97
  end
76
98
  end
77
99
 
78
100
  def ed(*args)
79
101
  if ENV['EDITOR'].to_s.size > 0
80
- InteractiveEditor.edit(ENV['EDITOR'], *args)
102
+ InteractiveEditor.edit(ENV['EDITOR'], self, *args)
81
103
  else
82
104
  raise "You need to set the EDITOR environment variable first"
83
105
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interactive_editor
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
5
- prerelease: false
4
+ hash: 17
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- version: 0.0.6
9
+ - 7
10
+ version: 0.0.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jan Berkel
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-08 00:00:00 +01:00
18
+ date: 2011-03-11 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
79
  requirements: []
80
80
 
81
81
  rubyforge_project: interactive_editor
82
- rubygems_version: 1.3.7
82
+ rubygems_version: 1.4.2
83
83
  signing_key:
84
84
  specification_version: 2
85
85
  summary: Interactive editing in irb.