rumacs 0.0.1

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/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2012 Jashank Jeremy.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the 'Software'), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,6 @@
1
+ rumacs
2
+ ======
3
+
4
+ [![Build Status](https://secure.travis-ci.org/Jashank/rumacs.png?branch=master)](http://travis-ci.org/Jashank/rumacs)
5
+
6
+ `rumacs` is an Emacs-alike lightweight text editor in Ruby.
data/Rakefile ADDED
@@ -0,0 +1,135 @@
1
+ # -*- ruby -*-
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rdoc'
5
+
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib]))
7
+
8
+ #############################################################################
9
+ #
10
+ # Helper functions
11
+ #
12
+ #############################################################################
13
+
14
+ def name
15
+ @name ||= Dir['*.gemspec'].first.split('.').first
16
+ end
17
+
18
+ def version
19
+ line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
20
+ line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
21
+ end
22
+
23
+ def date
24
+ Date.today.to_s
25
+ end
26
+
27
+ def rubyforge_project
28
+ name
29
+ end
30
+
31
+ def gemspec_file
32
+ "#{name}.gemspec"
33
+ end
34
+
35
+ def gem_file
36
+ "#{name}-#{version}.gem"
37
+ end
38
+
39
+ def replace_header(head, header_name)
40
+ head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
41
+ end
42
+
43
+ #############################################################################
44
+ #
45
+ # Standard tasks
46
+ #
47
+ #############################################################################
48
+
49
+ task :default => [:test]
50
+
51
+ require 'rake/testtask'
52
+ Rake::TestTask.new(:test) do |test|
53
+ test.libs << 'lib' << 'test'
54
+ test.pattern = 'test/**/test_*.rb'
55
+ test.verbose = true
56
+ end
57
+
58
+ desc "Generate RCov test coverage and open in your browser"
59
+ task :coverage do
60
+ require 'rcov'
61
+ sh "rm -fr coverage"
62
+ sh "rcov test/test_*.rb"
63
+ sh "open coverage/index.html"
64
+ end
65
+
66
+ require 'rdoc/task'
67
+ Rake::RDocTask.new do |rdoc|
68
+ rdoc.rdoc_dir = 'rdoc'
69
+ rdoc.title = "#{name} #{version}"
70
+ rdoc.rdoc_files.include('README*')
71
+ rdoc.rdoc_files.include('lib/**/*.rb')
72
+ end
73
+
74
+ desc "Open an irb session preloaded with this library"
75
+ task :console do
76
+ sh "irb -rubygems -r ./lib/#{name}.rb"
77
+ end
78
+
79
+ #############################################################################
80
+ #
81
+ # Custom tasks (add your own tasks here)
82
+ #
83
+ #############################################################################
84
+
85
+ #############################################################################
86
+ #
87
+ # Packaging tasks
88
+ #
89
+ #############################################################################
90
+
91
+ task :release => :build do
92
+ unless `git branch` =~ /^\* master$/
93
+ puts "You must be on the master branch to release!"
94
+ exit!
95
+ end
96
+ sh "git commit --allow-empty -m 'Release #{version}'"
97
+ sh "git tag v#{version}"
98
+ sh "git push origin master"
99
+ sh "git push origin v#{version}"
100
+ sh "gem push pkg/#{name}-#{version}.gem"
101
+ end
102
+
103
+ task :build => :gemspec do
104
+ sh "mkdir -p pkg"
105
+ sh "gem build #{gemspec_file}"
106
+ sh "mv #{gem_file} pkg"
107
+ end
108
+
109
+ task :gemspec do
110
+ # read spec file and split out manifest section
111
+ spec = File.read(gemspec_file)
112
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
113
+
114
+ # replace name version and date
115
+ replace_header(head, :name)
116
+ replace_header(head, :version)
117
+ replace_header(head, :date)
118
+ #comment this out if your rubyforge_project has a different name
119
+ replace_header(head, :rubyforge_project)
120
+
121
+ # determine file list from git ls-files
122
+ files = `git ls-files`.
123
+ split("\n").
124
+ sort.
125
+ reject { |file| file =~ /^\./ }.
126
+ reject { |file| file =~ /^(rdoc|pkg|coverage)/ }.
127
+ map { |file| " #{file}" }.
128
+ join("\n")
129
+
130
+ # piece file back together and write
131
+ manifest = " s.files = %w[\n#{files}\n ]\n"
132
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
133
+ File.open(gemspec_file, 'w') { |io| io.write(spec) }
134
+ puts "Updated #{gemspec_file}"
135
+ end
data/bin/.directory ADDED
File without changes
data/bin/rumacs ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- ruby -*-
3
+
4
+ require 'rubygems'
5
+ require 'rumacs'
6
+
7
+ Rumacs::init()
data/lib/.directory ADDED
File without changes
data/lib/rumacs.rb ADDED
@@ -0,0 +1,58 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+
5
+ module Rumacs
6
+ VERSION = '0.0.1'
7
+
8
+ def self.version
9
+ return VERSION
10
+ end
11
+
12
+ KNOWN_BACKENDS = [nil, :curses]
13
+ $backend = nil
14
+
15
+ def self.backend(new_backend)
16
+ if KNOWN_BACKENDS.include?(new_backend)
17
+ $backend = new_backend
18
+ load "rumacs/screen/#{$backend}.rb"
19
+ else
20
+ raise Exception "unknown backend #{new_backend}, known backends are #{KNOWN_BACKENDS}"
21
+ end
22
+ end
23
+
24
+ def self.init()
25
+ backend(:curses)
26
+ $screen = Rumacs::Screen.new
27
+ $filemgr = Rumacs::Files.new
28
+
29
+ $screen.init_screen do
30
+ $filemgr.load_text(<<LOAD_TEXT
31
+ Welcome to Rumacs #{VERSION}!
32
+ ========================
33
+
34
+ C-l :: backend.redraw
35
+
36
+ C-p, up :: point_move -1 0
37
+ C-n, down :: point_move 1 0
38
+ C-b, left :: point_move 0 -1
39
+ C-f, right :: point_move 0 1
40
+
41
+ C-a, home :: point_set nil 0
42
+ C-e, end:: point_set nil 0
43
+
44
+ C-x [...] :: compound_command_x
45
+ C-x C-c :: kill_rumacs
46
+
47
+ C-c [...] :: compound_command_c
48
+
49
+ [[other functionality to be implemented]]
50
+ LOAD_TEXT
51
+ )
52
+ $screen.key_loop
53
+ end
54
+ end
55
+
56
+ autoload :Screen, 'rumacs/screen'
57
+ autoload :Files, 'rumacs/files'
58
+ end
@@ -0,0 +1,19 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'curses'
5
+
6
+ module Rumacs
7
+ class Files
8
+ def initialize
9
+ end
10
+
11
+ def load_text(text)
12
+ $screen.put_lines(text.split("\n"))
13
+ end
14
+
15
+ def load_file(path)
16
+ nil
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,225 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+
5
+ module Rumacs
6
+ class Screen
7
+ attr_accessor :rows, :cols
8
+ attr_accessor :point_row, :point_col
9
+ attr_accessor :window_row, :window_col
10
+ attr_accessor :lines
11
+ attr_accessor :top_row
12
+ attr_accessor :backend
13
+
14
+ def initialize()
15
+ @rows = 0
16
+ @cols = 0
17
+ @point_row = 0
18
+ @point_col = 0
19
+ @window_row = 0
20
+ @window_col = 0
21
+ @lines = ['']
22
+ @top_row = 0
23
+ @backend = Rumacs::Screen::Backend.new(self)
24
+
25
+ @selected_keys = ""
26
+ end
27
+
28
+ def init_screen()
29
+ @backend.init_screen do
30
+ status_line()
31
+ yield
32
+ end
33
+ end
34
+
35
+ def kill_rumacs()
36
+ @backend.clean_exit
37
+ exit 0
38
+ end
39
+
40
+ def point_move(row_offset, col_offset)
41
+ if (row_offset != 0) then
42
+ shunt_row(row_offset)
43
+ elsif (col_offset != 0) then
44
+ shunt_col(col_offset)
45
+ end
46
+
47
+ status_line()
48
+ end
49
+
50
+ def shunt_row(row_offset)
51
+ if (@point_row <= 0) && (row_offset < 0) then
52
+ minibuf(:error, "Beginning of buffer") { sleep 1 }
53
+ elsif (@point_row >= @lines.length) && (row_offset > 0) then
54
+ minibuf(:error, "End of buffer") { sleep 1 }
55
+ else
56
+ @point_row += row_offset
57
+ if @point_col > ((@lines[@point_row] || '').size) then
58
+ @point_col = (@lines[@point_row] || '').size
59
+ end
60
+ end
61
+
62
+ @window_row = @point_row
63
+ end
64
+
65
+ def shunt_col(col_offset)
66
+ prev_line_length = @lines[@point_row-1].size
67
+ this_line_length = (@lines[@point_row] || '').size
68
+ if (@point_col >= this_line_length) && (col_offset > 0) then
69
+ col_offset = ((@point_col + col_offset) - this_line_length) - 1
70
+ shunt_row( +1 )
71
+ @point_col = col_offset
72
+ elsif (@point_col <= 0) && (col_offset < 0) then
73
+ shunt_row( -1 )
74
+ col_offset = prev_line_length - (@point_col + col_offset + 1)
75
+ @point_col = col_offset
76
+ else
77
+ @point_col += col_offset
78
+ end
79
+
80
+ @window_col = @point_col
81
+ end
82
+
83
+ def point_set(row, col)
84
+ if row === true then
85
+ @point_row = @lines.size
86
+ else
87
+ @point_row = (row || @point_row)
88
+ end
89
+
90
+ if col === true then
91
+ @point_col = (@lines[@point_row] || 0).size
92
+ else
93
+ @point_col = (col || @point_col)
94
+ end
95
+
96
+ @window_col = @point_col
97
+ status_line()
98
+ end
99
+
100
+ def put_lines(lines)
101
+ @lines = lines
102
+ @lines.collect! {|line| line || ''}
103
+ draw_lines
104
+ end
105
+
106
+ def draw_lines()
107
+ (0..(@rows-2)).to_a.each do |i|
108
+ @backend.draw_line(i, 0, @lines[@top_row+i])
109
+ end
110
+ end
111
+
112
+ def status_line()
113
+ status_string = "- rumacs - [#{@point_row},(#{@point_col}/#{(@lines[@point_row] || '').size}) inside #{@top_row}..#{@top_row + @rows - 2}] (#{@rows}:#{@cols}:#{$$}) "
114
+ @backend.draw_line_mode(@rows - 2, 0, status_string+("-" * (@cols - (status_string.size))), :statusbar)
115
+ @backend.jump_to_point()
116
+ end
117
+
118
+ def minibuf(type, str)
119
+ if (type == :warning) || (type == :error) then
120
+ @backend.notify
121
+ end
122
+ @backend.draw_line_mode(@rows - 1, 0, str, :minibuf)
123
+ @backend.jump_to_point()
124
+ @backend.redraw()
125
+ yield
126
+ @backend.draw_line_mode(@rows - 1, 0, " "*(@cols-1), :minibuf)
127
+ @backend.jump_to_point()
128
+ @backend.redraw()
129
+ end
130
+
131
+ $known_keys = {
132
+ # Redaw screen
133
+ :c_l => lambda {|i| i.backend.redraw },
134
+
135
+ # compound keys
136
+ :c_x => lambda {|i| i.compound_key_x },
137
+ :c_c => lambda {|i| i.compound_key_c },
138
+
139
+ # Point manipulation: screenful at a stroke (M-v and C-v)
140
+ :m_v => lambda {|i| i.point_move(-(@rows/2), 0) },
141
+ :pgup => :m_v,
142
+ :c_v => lambda {|i| i.point_move((@rows/2), 0) },
143
+ :pgdn => :c_v,
144
+
145
+ # Point manipulation: character at a stroke (C-p C-n C-b C-f)
146
+ :c_p => lambda {|i| i.point_move(-1, 0) },
147
+ :up => :c_p,
148
+ :c_n => lambda {|i| i.point_move( 1, 0) },
149
+ :down => :c_n,
150
+ :c_b => lambda {|i| i.point_move( 0, -1) },
151
+ :left => :c_b,
152
+ :c_f => lambda {|i| i.point_move( 0, 1) },
153
+ :right => :c_f,
154
+
155
+ # Point manipulation: jumps
156
+ :c_a => lambda {|i| i.point_set(nil, 0) },
157
+ :home => :c_a,
158
+ :c_e => lambda {|i| i.point_set(nil, true) },
159
+ :end => :c_e,
160
+ }
161
+
162
+ $known_compound_x = {
163
+ #:c_c => lambda {|i| i.compound_key_c },
164
+ :c_x => lambda {|i| i.compound_key_x },
165
+
166
+ :c_c => lambda {|i| i.kill_rumacs },
167
+ }
168
+
169
+ $known_compound_c = {
170
+ :c_c => lambda {|i| i.compound_key_c },
171
+ :c_x => lambda {|i| i.compound_key_x },
172
+ }
173
+
174
+ def unbound_key_warning(key)
175
+ minibuf(:warning, "'#{key.to_s}' is undefined.") { sleep 1 }
176
+ end
177
+
178
+ #
179
+ # This function is RECURSIVE! Do NOT refactor!
180
+ #
181
+ def call_key_in_table(key, table, rescuer)
182
+ if key.is_a? Symbol then
183
+ if table.key?(key) then
184
+ if table[key].is_a? Proc then
185
+ table[key].call(self)
186
+ elsif table[key].is_a? Symbol then
187
+ call_key_in_table(table[key], table, rescuer)
188
+ else
189
+ raise Exception.new("unknown type of known_key in #{key}")
190
+ end
191
+ else
192
+ unbound_key_warning(key)
193
+ end
194
+ else
195
+ rescuer.call(key)
196
+ end
197
+ end
198
+
199
+ def call_key(c)
200
+ call_key_in_table(c, $known_keys, lambda {|key| $filemgr.insert_character_at_point(key) })
201
+ end
202
+
203
+ def compound_key_x()
204
+ @selected_keys += "C-x "
205
+ minibuf(:notice, "#{@selected_keys}...") do
206
+ call_key_in_table(@backend.next_character, $known_compound_x, lambda {|key| abort_command })
207
+ end
208
+ @selected_keys = ""
209
+ end
210
+
211
+ def compound_key_c()
212
+ @selected_keys += "C-c "
213
+ minibuf(:notice, "#{@selected_keys}...") do
214
+ call_key_in_table(@backend.next_character, $known_compound_c, lambda {|key| abort_command })
215
+ end
216
+ @selected_keys = ""
217
+ end
218
+
219
+ def key_loop()
220
+ loop do
221
+ call_key(@backend.next_character)
222
+ end
223
+ end
224
+ end
225
+ end
@@ -0,0 +1,149 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'curses'
5
+ require 'io/console'
6
+ require 'colorize'
7
+
8
+ module Rumacs
9
+ class Screen
10
+ class Backend
11
+ def initialize(screen)
12
+ @screen = screen
13
+ rows, cols = $stdin.winsize
14
+ @screen.rows = rows
15
+ @screen.cols = cols
16
+ end
17
+
18
+ def init_screen()
19
+ Curses.init_screen
20
+ Curses.raw
21
+ Curses.noecho # do not show typed keys
22
+ Curses.stdscr.keypad(true) # enable arrow keys
23
+
24
+ # trap signals from kill; key strokes don't trigger anymore
25
+ for i in 1 .. 15 # SIGHUP .. SIGTERM
26
+ if trap(i, "SIG_IGN") != 0 then # 0 for SIG_IGN
27
+ trap(i) do |sig|
28
+ Curses.close_screen
29
+ puts "rumacs received an unexpected signal #{sig}."
30
+ exit sig
31
+ end
32
+ end
33
+ end
34
+
35
+ begin
36
+ yield
37
+ ensure
38
+ clean_exit
39
+ end
40
+ end
41
+
42
+ def clean_exit()
43
+ Curses.close_screen
44
+ end
45
+
46
+ CHARACTER_MAP = {
47
+ Curses::Key::PPAGE => :pgup,
48
+ Curses::Key::NPAGE => :pgdn,
49
+ Curses::Key::UP => :up,
50
+ Curses::Key::DOWN => :down,
51
+ Curses::Key::LEFT => :left,
52
+ Curses::Key::RIGHT => :right,
53
+ Curses::Key::HOME => :home,
54
+ Curses::Key::END => :end,
55
+ Curses::Key::IC => :insert,
56
+ Curses::Key::BACKSPACE => :backspace,
57
+ 127 => :backspace,
58
+ Curses::Key::DC => :delete,
59
+ Curses::Key::BTAB => :backtab,
60
+
61
+ 265 => :f_1,
62
+ 266 => :f_2,
63
+ 267 => :f_3,
64
+ 268 => :f_4,
65
+ 269 => :f_5,
66
+ 270 => :f_6,
67
+ 271 => :f_7,
68
+ 272 => :f_8,
69
+ 273 => :f_9,
70
+ 274 => :f_10,
71
+ 275 => :f_11,
72
+ 276 => :f_12,
73
+
74
+ 1 => :c_a,
75
+ 2 => :c_b,
76
+ 3 => :c_c,
77
+ 4 => :c_d,
78
+ 5 => :c_e,
79
+ 6 => :c_f,
80
+ 7 => :c_g,
81
+ 8 => :c_h,
82
+ 9 => :c_i,
83
+ 10 => :c_j,
84
+ 11 => :c_k,
85
+ 12 => :c_l,
86
+ 13 => :c_m,
87
+ 14 => :c_n,
88
+ 15 => :c_o,
89
+ 16 => :c_p,
90
+ 17 => :c_q,
91
+ 18 => :c_r,
92
+ 19 => :c_s,
93
+ 20 => :c_t,
94
+ 21 => :c_u,
95
+ 22 => :c_v,
96
+ 23 => :c_w,
97
+ 24 => :c_x,
98
+ 25 => :c_y,
99
+ 26 => :c_z,
100
+
101
+ 27 => :c_3,
102
+ 28 => :c_4,
103
+ 29 => :c_5,
104
+ 30 => :c_6,
105
+ 31 => :c_7,
106
+ 34 => :c_0,
107
+ }
108
+
109
+ def next_character
110
+ c = Curses.getch
111
+
112
+ if CHARACTER_MAP.include? c then
113
+ c = CHARACTER_MAP[c]
114
+ end
115
+
116
+ c
117
+ end
118
+
119
+ def redraw()
120
+ Curses.refresh
121
+ end
122
+
123
+ def jump_to_point()
124
+ Curses.setpos(@screen.point_row, @screen.point_col)
125
+ end
126
+
127
+ def draw_line(row, col, text)
128
+ Curses.setpos(row, col)
129
+ Curses.addstr((text || ''))
130
+ Curses.refresh
131
+ end
132
+
133
+ def notify()
134
+ Curses.beep
135
+ end
136
+
137
+ def draw_line_mode(row, col, text, mode)
138
+ curses_modes = {
139
+ :statusbar => Curses::A_REVERSE,
140
+ :minibuf => Curses::A_NORMAL,
141
+ }
142
+
143
+ Curses.attron(curses_modes[mode])
144
+ draw_line(row, col, text)
145
+ Curses.attroff(curses_modes[mode])
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,13 @@
1
+ # Assorted helper functions for Curses
2
+ module Rmacs
3
+ class Screen
4
+
5
+ C_A = 1
6
+ C_B = 2
7
+ C_C = 3
8
+ C_D = 4
9
+ C_E = 5
10
+ C_F = 6
11
+
12
+ end
13
+ end
data/rumacs.gemspec ADDED
@@ -0,0 +1,45 @@
1
+ # -*- ruby -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'rumacs'
5
+ s.version = '0.0.1'
6
+ s.date = '2012-08-19'
7
+
8
+ s.summary = "Emacs-alike lightweight text editor, in Ruby"
9
+ s.description = "rumacs is a lightweight text editor functionally similar to the Emacs family of text editors."
10
+
11
+ s.authors = ["Jashank Jeremy"]
12
+ s.email = 'jashank@rulingia.com'
13
+ s.homepage = 'http://jashank.github.com/rumacs'
14
+
15
+ s.require_paths = %w[lib]
16
+
17
+ s.executables = ["rumacs"]
18
+
19
+ s.rdoc_options = ["--charset=UTF-8"]
20
+ s.extra_rdoc_files = %w[README.md LICENSE]
21
+
22
+ s.add_development_dependency('rake', "~> 0.9")
23
+ s.add_development_dependency('rdoc', "~> 3.11")
24
+
25
+ s.add_runtime_dependency('activesupport', "~> 3.2.0")
26
+ s.add_runtime_dependency('colorize', "~> 0.5.0")
27
+
28
+ # = MANIFEST =
29
+ s.files = %w[
30
+ Gemfile
31
+ LICENSE
32
+ README.md
33
+ Rakefile
34
+ bin/.directory
35
+ bin/rumacs
36
+ lib/.directory
37
+ lib/rumacs.rb
38
+ lib/rumacs/files.rb
39
+ lib/rumacs/screen.rb
40
+ lib/rumacs/screen/curses.rb
41
+ lib/rumacs/screen/curses_helper.rb
42
+ rumacs.gemspec
43
+ ]
44
+ # = MANIFEST =
45
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rumacs
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jashank Jeremy
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-19 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '0.9'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '0.9'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdoc
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '3.11'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.11'
46
+ - !ruby/object:Gem::Dependency
47
+ name: activesupport
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 3.2.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 3.2.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: colorize
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.5.0
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.5.0
78
+ description: rumacs is a lightweight text editor functionally similar to the Emacs
79
+ family of text editors.
80
+ email: jashank@rulingia.com
81
+ executables:
82
+ - rumacs
83
+ extensions: []
84
+ extra_rdoc_files:
85
+ - README.md
86
+ - LICENSE
87
+ files:
88
+ - Gemfile
89
+ - LICENSE
90
+ - README.md
91
+ - Rakefile
92
+ - bin/.directory
93
+ - bin/rumacs
94
+ - lib/.directory
95
+ - lib/rumacs.rb
96
+ - lib/rumacs/files.rb
97
+ - lib/rumacs/screen.rb
98
+ - lib/rumacs/screen/curses.rb
99
+ - lib/rumacs/screen/curses_helper.rb
100
+ - rumacs.gemspec
101
+ homepage: http://jashank.github.com/rumacs
102
+ licenses: []
103
+ post_install_message:
104
+ rdoc_options:
105
+ - --charset=UTF-8
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ segments:
115
+ - 0
116
+ hash: 399386248576728796
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ segments:
124
+ - 0
125
+ hash: 399386248576728796
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 1.8.24
129
+ signing_key:
130
+ specification_version: 3
131
+ summary: Emacs-alike lightweight text editor, in Ruby
132
+ test_files: []