ruco 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  task :default => :spec
2
4
  require "rspec/core/rake_task"
3
5
  RSpec::Core::RakeTask.new(:spec) do |t|
@@ -20,18 +22,18 @@ end
20
22
  task :key do
21
23
  require 'curses'
22
24
 
23
- Curses.cbreak # provide unbuffered input
24
- Curses.noecho # turn off input echoing
25
+ Curses.noecho # do not show typed chars
25
26
  Curses.nonl # turn off newline translation
26
- Curses.stdscr.keypad(true) # turn on keypad mode
27
- # Curses.stdscr.nodelay = 1
27
+ Curses.stdscr.keypad(true) # enable arrow keys
28
+ Curses.raw # give us all other keys
29
+ Curses.stdscr.nodelay = 1 # do not block -> we can use timeouts
30
+ Curses.init_screen
28
31
 
29
-
30
32
  count = 0
31
33
  loop do
32
- key = Curses.getch
33
- next if key == 4294967295 # placeholder key when using nodelay mode
34
- break if key == ?\C-c
34
+ key = Curses.getch || 4294967295
35
+ next if key == 4294967295
36
+ exit if key == 3 # Ctrl+c
35
37
  count = (count + 1) % 20
36
38
  Curses.setpos(count,0)
37
39
  Curses.addstr("#{key.inspect} ");
data/Readme.md CHANGED
@@ -59,6 +59,8 @@ TODO
59
59
  - indentation + paste support
60
60
  - warnings / messages
61
61
  - syntax highlighting
62
+ - support more key-combos/codes in keyboard.rb
63
+ - search & replace
62
64
 
63
65
  Author
64
66
  ======
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.12
1
+ 0.0.13
data/bin/ruco CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # encoding: UTF-8
2
3
  require 'curses'
3
4
  require 'optparse'
4
5
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
@@ -38,11 +39,12 @@ def write(line,row,text)
38
39
  end
39
40
 
40
41
  def init_screen
41
- Curses.init_screen
42
42
  Curses.noecho # do not show typed chars
43
43
  Curses.nonl # turn off newline translation
44
44
  Curses.stdscr.keypad(true) # enable arrow keys
45
45
  Curses.raw # give us all other keys
46
+ Curses.stdscr.nodelay = 1 # do not block -> we can use timeouts
47
+ Curses.init_screen
46
48
 
47
49
  begin
48
50
  yield
@@ -86,6 +88,10 @@ def debug_key(key)
86
88
  write(@key_line, 0, "#{key}---")
87
89
  end
88
90
 
91
+ def log(stuff)
92
+ File.open('ruco.log','a'){|f| f.puts stuff }
93
+ end
94
+
89
95
  @options = parse_options
90
96
 
91
97
  require 'ruco'
@@ -51,7 +51,7 @@ module Ruco
51
51
  @focused.reset
52
52
  @focused = editor
53
53
  else
54
- @focused.insert(key)
54
+ @focused.insert(key) if key.is_a?(String)
55
55
  end
56
56
  end
57
57
 
@@ -20,4 +20,11 @@ class String
20
20
  end
21
21
  offset
22
22
  end
23
+
24
+ # stub for 1.8
25
+ unless method_defined?(:force_encoding)
26
+ def force_encoding(encoding)
27
+ self
28
+ end
29
+ end
23
30
  end
data/lib/ruco/keyboard.rb CHANGED
@@ -1,9 +1,25 @@
1
1
  class Keyboard
2
+ SEQUENCE_TIMEOUT = 0.01
3
+ NOTHING = 4294967295 # getch returns this as 'nothing' on 1.8 but nil on 1.9.2
2
4
  A_TO_Z = ('a'..'z').to_a
3
5
 
4
6
  def self.listen
5
7
  loop do
6
- key = Curses.getch
8
+ key = Curses.getch || NOTHING
9
+
10
+ if @sequence
11
+ if sequence_finished?
12
+ yield @sequence.pack('c*').force_encoding('utf-8')
13
+ @sequence = nil
14
+ else
15
+ @sequence << key unless key == NOTHING
16
+ end
17
+ next
18
+ end
19
+
20
+ next if key == NOTHING
21
+ log(key)
22
+
7
23
 
8
24
  code = case key
9
25
 
@@ -12,10 +28,18 @@ class Keyboard
12
28
  when Curses::Key::DOWN then :down
13
29
  when Curses::Key::RIGHT then :right
14
30
  when Curses::Key::LEFT then :left
31
+ when 554 then :"Ctrl+right"
32
+ when 555 then :"Ctrl+Shift+right"
33
+ when 539 then :"Ctrl+left"
34
+ when 540 then :"Ctrl+Shift+left"
35
+ when 560 then :"Ctrl+up"
36
+ when 519 then :"Ctrl+down"
15
37
  when Curses::KEY_END then :end
16
38
  when Curses::KEY_HOME then :home
17
39
  when Curses::KEY_NPAGE then :page_down
18
40
  when Curses::KEY_PPAGE then :page_up
41
+ when Curses::KEY_IC then :insert
42
+ when Curses::KEY_F0..Curses::KEY_F63 then :"F#{key - Curses::KEY_F0}"
19
43
 
20
44
  # modify
21
45
  when 9 then :tab
@@ -27,11 +51,21 @@ class Keyboard
27
51
  when 0 then :"Ctrl+space"
28
52
  when 1..26 then :"Ctrl+#{A_TO_Z[key-1]}"
29
53
  when 27 then :escape
54
+ when 195..197 # start of unicode sequence
55
+ @sequence = [key]
56
+ @sequence_started = Time.now.to_f
57
+ next
30
58
  else
31
- key.chr # printable
59
+ key > 255 ? key : key.chr # output printable chars
32
60
  end
33
61
 
34
62
  yield code
35
63
  end
36
64
  end
65
+
66
+ private
67
+
68
+ def self.sequence_finished?
69
+ (Time.now.to_f - @sequence_started) > SEQUENCE_TIMEOUT
70
+ end
37
71
  end
data/ruco.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ruco}
8
- s.version = "0.0.12"
8
+ s.version = "0.0.13"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Michael Grosser"]
@@ -28,6 +28,11 @@ describe Ruco::Application do
28
28
  app.view.should == "#{status.sub('.txt ','.txt*')}22\n2\n\n#{command}"
29
29
  end
30
30
 
31
+ it "does not enter key-codes" do
32
+ app.key(888)
33
+ app.view.should == "#{status}\n\n\n#{command}"
34
+ end
35
+
31
36
  it "can execute a command" do
32
37
  write("123\n456\n789\n")
33
38
  app.key(:"Ctrl+g") # go to line
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruco
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 5
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 12
9
- version: 0.0.12
9
+ - 13
10
+ version: 0.0.13
10
11
  platform: ruby
11
12
  authors:
12
13
  - Michael Grosser
@@ -71,7 +72,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
71
72
  requirements:
72
73
  - - ">="
73
74
  - !ruby/object:Gem::Version
74
- hash: -363384083
75
+ hash: 3
75
76
  segments:
76
77
  - 0
77
78
  version: "0"
@@ -80,6 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
81
  requirements:
81
82
  - - ">="
82
83
  - !ruby/object:Gem::Version
84
+ hash: 3
83
85
  segments:
84
86
  - 0
85
87
  version: "0"