rcurses 0.1 → 0.3
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.
- checksums.yaml +4 -4
- data/README.md +17 -2
- data/lib/rcurses.rb +474 -472
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b705e1f22c190243e1564cd7b56018b152673e80f49ebfba5e7514ae1ebdc2c8
|
4
|
+
data.tar.gz: 8caf8faac21c53ef15c3e1845859475b0faadba9524fa960de7b617a4f074f69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: afbdf8595e9a4d5e8d32e6b229afae6886370f87e4692602a37f6beb501f898b4755cb84c9255ade3f252a850ee836df2691671af30623bbd952e5c3df1baa30
|
7
|
+
data.tar.gz: eb3093ac60c4452b5c11f9174b7219f359ac93613bc36da413002521d6ec5344bcaf0904a1f309907b76c749d97644b2490262b9a2f953202ea701b6db22c4d1
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# rcurses - An alternative curses library written in pure Ruby
|
2
2
|
|
3
|
-
  
|
3
|
+
 [](https://badge.fury.io/rb/rcurses)  
|
4
4
|
|
5
5
|
<img src="img/rcurses-logo.png" width="150" height="150">
|
6
6
|
|
@@ -14,7 +14,7 @@ Simple. One file. No external requirements.
|
|
14
14
|
# Installation
|
15
15
|
Clone this repo and drop `lib/rcurses.rb` into `/usr/lib/ruby/vendor_ruby/`
|
16
16
|
|
17
|
-
Or simply `gem install rcurses
|
17
|
+
Or simply run `gem install rcurses`.
|
18
18
|
|
19
19
|
To use this library do:
|
20
20
|
```
|
@@ -95,6 +95,8 @@ r | Set text to be printed in reverse colors (example: `"TEST".r`)
|
|
95
95
|
c(code) | Use coded format like "TEST".c("204,45,bui") to print "TEST" in bold, underline italic, fg=204 and bg=45 (the format is `.c("fg,bg,biulr"))
|
96
96
|
pure | Strip text of any "dressing" (example: with `text = "TEST".b`, you will have bold text in the variable `text`, then with `text.pure` it will show "uncoded" or pure text)
|
97
97
|
|
98
|
+
PS: Blink does not work in conjunction with setting a background color in urxvt. It does work in gnome-terminal. But the overall performance in urxvt as orders of magnitude better than gnome-terminal.
|
99
|
+
|
98
100
|
# module Cursor
|
99
101
|
Create a new cursor object with `mycursor = Cursor`. Then you can apply the following methods to `mycursor`:
|
100
102
|
|
@@ -190,6 +192,19 @@ while $stdin.ready?
|
|
190
192
|
end
|
191
193
|
```
|
192
194
|
|
195
|
+
# Example
|
196
|
+
|
197
|
+
Try this in `irb`:
|
198
|
+
```
|
199
|
+
require 'rcurses'
|
200
|
+
mypane = Pane.new("@maxcol/2", 30, 30, 10, 19, 229)
|
201
|
+
mypane.border = true
|
202
|
+
mypane.text = "Hello".i + " World!".b.i + "\n \n" + "rcurses".r + " " + "is cool".c("16,212")
|
203
|
+
mypane.refresh
|
204
|
+
mypane.edit
|
205
|
+
```
|
206
|
+
... and then try to add some bold text by enclosing it in '*' and italics by enclosing text in '/'. Then press 'ctrl-s' to save your edited text - and then type `mypane.refresh` to see the result.
|
207
|
+
|
193
208
|
# Not yet implemented
|
194
209
|
Let me know what other features you like to see.
|
195
210
|
|
data/lib/rcurses.rb
CHANGED
@@ -5,524 +5,526 @@
|
|
5
5
|
# Web_site: http://isene.com/
|
6
6
|
# Github: https://github.com/isene/rcurses
|
7
7
|
# License: Public domain
|
8
|
-
# Version
|
8
|
+
# Version: 0.3 : Namespace fix & gemspec etc included
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
@txt
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
10
|
+
module Rcurses
|
11
|
+
class Pane
|
12
|
+
attr_accessor :startx, :starty, :width, :height, :fg, :bg
|
13
|
+
attr_accessor :x, :y, :w, :h
|
14
|
+
attr_accessor :border, :scroll, :text, :ix, :align, :prompt
|
15
|
+
def initialize(startx=1, starty=1, width=1, height=1, fg=nil, bg=nil)
|
16
|
+
@startx, @starty, @width, @height, @fg, @bg = startx, starty, width, height, fg, bg
|
17
|
+
@text = "" # Initialize text variable
|
18
|
+
@align = "l" # Default alignment
|
19
|
+
@scroll = true # Initialize scroll indicators to true
|
20
|
+
@prompt = "" # Initialize prompt for editline
|
21
|
+
@c = Cursor # Local cursor object
|
22
|
+
@ix = 0 # Text index (starting text line in pane)
|
23
|
+
self.refresh # Draw the pane upon creation
|
24
|
+
end
|
25
|
+
def move (x,y)
|
26
|
+
self.startx = self.x + x
|
27
|
+
self.starty = self.y + y
|
28
|
+
self.refresh
|
29
|
+
end
|
30
|
+
def ansicheck(string, ansi)
|
31
|
+
ansi_beg = /\u0001\e\[#{ansi[0].to_s}m\u0002/
|
32
|
+
if ansi[0] == 38 or ansi[0] == 48
|
33
|
+
ansi_beg = /\u0001\e\[#{ansi[0].to_s}[\d;m]+\u0002/
|
34
|
+
end
|
35
|
+
ansi_end = /\u0001\e\[#{ansi[1].to_s}m\u0002/
|
36
|
+
begix = string.rindex(ansi_beg)
|
37
|
+
begix = -1 if begix == nil
|
38
|
+
endix = string.rindex(ansi_end)
|
39
|
+
endix = -1 if endix == nil
|
40
|
+
dirty = string[begix..-1].match(ansi_beg)[0] if begix > endix
|
41
|
+
dirty.to_s
|
42
|
+
end
|
43
|
+
def textformat(cont=self.text)
|
44
|
+
@txt = cont.split("\n") # Split text into array
|
45
|
+
if @txt.any? { |line| line.length >= self.w } # Splitx for lines breaking width
|
46
|
+
@txt = cont.splitx(self.w)
|
47
|
+
if cont != cont.pure # Treat lines that break ANSI escape codes
|
48
|
+
@dirty = "" # Initiate dirty flag (for unclosed ANSI escape sequence)
|
49
|
+
@txt.each_index do |i|
|
50
|
+
if @dirty != "" # If dirty flag is set from previous line then add the ANSI sequence to beginning of this line
|
51
|
+
@txt[i] = @dirty + @txt[i]; @dirty = ""
|
52
|
+
end
|
53
|
+
@dirty += ansicheck(@txt[i], [1,22]) # Bold
|
54
|
+
@dirty += ansicheck(@txt[i], [3,23]) # Italic
|
55
|
+
@dirty += ansicheck(@txt[i], [4,24]) # Underline
|
56
|
+
@dirty += ansicheck(@txt[i], [5,25]) # Blink
|
57
|
+
@dirty += ansicheck(@txt[i], [7,27]) # Reverse
|
58
|
+
@dirty += ansicheck(@txt[i], [38,0]) # Foreground color
|
59
|
+
@dirty += ansicheck(@txt[i], [48,0]) # Background color
|
60
|
+
@txt[i].sub!(/[\u0001\u0002\e\[\dm]*$/, '')
|
51
61
|
end
|
52
|
-
@dirty += ansicheck(@txt[i], [1,22]) # Bold
|
53
|
-
@dirty += ansicheck(@txt[i], [3,23]) # Italic
|
54
|
-
@dirty += ansicheck(@txt[i], [4,24]) # Underline
|
55
|
-
@dirty += ansicheck(@txt[i], [5,25]) # Blink
|
56
|
-
@dirty += ansicheck(@txt[i], [7,27]) # Reverse
|
57
|
-
@dirty += ansicheck(@txt[i], [38,0]) # Foreground color
|
58
|
-
@dirty += ansicheck(@txt[i], [48,0]) # Background color
|
59
|
-
@txt[i].sub!(/[\u0001\u0002\e\[\dm]*$/, '')
|
60
62
|
end
|
61
63
|
end
|
64
|
+
@txt
|
62
65
|
end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
self.x = 2 if self.x < 2; self.x = @maxcol - self.w if self.x + self.w > @maxcol
|
75
|
-
self.y = 2 if self.y < 2; self.y = @maxrow - self.h if self.y + self.h > @maxrow
|
76
|
-
else
|
77
|
-
self.x = 1 if self.x < 1; self.x = @maxcol - self.w + 1 if self.x + self.w > @maxcol + 1
|
78
|
-
self.y = 1 if self.y < 1; self.y = @maxrow - self.h + 1 if self.y + self.h > @maxrow + 1
|
79
|
-
end
|
80
|
-
@c.col(self.x); @c.row(self.y) # Cursor to start of pane
|
81
|
-
fmt = self.fg.to_s + "," + self.bg.to_s # Format for printing in pane (fg,bg)
|
82
|
-
@txt = textformat(cont) # Call function to create an array out of the pane text
|
83
|
-
@ix = @txt.length - 1 if @ix > @txt.length - 1; @ix = 0 if @ix < 0 # Ensuring no out-of-bounds
|
84
|
-
self.h.times do |i| # Print pane content
|
85
|
-
l = @ix + i # The current line to be printed
|
86
|
-
if @txt[l].to_s != "" # Print the text line for line
|
87
|
-
pl = self.w - @txt[l].pure.length; hl = pl/2 # Get padding width and half width
|
88
|
-
print @txt[l].c(fmt) + " ".c(fmt) * pl if self.align == "l"
|
89
|
-
print " ".c(fmt) * pl + @txt[l].c(fmt) if self.align == "r"
|
90
|
-
print " ".c(fmt) * hl + @txt[l].c(fmt) + " ".c(fmt) * (pl - hl) if self.align == "c"
|
66
|
+
def refresh(cont=self.text)
|
67
|
+
o_row, o_col = @c.pos
|
68
|
+
@c.row(8000); @c.col(8000) # Set for maxrow/maxcol
|
69
|
+
@maxrow, @maxcol = @c.pos
|
70
|
+
self.x = eval(self.startx.to_s)
|
71
|
+
self.y = eval(self.starty.to_s)
|
72
|
+
self.w = eval(self.width.to_s)
|
73
|
+
self.h = eval(self.height.to_s)
|
74
|
+
if self.border # Keep panes inside screen
|
75
|
+
self.x = 2 if self.x < 2; self.x = @maxcol - self.w if self.x + self.w > @maxcol
|
76
|
+
self.y = 2 if self.y < 2; self.y = @maxrow - self.h if self.y + self.h > @maxrow
|
91
77
|
else
|
92
|
-
|
78
|
+
self.x = 1 if self.x < 1; self.x = @maxcol - self.w + 1 if self.x + self.w > @maxcol + 1
|
79
|
+
self.y = 1 if self.y < 1; self.y = @maxrow - self.h + 1 if self.y + self.h > @maxrow + 1
|
80
|
+
end
|
81
|
+
@c.col(self.x); @c.row(self.y) # Cursor to start of pane
|
82
|
+
fmt = self.fg.to_s + "," + self.bg.to_s # Format for printing in pane (fg,bg)
|
83
|
+
@txt = textformat(cont) # Call function to create an array out of the pane text
|
84
|
+
@ix = @txt.length - 1 if @ix > @txt.length - 1; @ix = 0 if @ix < 0 # Ensuring no out-of-bounds
|
85
|
+
self.h.times do |i| # Print pane content
|
86
|
+
l = @ix + i # The current line to be printed
|
87
|
+
if @txt[l].to_s != "" # Print the text line for line
|
88
|
+
pl = self.w - @txt[l].pure.length; hl = pl/2 # Get padding width and half width
|
89
|
+
print @txt[l].c(fmt) + " ".c(fmt) * pl if self.align == "l"
|
90
|
+
print " ".c(fmt) * pl + @txt[l].c(fmt) if self.align == "r"
|
91
|
+
print " ".c(fmt) * hl + @txt[l].c(fmt) + " ".c(fmt) * (pl - hl) if self.align == "c"
|
92
|
+
else
|
93
|
+
print "".rjust(self.w).bg(self.bg)
|
94
|
+
end
|
95
|
+
r,c = @c.pos
|
96
|
+
@c.row(r + 1) # Cursor down one line
|
97
|
+
@c.col(self.x) # Cursor to start of pane
|
98
|
+
end
|
99
|
+
if @ix > 0 and self.scroll # Print "more" marker at top
|
100
|
+
@c.col(self.x + self.w - 1); @c.row(self.y)
|
101
|
+
print "▲".c(fmt)
|
93
102
|
end
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end
|
98
|
-
if @ix > 0 and self.scroll # Print "more" marker at top
|
99
|
-
@c.col(self.x + self.w - 1); @c.row(self.y)
|
100
|
-
print "▲".c(fmt)
|
101
|
-
end
|
102
|
-
if @txt.length - @ix > self.h and self.scroll # Print bottom "more" marker
|
103
|
-
@c.col(self.x + self.w - 1); @c.row(self.y + self.h - 1)
|
104
|
-
print "▼".c(fmt)
|
105
|
-
end
|
106
|
-
if self.border # Print border if self.border is set to "true"
|
107
|
-
@c.row(self.y - 1); @c.col(self.x - 1)
|
108
|
-
print ("┌" + "─" * self.w + "┐").c(fmt)
|
109
|
-
self.h.times do |i|
|
110
|
-
@c.row(self.y + i); @c.col(self.x - 1)
|
111
|
-
print "│".c(fmt)
|
112
|
-
@c.col(self.x + self.w)
|
113
|
-
print "│".c(fmt)
|
103
|
+
if @txt.length - @ix > self.h and self.scroll # Print bottom "more" marker
|
104
|
+
@c.col(self.x + self.w - 1); @c.row(self.y + self.h - 1)
|
105
|
+
print "▼".c(fmt)
|
114
106
|
end
|
115
|
-
|
116
|
-
|
107
|
+
if self.border # Print border if self.border is set to "true"
|
108
|
+
@c.row(self.y - 1); @c.col(self.x - 1)
|
109
|
+
print ("┌" + "─" * self.w + "┐").c(fmt)
|
110
|
+
self.h.times do |i|
|
111
|
+
@c.row(self.y + i); @c.col(self.x - 1)
|
112
|
+
print "│".c(fmt)
|
113
|
+
@c.col(self.x + self.w)
|
114
|
+
print "│".c(fmt)
|
115
|
+
end
|
116
|
+
@c.row(self.y + self.h); @c.col(self.x - 1)
|
117
|
+
print ("└" + "─" * self.w + "┘").c(fmt)
|
118
|
+
end
|
119
|
+
@c.row(o_row)
|
120
|
+
@c.col(o_col)
|
121
|
+
@txt
|
117
122
|
end
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
elsif @line + self.ix + 2 <= @txt.length
|
130
|
-
@line += 1
|
131
|
-
@pos = 0
|
123
|
+
def right
|
124
|
+
if @pos < @txt[self.ix + @line].length
|
125
|
+
@pos += 1
|
126
|
+
else
|
127
|
+
if @line == self.h
|
128
|
+
self.ix += 1 unless self.ix >= @txt.length
|
129
|
+
@pos = 0
|
130
|
+
elsif @line + self.ix + 2 <= @txt.length
|
131
|
+
@line += 1
|
132
|
+
@pos = 0
|
133
|
+
end
|
132
134
|
end
|
133
135
|
end
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
136
|
+
def left
|
137
|
+
if @pos == 0
|
138
|
+
if @line == 0
|
139
|
+
unless self.ix == 0
|
140
|
+
self.ix -= 1
|
141
|
+
@pos = @txt[self.ix + @line].length - 1
|
142
|
+
end
|
143
|
+
else
|
144
|
+
@line -= 1
|
140
145
|
@pos = @txt[self.ix + @line].length - 1
|
141
146
|
end
|
142
147
|
else
|
143
|
-
@
|
144
|
-
@pos = @txt[self.ix + @line].length - 1
|
148
|
+
@pos -= 1
|
145
149
|
end
|
146
|
-
else
|
147
|
-
@pos -= 1
|
148
150
|
end
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
151
|
+
def up
|
152
|
+
if @line == 0
|
153
|
+
self.ix -= 1 unless self.ix == 0
|
154
|
+
else
|
155
|
+
@line -= 1
|
156
|
+
end
|
157
|
+
begin
|
158
|
+
@pos = @txt[self.ix + @line].length - 1 if @pos > @txt[self.ix + @line].length - 1
|
159
|
+
rescue
|
160
|
+
end
|
159
161
|
end
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
162
|
+
def down
|
163
|
+
if @line == self.h - 1
|
164
|
+
self.ix += 1 unless self.ix + @line >= @txt.length - 1
|
165
|
+
elsif @line + self.ix + 2 <= @txt.length
|
166
|
+
@line += 1
|
167
|
+
end
|
168
|
+
begin
|
169
|
+
@pos = @txt[self.ix + @line].length - 1 if @pos > @txt[self.ix + @line].length - 1
|
170
|
+
rescue
|
171
|
+
end
|
166
172
|
end
|
167
|
-
|
168
|
-
|
169
|
-
|
173
|
+
def parse(cont)
|
174
|
+
cont.gsub!(/\*(.+?)\*/, '\1'.b)
|
175
|
+
cont.gsub!(/\/(.+?)\//, '\1'.i)
|
176
|
+
cont.gsub!(/_(.+?)_/, '\1'.u)
|
177
|
+
cont.gsub!(/#(.+?)#/, '\1'.r)
|
178
|
+
cont.gsub!(/<([^|]+)\|([^>]+)>/) do |m|
|
179
|
+
text = $2; codes = $1
|
180
|
+
text.c(codes)
|
181
|
+
end
|
182
|
+
cont
|
170
183
|
end
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
self.align = "c"
|
200
|
-
when 'C-Y' # Copy pane content to clipboard
|
201
|
-
system("echo '#{self.text.pure}' | xclip")
|
202
|
-
when 'C-S' # Save edited text back to self.text
|
203
|
-
cont = cont.gsub("¬", "\n")
|
204
|
-
cont = parse(cont)
|
205
|
-
self.text = cont
|
206
|
-
chr = "ESC"
|
207
|
-
when 'DEL' # Delete character
|
208
|
-
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
209
|
-
cont[posx] = ""
|
210
|
-
when 'BACK' # Backspace
|
211
|
-
left
|
212
|
-
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
213
|
-
cont[posx] = ""
|
214
|
-
when 'WBACK' # Word backspace
|
215
|
-
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
216
|
-
until cont[posx - 1] == " " or @pos == 0
|
184
|
+
def edit
|
185
|
+
cont = self.text.pure.gsub(/\n/, "¬\n")
|
186
|
+
@line = self.ix
|
187
|
+
@pos = 0
|
188
|
+
chr = ""
|
189
|
+
while chr != "ESC" # Keep going with readline until user presses ESC
|
190
|
+
@txt = self.refresh(cont)
|
191
|
+
@c.row(self.y + @line)
|
192
|
+
@c.col(self.x + @pos)
|
193
|
+
chr = getchr
|
194
|
+
case chr
|
195
|
+
when 'C-L' # Left justify
|
196
|
+
self.align = "l"
|
197
|
+
when 'C-R' # Right Justify
|
198
|
+
self.align = "r"
|
199
|
+
when 'C-C' # Center justify
|
200
|
+
self.align = "c"
|
201
|
+
when 'C-Y' # Copy pane content to clipboard
|
202
|
+
system("echo '#{self.text.pure}' | xclip")
|
203
|
+
when 'C-S' # Save edited text back to self.text
|
204
|
+
cont = cont.gsub("¬", "\n")
|
205
|
+
cont = parse(cont)
|
206
|
+
self.text = cont
|
207
|
+
chr = "ESC"
|
208
|
+
when 'DEL' # Delete character
|
209
|
+
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
210
|
+
cont[posx] = ""
|
211
|
+
when 'BACK' # Backspace
|
217
212
|
left
|
218
213
|
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
219
214
|
cont[posx] = ""
|
215
|
+
when 'WBACK' # Word backspace
|
216
|
+
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
217
|
+
until cont[posx - 1] == " " or @pos == 0
|
218
|
+
left
|
219
|
+
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
220
|
+
cont[posx] = ""
|
221
|
+
end
|
222
|
+
when 'C-K' # Kill line
|
223
|
+
begin
|
224
|
+
prev_l = 0
|
225
|
+
line_c = self.ix + @line
|
226
|
+
line_c.times {|i| prev_l += @txt[i].length + 1}
|
227
|
+
cur_l = @txt[line_c].length
|
228
|
+
cont.slice!(prev_l,cur_l)
|
229
|
+
rescue
|
230
|
+
end
|
231
|
+
when 'UP' # Up one line
|
232
|
+
up
|
233
|
+
when 'DOWN' # Down one line
|
234
|
+
down
|
235
|
+
when 'RIGHT' # Right one character
|
236
|
+
right
|
237
|
+
when 'LEFT' # Left one character
|
238
|
+
left
|
239
|
+
when 'HOME' # Start of line
|
240
|
+
@pos = 0
|
241
|
+
when 'END' # End of line
|
242
|
+
@pos = @txt[self.ix + @line].length - 1
|
243
|
+
when 'C-HOME' # Start of pane
|
244
|
+
@line = 0
|
245
|
+
@pos = 0
|
246
|
+
when 'C-END' # End of pane
|
247
|
+
when 'ENTER'
|
248
|
+
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
249
|
+
cont.insert(posx,"¬\n")
|
250
|
+
right
|
251
|
+
when /^.$/
|
252
|
+
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
253
|
+
cont.insert(posx,chr)
|
220
254
|
end
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
cont.
|
228
|
-
|
255
|
+
charx = 1
|
256
|
+
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
257
|
+
while $stdin.ready?
|
258
|
+
chr = $stdin.getc
|
259
|
+
charx += 1
|
260
|
+
posx += 1
|
261
|
+
cont.insert(posx,chr)
|
262
|
+
end
|
263
|
+
if chr =~ /^.$/
|
264
|
+
self.refresh(cont)
|
265
|
+
charx.times {right}
|
229
266
|
end
|
230
|
-
when 'UP' # Up one line
|
231
|
-
up
|
232
|
-
when 'DOWN' # Down one line
|
233
|
-
down
|
234
|
-
when 'RIGHT' # Right one character
|
235
|
-
right
|
236
|
-
when 'LEFT' # Left one character
|
237
|
-
left
|
238
|
-
when 'HOME' # Start of line
|
239
|
-
@pos = 0
|
240
|
-
when 'END' # End of line
|
241
|
-
@pos = @txt[self.ix + @line].length - 1
|
242
|
-
when 'C-HOME' # Start of pane
|
243
|
-
@line = 0
|
244
|
-
@pos = 0
|
245
|
-
when 'C-END' # End of pane
|
246
|
-
when 'ENTER'
|
247
|
-
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
248
|
-
cont.insert(posx,"¬\n")
|
249
|
-
right
|
250
|
-
when /^.$/
|
251
|
-
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
252
|
-
cont.insert(posx,chr)
|
253
|
-
end
|
254
|
-
charx = 1
|
255
|
-
posx = 0; (self.ix + @line).times {|i| posx += @txt[i].length + 1}; posx += @pos
|
256
|
-
while $stdin.ready?
|
257
|
-
chr = $stdin.getc
|
258
|
-
charx += 1
|
259
|
-
posx += 1
|
260
|
-
cont.insert(posx,chr)
|
261
|
-
end
|
262
|
-
if chr =~ /^.$/
|
263
|
-
self.refresh(cont)
|
264
|
-
charx.times {right}
|
265
|
-
end
|
266
267
|
|
268
|
+
end
|
269
|
+
# Keep?
|
270
|
+
@c.row(nil)
|
271
|
+
@c.col(nil)
|
267
272
|
end
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
self.
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
@pos = 0
|
301
|
-
when 'END' # To end of content
|
302
|
-
@pos = cont.length - 1
|
303
|
-
when 'DEL' # Delete character
|
304
|
-
cont[@pos] = ""
|
305
|
-
when 'BACK' # Backspace
|
306
|
-
@pos -= 1 unless @pos == 0
|
307
|
-
cont[@pos] = ""
|
308
|
-
when 'WBACK' # Word backspace
|
309
|
-
until cont[@pos - 1] == " " or @pos == 0
|
310
|
-
@pos -= 1
|
273
|
+
def editline
|
274
|
+
self.x = eval(self.startx.to_s)
|
275
|
+
self.y = eval(self.starty.to_s)
|
276
|
+
self.w = eval(self.width.to_s)
|
277
|
+
self.h = eval(self.height.to_s)
|
278
|
+
self.x = 1 if self.x < 1; self.x = @maxcol - self.w + 1 if self.x + self.w > @maxcol + 1
|
279
|
+
self.y = 1 if self.y < 1; self.y = @maxrow - self.h + 1 if self.y + self.h > @maxrow + 1
|
280
|
+
self.scroll = false
|
281
|
+
@c.row(self.y)
|
282
|
+
fmt = self.fg.to_s + "," + self.bg.to_s # Format for printing in pane (fg,bg)
|
283
|
+
@c.col(self.x); print self.prompt.c(fmt) # Print prompt from start of pane
|
284
|
+
pl = self.prompt.pure.length # Prompt length
|
285
|
+
cl = self.w - pl # Available content length
|
286
|
+
cont = self.text.pure # Actual content
|
287
|
+
@pos = cont.length # Initial position set at end of content
|
288
|
+
chr = "" # Initialize chr
|
289
|
+
while chr != "ESC" # Keep going with readline until user presses ESC
|
290
|
+
@c.col(self.x + pl) # Set cursor at start of content
|
291
|
+
cont = cont.slice(0,cl) # Trim content to max length
|
292
|
+
print cont.ljust(cl).c(fmt) # Print content left justified to max length
|
293
|
+
@c.col(self.x + pl + @pos) # Set cursor to current position (@pos)
|
294
|
+
chr = getchr # Read character from user input
|
295
|
+
case chr
|
296
|
+
when 'LEFT' # One character left
|
297
|
+
@pos -= 1 unless @pos == 0
|
298
|
+
when 'RIGHT' # One character right
|
299
|
+
@pos += 1 unless @pos >= cont.length
|
300
|
+
when 'HOME' # To start of content
|
301
|
+
@pos = 0
|
302
|
+
when 'END' # To end of content
|
303
|
+
@pos = cont.length - 1
|
304
|
+
when 'DEL' # Delete character
|
311
305
|
cont[@pos] = ""
|
306
|
+
when 'BACK' # Backspace
|
307
|
+
@pos -= 1 unless @pos == 0
|
308
|
+
cont[@pos] = ""
|
309
|
+
when 'WBACK' # Word backspace
|
310
|
+
until cont[@pos - 1] == " " or @pos == 0
|
311
|
+
@pos -= 1
|
312
|
+
cont[@pos] = ""
|
313
|
+
end
|
314
|
+
when 'C-K' # Kill line (set content to nothing)
|
315
|
+
cont = ""
|
316
|
+
@pos = 0
|
317
|
+
when 'ENTER' # Save content to self.text and end
|
318
|
+
self.text = parse(cont)
|
319
|
+
chr = 'ESC'
|
320
|
+
when /^.$/ # Add character to content
|
321
|
+
unless @pos >= cl - 1
|
322
|
+
cont.insert(@pos,chr)
|
323
|
+
@pos += 1
|
324
|
+
end
|
312
325
|
end
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
when /^.$/ # Add character to content
|
320
|
-
unless @pos >= cl - 1
|
321
|
-
cont.insert(@pos,chr)
|
322
|
-
@pos += 1
|
323
|
-
end
|
324
|
-
end
|
325
|
-
while $stdin.ready? # Add characters from pasted input
|
326
|
-
chr = $stdin.getc
|
327
|
-
unless @pos >= cl - 1
|
328
|
-
cont.insert(@pos,chr)
|
329
|
-
@pos += 1
|
326
|
+
while $stdin.ready? # Add characters from pasted input
|
327
|
+
chr = $stdin.getc
|
328
|
+
unless @pos >= cl - 1
|
329
|
+
cont.insert(@pos,chr)
|
330
|
+
@pos += 1
|
331
|
+
end
|
330
332
|
end
|
331
333
|
end
|
334
|
+
# Keep? Set cursor away from pane
|
335
|
+
@c.row(nil)
|
336
|
+
@c.col(nil)
|
332
337
|
end
|
333
|
-
# Keep? Set cursor away from pane
|
334
|
-
@c.row(nil)
|
335
|
-
@c.col(nil)
|
336
338
|
end
|
337
|
-
end
|
338
339
|
|
339
|
-
class String # Add coloring to strings (with escaping for Readline)
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
340
|
+
class String # Add coloring to strings (with escaping for Readline)
|
341
|
+
def fg(fg); color(self, "\001\e[38;5;#{fg}m\002", "\001\e[0m\002"); end # Foreground color code
|
342
|
+
def bg(bg); color(self, "\001\e[48;5;#{bg}m\002", "\001\e[0m\002"); end # Background color code
|
343
|
+
def fb(fg, bg); color(self, "\001\e[38;5;#{fg};48;5;#{bg}m\002"); end # Fore/Background color code
|
344
|
+
def b; color(self, "\001\e[1m\002", "\001\e[22m\002"); end # Bold
|
345
|
+
def i; color(self, "\001\e[3m\002", "\001\e[23m\002"); end # Italic
|
346
|
+
def u; color(self, "\001\e[4m\002", "\001\e[24m\002"); end # Underline
|
347
|
+
def l; color(self, "\001\e[5m\002", "\001\e[25m\002"); end # Blink
|
348
|
+
def r; color(self, "\001\e[7m\002", "\001\e[27m\002"); end # Reverse
|
349
|
+
def color(text, sp, ep) "#{sp}#{text}#{ep}" end # Internal function
|
350
|
+
def c(code) # Use format "TEST".c("204,45,bui") to print "TEST" in bold, underline italic, fg=204 and bg=45
|
351
|
+
prop = "\001\e["
|
352
|
+
prop += "38;5;#{code.match(/^\d+/).to_s};" if code.match(/^\d+/)
|
353
|
+
prop += "48;5;#{code.match(/(?<=,)\d+/).to_s};" if code.match(/(?<=,)\d+/)
|
354
|
+
prop += "1;" if code.match(/b/)
|
355
|
+
prop += "3;" if code.match(/i/)
|
356
|
+
prop += "4;" if code.match(/u/)
|
357
|
+
prop += "5;" if code.match(/l/)
|
358
|
+
prop += "7;" if code.match(/r/)
|
359
|
+
prop.chop! if prop[-1] == ";"
|
360
|
+
prop += "m\002"
|
361
|
+
prop += self
|
362
|
+
prop += "\001\e[0m\002"
|
363
|
+
#puts "\n XX\n" + code
|
364
|
+
prop
|
365
|
+
end
|
366
|
+
def pure
|
367
|
+
self.gsub(/\u0001.*?\u0002/, '')
|
368
|
+
end
|
369
|
+
def splitx(x)
|
370
|
+
lines = self.split("\n")
|
371
|
+
until lines.all? { |line| line.pure.length <= x } do
|
372
|
+
lines.map! do |l|
|
373
|
+
if l.pure.length > x and l[0..x].match(/ /)
|
374
|
+
@ix = l[0..x].rindex(" ")
|
375
|
+
[ l[0...@ix], l[(@ix + 1)..-1] ]
|
376
|
+
elsif l.pure.length > x
|
377
|
+
[l[0...x], l[x..-1]]
|
378
|
+
else
|
379
|
+
l
|
380
|
+
end
|
379
381
|
end
|
382
|
+
lines.flatten!
|
380
383
|
end
|
381
|
-
lines.
|
384
|
+
lines.reject { |e| e.to_s.empty? }
|
382
385
|
end
|
383
|
-
lines.reject { |e| e.to_s.empty? }
|
384
386
|
end
|
385
|
-
end
|
386
387
|
|
387
|
-
module Cursor # Terminal cursor movement ANSI codes (
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
388
|
+
module Cursor # Terminal cursor movement ANSI codes (inspired by https://github.com/piotrmurach/tty-cursor)
|
389
|
+
module_function
|
390
|
+
ESC = "\e".freeze
|
391
|
+
CSI = "\e[".freeze
|
392
|
+
def save # Save current position
|
393
|
+
print(Gem.win_platform? ? CSI + 's' : ESC + '7')
|
394
|
+
end
|
395
|
+
def restore # Restore cursor position
|
396
|
+
print(Gem.win_platform? ? CSI + 'u' : ESC + '8')
|
397
|
+
end
|
398
|
+
def pos # Query cursor current position
|
399
|
+
res = ''
|
400
|
+
$stdin.raw do |stdin|
|
401
|
+
$stdout << CSI + '6n' # Tha actual ANSI get-position
|
402
|
+
$stdout.flush
|
403
|
+
while (c = stdin.getc) != 'R'
|
404
|
+
res << c if c
|
405
|
+
end
|
404
406
|
end
|
407
|
+
m = res.match /(?<row>\d+);(?<col>\d+)/
|
408
|
+
return m[:row].to_i, m[:col].to_i
|
409
|
+
end
|
410
|
+
def rowget
|
411
|
+
row, col = self.pos
|
412
|
+
return row
|
413
|
+
end
|
414
|
+
def colget
|
415
|
+
row, col = self.pos
|
416
|
+
return col
|
417
|
+
end
|
418
|
+
def up(n = 1) # Move cursor up by n
|
419
|
+
print(CSI + "#{(n || 1)}A")
|
420
|
+
end
|
421
|
+
def down(n = 1) # Move the cursor down by n
|
422
|
+
print(CSI + "#{(n || 1)}B")
|
423
|
+
end
|
424
|
+
def left(n = 1) # Move the cursor backward by n
|
425
|
+
print(CSI + "#{n || 1}D")
|
426
|
+
end
|
427
|
+
def right(n = 1) # Move the cursor forward by n
|
428
|
+
print(CSI + "#{n || 1}C")
|
429
|
+
end
|
430
|
+
def col(n = 1) # Cursor moves to nth position horizontally in the current line
|
431
|
+
print(CSI + "#{n || 1}G")
|
432
|
+
end
|
433
|
+
def row(n = 1) # Cursor moves to the nth position vertically in the current column
|
434
|
+
print(CSI + "#{n || 1}d")
|
435
|
+
end
|
436
|
+
def next_line # Move cursor down to beginning of next line
|
437
|
+
print(CSI + 'E' + CSI + "1G")
|
438
|
+
end
|
439
|
+
def prev_line # Move cursor up to beginning of previous line
|
440
|
+
print(CSI + 'A' + CSI + "1G")
|
441
|
+
end
|
442
|
+
def clear_char(n = 1) # Erase n characters from the current cursor position
|
443
|
+
print(CSI + "#{n}X")
|
444
|
+
end
|
445
|
+
def clear_line # Erase the entire current line and return to beginning of the line
|
446
|
+
print(CSI + '2K' + CSI + "1G")
|
447
|
+
end
|
448
|
+
def clear_line_before # Erase from the beginning of the line up to and including the current cursor position.
|
449
|
+
print(CSI + '1K')
|
450
|
+
end
|
451
|
+
def clear_line_after # Erase from the current position (inclusive) to the end of the line
|
452
|
+
print(CSI + '0K')
|
453
|
+
end
|
454
|
+
def scroll_up # Scroll display up one line
|
455
|
+
print(ESC + 'M')
|
456
|
+
end
|
457
|
+
def scroll_down # Scroll display down one line
|
458
|
+
print(ESC + 'D')
|
459
|
+
end
|
460
|
+
def clear_screen_down # Clear screen down from current row
|
461
|
+
print(CSI + 'J')
|
405
462
|
end
|
406
|
-
m = res.match /(?<row>\d+);(?<col>\d+)/
|
407
|
-
return m[:row].to_i, m[:col].to_i
|
408
|
-
end
|
409
|
-
def rowget
|
410
|
-
row, col = self.pos
|
411
|
-
return row
|
412
|
-
end
|
413
|
-
def colget
|
414
|
-
row, col = self.pos
|
415
|
-
return col
|
416
|
-
end
|
417
|
-
def up(n = 1) # Move cursor up by n
|
418
|
-
print(CSI + "#{(n || 1)}A")
|
419
|
-
end
|
420
|
-
def down(n = 1) # Move the cursor down by n
|
421
|
-
print(CSI + "#{(n || 1)}B")
|
422
|
-
end
|
423
|
-
def left(n = 1) # Move the cursor backward by n
|
424
|
-
print(CSI + "#{n || 1}D")
|
425
|
-
end
|
426
|
-
def right(n = 1) # Move the cursor forward by n
|
427
|
-
print(CSI + "#{n || 1}C")
|
428
|
-
end
|
429
|
-
def col(n = 1) # Cursor moves to nth position horizontally in the current line
|
430
|
-
print(CSI + "#{n || 1}G")
|
431
|
-
end
|
432
|
-
def row(n = 1) # Cursor moves to the nth position vertically in the current column
|
433
|
-
print(CSI + "#{n || 1}d")
|
434
|
-
end
|
435
|
-
def next_line # Move cursor down to beginning of next line
|
436
|
-
print(CSI + 'E' + CSI + "1G")
|
437
|
-
end
|
438
|
-
def prev_line # Move cursor up to beginning of previous line
|
439
|
-
print(CSI + 'A' + CSI + "1G")
|
440
|
-
end
|
441
|
-
def clear_char(n = 1) # Erase n characters from the current cursor position
|
442
|
-
print(CSI + "#{n}X")
|
443
|
-
end
|
444
|
-
def clear_line # Erase the entire current line and return to beginning of the line
|
445
|
-
print(CSI + '2K' + CSI + "1G")
|
446
|
-
end
|
447
|
-
def clear_line_before # Erase from the beginning of the line up to and including the current cursor position.
|
448
|
-
print(CSI + '1K')
|
449
|
-
end
|
450
|
-
def clear_line_after # Erase from the current position (inclusive) to the end of the line
|
451
|
-
print(CSI + '0K')
|
452
|
-
end
|
453
|
-
def scroll_up # Scroll display up one line
|
454
|
-
print(ESC + 'M')
|
455
|
-
end
|
456
|
-
def scroll_down # Scroll display down one line
|
457
|
-
print(ESC + 'D')
|
458
|
-
end
|
459
|
-
def clear_screen_down # Clear screen down from current row
|
460
|
-
print(CSI + 'J')
|
461
463
|
end
|
462
|
-
end
|
463
464
|
|
464
|
-
def getchr # Function to process key presses
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
case $stdin.getc
|
470
|
-
when '[' # CSI
|
471
|
-
case $stdin.getc # Will get (or ASK) for more (remaining part of special character)
|
472
|
-
when 'A' then chr = "UP"
|
473
|
-
when 'B' then chr = "DOWN"
|
474
|
-
when 'C' then chr = "RIGHT"
|
475
|
-
when 'D' then chr = "LEFT"
|
476
|
-
when 'Z' then chr = "S-TAB"
|
477
|
-
when '2' then chr = "INS" ; chr = "C-INS" if $stdin.getc == "^"
|
478
|
-
when '3' then chr = "DEL" ; chr = "C-DEL" if $stdin.getc == "^"
|
479
|
-
when '5' then chr = "PgUP" ; chr = "C-PgUP" if $stdin.getc == "^"
|
480
|
-
when '6' then chr = "PgDOWN" ; chr = "C-PgDOWN" if $stdin.getc == "^"
|
481
|
-
when '7' then chr = "HOME" ; chr = "C-HOME" if $stdin.getc == "^"
|
482
|
-
when '8' then chr = "END" ; chr = "C-END" if $stdin.getc == "^"
|
483
|
-
else chr = ""
|
484
|
-
end
|
485
|
-
when 'O' # Set Ctrl+ArrowKey equal to ArrowKey; May be used for other purposes in the future
|
465
|
+
def getchr # Function to process key presses
|
466
|
+
c = $stdin.getch
|
467
|
+
case c
|
468
|
+
when "\e" # ANSI escape sequences (with only ESC, it should stop right here)
|
469
|
+
return "ESC" if $stdin.ready? == nil
|
486
470
|
case $stdin.getc
|
487
|
-
when '
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
471
|
+
when '[' # CSI
|
472
|
+
case $stdin.getc # Will get (or ASK) for more (remaining part of special character)
|
473
|
+
when 'A' then chr = "UP"
|
474
|
+
when 'B' then chr = "DOWN"
|
475
|
+
when 'C' then chr = "RIGHT"
|
476
|
+
when 'D' then chr = "LEFT"
|
477
|
+
when 'Z' then chr = "S-TAB"
|
478
|
+
when '2' then chr = "INS" ; chr = "C-INS" if $stdin.getc == "^"
|
479
|
+
when '3' then chr = "DEL" ; chr = "C-DEL" if $stdin.getc == "^"
|
480
|
+
when '5' then chr = "PgUP" ; chr = "C-PgUP" if $stdin.getc == "^"
|
481
|
+
when '6' then chr = "PgDOWN" ; chr = "C-PgDOWN" if $stdin.getc == "^"
|
482
|
+
when '7' then chr = "HOME" ; chr = "C-HOME" if $stdin.getc == "^"
|
483
|
+
when '8' then chr = "END" ; chr = "C-END" if $stdin.getc == "^"
|
484
|
+
else chr = ""
|
485
|
+
end
|
486
|
+
when 'O' # Set Ctrl+ArrowKey equal to ArrowKey; May be used for other purposes in the future
|
487
|
+
case $stdin.getc
|
488
|
+
when 'a' then chr = "C-UP"
|
489
|
+
when 'b' then chr = "C-DOWN"
|
490
|
+
when 'c' then chr = "C-RIGHT"
|
491
|
+
when 'd' then chr = "C-LEFT"
|
492
|
+
else chr = ""
|
493
|
+
end
|
492
494
|
end
|
495
|
+
when "", "" then chr = "BACK"
|
496
|
+
when "" then chr = "C-A"
|
497
|
+
when "" then chr = "C-B"
|
498
|
+
when "" then chr = "C-C"
|
499
|
+
when "^D" then chr = "C-D"
|
500
|
+
when "" then chr = "C-E"
|
501
|
+
when "" then chr = "C-F"
|
502
|
+
when "^G" then chr = "C-G"
|
503
|
+
when " " then chr = "C-I"
|
504
|
+
when "" then chr = "C-J"
|
505
|
+
when "" then chr = "C-K"
|
506
|
+
when "" then chr = "C-L"
|
507
|
+
when "
|
508
|
+
when "^N" then chr = "C-N"
|
509
|
+
when "^O" then chr = "C-O"
|
510
|
+
when "^P" then chr = "C-P"
|
511
|
+
when "" then chr = "C-Q"
|
512
|
+
when "" then chr = "C-R"
|
513
|
+
when "^T" then chr = "C-T"
|
514
|
+
when "" then chr = "C-U"
|
515
|
+
when "" then chr = "C-V"
|
516
|
+
when "" then chr = "C-X"
|
517
|
+
when "" then chr = "C-Y"
|
518
|
+
when "" then chr = "C-Z"
|
519
|
+
when "" then chr = "WBACK"
|
520
|
+
when "\r" then chr = "ENTER"
|
521
|
+
when "\t" then chr = "TAB"
|
522
|
+
when "" then chr = "C-S"
|
523
|
+
when /[[:print:]]/ then chr = c
|
524
|
+
else chr = ""
|
493
525
|
end
|
494
|
-
|
495
|
-
when "" then chr = "C-A"
|
496
|
-
when "" then chr = "C-B"
|
497
|
-
when "" then chr = "C-C"
|
498
|
-
when "^D" then chr = "C-D"
|
499
|
-
when "" then chr = "C-E"
|
500
|
-
when "" then chr = "C-F"
|
501
|
-
when "^G" then chr = "C-G"
|
502
|
-
when " " then chr = "C-I"
|
503
|
-
when "" then chr = "C-J"
|
504
|
-
when "" then chr = "C-K"
|
505
|
-
when "" then chr = "C-L"
|
506
|
-
when "
|
507
|
-
when "^N" then chr = "C-N"
|
508
|
-
when "^O" then chr = "C-O"
|
509
|
-
when "^P" then chr = "C-P"
|
510
|
-
when "" then chr = "C-Q"
|
511
|
-
when "" then chr = "C-R"
|
512
|
-
when "^T" then chr = "C-T"
|
513
|
-
when "" then chr = "C-U"
|
514
|
-
when "" then chr = "C-V"
|
515
|
-
when "" then chr = "C-X"
|
516
|
-
when "" then chr = "C-Y"
|
517
|
-
when "" then chr = "C-Z"
|
518
|
-
when "" then chr = "WBACK"
|
519
|
-
when "\r" then chr = "ENTER"
|
520
|
-
when "\t" then chr = "TAB"
|
521
|
-
when "" then chr = "C-S"
|
522
|
-
when /[[:print:]]/ then chr = c
|
523
|
-
else chr = ""
|
526
|
+
return chr
|
524
527
|
end
|
525
|
-
return chr
|
526
528
|
end
|
527
529
|
|
528
530
|
# vim: set sw=2 sts=2 et filetype=ruby fdm=syntax fdn=2 fcs=fold\:\ :
|
metadata
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rcurses
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Geir Isene
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-11-
|
11
|
+
date: 2024-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: Create panes (with the colors and(or border), manipulate the panes and
|
13
|
+
description: 'Create panes (with the colors and(or border), manipulate the panes and
|
14
14
|
add content. Dress up text (in panes or anywhere in the terminal) in bold, italic,
|
15
15
|
underline, reverse color, blink and in any 256 terminal colors for foreground and
|
16
16
|
background. Use a simple editor to let users edit text in panes. Left, right or
|
17
|
-
center align text in panes. Cursor movement around the terminal.
|
17
|
+
center align text in panes. Cursor movement around the terminal. New in 0.3: Namespace
|
18
|
+
fix & gemspec etc included'
|
18
19
|
email: g@isene.com
|
19
20
|
executables: []
|
20
21
|
extensions:
|