jota 0.9.0dev4 → 0.9.0dev5
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/lib/clip.rb +5 -2
- data/lib/helper.rb +13 -3
- data/lib/immediate.rb +4 -2
- data/lib/jota.rb +10 -4
- data/lib/jota_curses.rb +103 -43
- data/lib/version.rb +2 -2
- metadata +4 -5
data/lib/clip.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
# $Id: clip.rb
|
2
|
+
# $Id: clip.rb 287 2010-11-21 17:31:39Z dz $
|
3
3
|
|
4
4
|
require 'time'
|
5
5
|
require 'version'
|
@@ -158,11 +158,14 @@ def text=(str)
|
|
158
158
|
end
|
159
159
|
|
160
160
|
# Return modified title for easier readabiliy
|
161
|
+
# - empty string is replaced with "..."
|
162
|
+
# - tabs are replaced with 4 spaces
|
161
163
|
def title!
|
162
164
|
if @title.strip == "" then
|
163
165
|
return "..."
|
164
166
|
else
|
165
|
-
|
167
|
+
|
168
|
+
return expand_tabs(@title)
|
166
169
|
end
|
167
170
|
end
|
168
171
|
|
data/lib/helper.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
# $Id: helper.rb
|
2
|
+
# $Id: helper.rb 287 2010-11-21 17:31:39Z dz $
|
3
3
|
|
4
4
|
def escape_from(str)
|
5
5
|
str.gsub!(/\n(>*)From /,"\n\\1>From ")
|
@@ -12,17 +12,27 @@ def unescape_from(str)
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# expand strftime() time in str and expand %s to 'filename'
|
15
|
+
|
15
16
|
def expand_filename(str, dirname, filename)
|
17
|
+
# test on $RUBY_PLATFORM is less reliable, can be mswin, mingw, java
|
18
|
+
if ENV["HOMEDRIVE"] then
|
19
|
+
homedir = ENV["HOMEDRIVE"]+"\\"+ENV["HOMEPATH"]
|
20
|
+
else
|
21
|
+
homedir = ENV["HOME"]
|
22
|
+
end
|
16
23
|
result = Time.now.strftime(str)
|
17
24
|
result = result.gsub(/\$f/,filename)
|
18
|
-
result = result.gsub(/\$d/,dirname.gsub(/[^a-z0-9._-]+/i,"_"))
|
19
25
|
result = result.gsub(/\$p/,Process::pid.to_s)
|
20
|
-
result = result.gsub(/\$h/,
|
26
|
+
result = result.gsub(/\$h/,homedir)
|
21
27
|
result = result.gsub(/\$\$/,"$")
|
22
28
|
print_debug "expanding '#{filename}' to '#{result}'"
|
23
29
|
return result
|
24
30
|
end
|
25
31
|
|
32
|
+
def expand_tabs(str)
|
33
|
+
return str.gsub(/([^\t]{8})|([^\t]*)\t/n){[$+].pack("A8")}
|
34
|
+
end
|
35
|
+
|
26
36
|
def debug_file
|
27
37
|
if $debug_file.nil? then
|
28
38
|
begin
|
data/lib/immediate.rb
CHANGED
@@ -13,6 +13,7 @@ def open(filename)
|
|
13
13
|
begin
|
14
14
|
new_data = ClipArray.open(filename)
|
15
15
|
rescue AppError, SystemCallError => msg
|
16
|
+
puts msg
|
16
17
|
return nil
|
17
18
|
end
|
18
19
|
|
@@ -53,8 +54,9 @@ end
|
|
53
54
|
|
54
55
|
def list
|
55
56
|
print_verbose "immediately listing #{@data.length} clips"
|
56
|
-
@data.
|
57
|
-
|
57
|
+
@data.each_index do | i |
|
58
|
+
c = @data[i]
|
59
|
+
print "%d\t%s\t%s\n" % [i,c.type,c.title!]
|
58
60
|
end
|
59
61
|
@data.close
|
60
62
|
end
|
data/lib/jota.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
# $Id: jota.rb
|
3
|
+
# $Id: jota.rb 287 2010-11-21 17:31:39Z dz $
|
4
4
|
|
5
5
|
|
6
6
|
require 'getoptlong'
|
@@ -130,7 +130,8 @@ def parse_args
|
|
130
130
|
error("Illegal argument '#{opt}'")
|
131
131
|
end
|
132
132
|
end
|
133
|
-
rescue GetoptLong::InvalidOption
|
133
|
+
rescue GetoptLong::InvalidOption, GetoptLong::MissingArgument
|
134
|
+
puts "type #{$0} -h for help"
|
134
135
|
exit(EX_USAGE)
|
135
136
|
end
|
136
137
|
|
@@ -163,18 +164,23 @@ end
|
|
163
164
|
|
164
165
|
def goto_or_fail(object,re)
|
165
166
|
if not object.clip_array.goto_regexp(re) then
|
167
|
+
if object.respond_to? :finish then
|
168
|
+
object.finish # some objects needs to be tidied up
|
169
|
+
end
|
166
170
|
error("Clip with title matching /#{re}/ not found.")
|
167
171
|
end
|
168
172
|
end
|
169
173
|
|
170
174
|
def open_or_fail(object,filename)
|
171
175
|
if not object.open(filename) then
|
172
|
-
|
176
|
+
# error message should be written in object.open
|
177
|
+
error("")
|
173
178
|
end
|
174
179
|
end
|
175
180
|
|
176
181
|
def start_curses
|
177
182
|
curses = JotaCurses.new
|
183
|
+
|
178
184
|
if @filename then
|
179
185
|
open_or_fail(curses,@filename)
|
180
186
|
if @regexp then
|
@@ -299,7 +305,7 @@ def run
|
|
299
305
|
else
|
300
306
|
start_gui
|
301
307
|
end
|
302
|
-
|
308
|
+
|
303
309
|
if $VERBOSE then
|
304
310
|
print_verbose "stopped at #{Time.now}"
|
305
311
|
end
|
data/lib/jota_curses.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
# $Id: jota_curses.rb
|
2
|
+
# $Id: jota_curses.rb 287 2010-11-21 17:31:39Z dz $
|
3
3
|
|
4
4
|
require "curses"
|
5
5
|
require 'tempfile'
|
@@ -55,9 +55,10 @@ def initialize
|
|
55
55
|
@bot_bar = nil
|
56
56
|
|
57
57
|
@mode = :normal
|
58
|
-
|
59
58
|
@editor_running = false
|
60
59
|
|
60
|
+
default_focus
|
61
|
+
|
61
62
|
Curses.init_screen
|
62
63
|
Curses.cbreak
|
63
64
|
Curses.noecho
|
@@ -67,6 +68,7 @@ def initialize
|
|
67
68
|
@top_win_height = @lines/2
|
68
69
|
set_windows
|
69
70
|
|
71
|
+
|
70
72
|
begin
|
71
73
|
# set SIGgnal handler if terminal WINdow CHanged
|
72
74
|
Signal.trap("SIGWINCH") do
|
@@ -85,11 +87,16 @@ def initialize
|
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
90
|
+
def finish
|
91
|
+
Curses.close_screen
|
92
|
+
end
|
93
|
+
|
88
94
|
def open(filename)
|
89
95
|
begin
|
90
96
|
new_data = ClipArray.open(filename)
|
91
97
|
rescue AppError, SystemCallError => msg
|
92
|
-
|
98
|
+
finish
|
99
|
+
puts msg
|
93
100
|
return nil
|
94
101
|
end
|
95
102
|
|
@@ -205,18 +212,24 @@ def draw_bars
|
|
205
212
|
@top_bar.refresh
|
206
213
|
|
207
214
|
@mid_bar.clear
|
208
|
-
|
215
|
+
@mid_bar.addstr("==")
|
216
|
+
if @top_focus then
|
217
|
+
@mid_bar.addstr("^^^")
|
218
|
+
else
|
219
|
+
@mid_bar.addstr("vvv")
|
220
|
+
end
|
221
|
+
@mid_bar.addstr("="*(@columns-5))
|
209
222
|
@mid_bar.refresh
|
210
223
|
|
211
224
|
@bot_bar.clear
|
212
225
|
case @mode
|
213
226
|
when :normal
|
214
|
-
@bot_bar.addstr("Crsr=le/ri/up/dn, e=edit, n=new, d=del,
|
227
|
+
@bot_bar.addstr("Crsr=le/ri/up/dn, Tab=focus, e=edit, n=new, d=del, +/-=resize, h=help, q=quit")
|
215
228
|
when :help
|
216
|
-
@bot_bar.addstr("Crsr=up/dn, +/-=resize win, h/q=quit help")
|
229
|
+
@bot_bar.addstr("Crsr=up/dn, Tab=focus, +/-=resize win, h/q=quit help")
|
217
230
|
|
218
231
|
when :pref
|
219
|
-
@bot_bar.addstr("Crsr=up/dn, e=edit pref, +/-=resize win, p/q=quit pref")
|
232
|
+
@bot_bar.addstr("Crsr=up/dn, Tab=focus, e=edit pref, +/-=resize win, p/q=quit pref")
|
220
233
|
else
|
221
234
|
@bot_bar.addstr("h=help, q=quit")
|
222
235
|
end
|
@@ -234,7 +247,7 @@ def draw_top_window
|
|
234
247
|
end
|
235
248
|
if i < @data.length then
|
236
249
|
@top_win.addstr("%s %s\n" %
|
237
|
-
|
250
|
+
[marker, @data[i].title![@left_margin_top..@left_margin_top+@columns-4]])
|
238
251
|
end
|
239
252
|
end
|
240
253
|
end
|
@@ -244,7 +257,7 @@ end
|
|
244
257
|
def draw_bottom_window
|
245
258
|
print_debug "drawing text in #{@mode} mode"
|
246
259
|
case @mode
|
247
|
-
|
260
|
+
when :normal
|
248
261
|
if @data then
|
249
262
|
text = @data.current.text
|
250
263
|
else
|
@@ -266,10 +279,9 @@ def draw_bottom_window
|
|
266
279
|
arr = text.split(/\n/)
|
267
280
|
@bot_win_first.upto @bot_win_first+self.get_bot_win_height-1 do | i |
|
268
281
|
str = arr[i] || ""
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
@bot_win.addstr("\n")
|
282
|
+
str = expand_tabs(str)
|
283
|
+
@bot_win.addstr(str[@left_margin_bot..@left_margin_bot+@columns-2])
|
284
|
+
@bot_win.addstr("\n")
|
273
285
|
end
|
274
286
|
result = arr.length
|
275
287
|
@bot_win.refresh
|
@@ -283,7 +295,8 @@ Jota #{Version::STRING}, (C) #{Version::YEARS} #{Version::AUTHOR} <#{Version::AU
|
|
283
295
|
|
284
296
|
Keys:
|
285
297
|
Cursor up/down Scroll up/down
|
286
|
-
Cursor left/right
|
298
|
+
Cursor left/right Scroll left/right
|
299
|
+
Tab toggle focus between top and bottom window
|
287
300
|
e, ENTER Edit current clip (with $EDITOR)
|
288
301
|
n Append new clip
|
289
302
|
d Delete current clip
|
@@ -292,7 +305,7 @@ Jota #{Version::STRING}, (C) #{Version::YEARS} #{Version::AUTHOR} <#{Version::AU
|
|
292
305
|
c Create new file
|
293
306
|
C Close file
|
294
307
|
|
295
|
-
|
308
|
+
+,= Grow top window
|
296
309
|
- Shrink top window
|
297
310
|
p Preferences
|
298
311
|
! Execute command (default $SHELL)
|
@@ -347,9 +360,11 @@ def app_quit
|
|
347
360
|
if @data then
|
348
361
|
if really?("confirm_quit","Really quit?") then
|
349
362
|
@data.close
|
350
|
-
|
363
|
+
finish
|
364
|
+
exit
|
351
365
|
end
|
352
366
|
else
|
367
|
+
finish
|
353
368
|
exit
|
354
369
|
end
|
355
370
|
end
|
@@ -364,11 +379,18 @@ def call_editor(text)
|
|
364
379
|
return text
|
365
380
|
end
|
366
381
|
|
382
|
+
def default_focus
|
383
|
+
@top_focus = 0
|
384
|
+
@left_margin_top = 0
|
385
|
+
@left_margin_bot = 0
|
386
|
+
end
|
387
|
+
|
367
388
|
def handle_key
|
368
389
|
@bot_bar.move(0,79)
|
369
390
|
@bot_bar.refresh
|
370
391
|
# Ruby 1.8: getch return alway a Fixnum
|
371
|
-
# Ruby 1.9: getch return a String if char is printable (between " "
|
392
|
+
# Ruby 1.9: getch return a String if char is printable (between " "
|
393
|
+
# and "~"), Fixnum otherwise
|
372
394
|
begin
|
373
395
|
ch = @bot_bar.getch
|
374
396
|
ch = 0 if ch.nil?
|
@@ -381,7 +403,10 @@ def handle_key
|
|
381
403
|
case ch.chr
|
382
404
|
when "\f" # Ctrl-L
|
383
405
|
redraw_all
|
384
|
-
|
406
|
+
when "\t" # Tab
|
407
|
+
@top_focus = ! @top_focus
|
408
|
+
draw_bars
|
409
|
+
when "c"
|
385
410
|
filename = prompt_filename("Create File (?=list): ")
|
386
411
|
if filename and filename != "" then
|
387
412
|
create(filename)
|
@@ -403,19 +428,23 @@ def handle_key
|
|
403
428
|
when :normal
|
404
429
|
if @data then
|
405
430
|
@data.current.text = call_editor(@data.current.text)
|
431
|
+
default_focus
|
406
432
|
@data.save
|
407
433
|
end
|
408
434
|
when :pref
|
409
435
|
if @data
|
410
436
|
newpref = call_editor(@data.pref.write)
|
411
437
|
@data.pref = Preferences.read(newpref)
|
438
|
+
default_focus
|
412
439
|
end
|
413
440
|
end
|
414
441
|
when "h"
|
415
442
|
if @mode == :help then
|
416
443
|
@mode = :normal
|
444
|
+
@top_focus = true
|
417
445
|
else
|
418
446
|
@mode = :help
|
447
|
+
@top_focus = false
|
419
448
|
end
|
420
449
|
redraw_all
|
421
450
|
@bot_win_first = 0
|
@@ -424,6 +453,7 @@ def handle_key
|
|
424
453
|
@data.new
|
425
454
|
@mode = :normal
|
426
455
|
@data.current.text = call_editor(@data.current.text)
|
456
|
+
default_focus
|
427
457
|
@data.save
|
428
458
|
end
|
429
459
|
when "o"
|
@@ -435,8 +465,10 @@ def handle_key
|
|
435
465
|
when "p"
|
436
466
|
if @mode == :pref then
|
437
467
|
@mode = :normal
|
468
|
+
@top_focus = true
|
438
469
|
else
|
439
470
|
@mode = :pref
|
471
|
+
@top_focus = false
|
440
472
|
end
|
441
473
|
@bot_win_first = 0
|
442
474
|
redraw_all
|
@@ -446,7 +478,8 @@ def handle_key
|
|
446
478
|
else
|
447
479
|
@mode = :normal
|
448
480
|
end
|
449
|
-
when "+" # grow top window
|
481
|
+
when "+","=" # grow top window
|
482
|
+
# = is on the same key as + on us-layout
|
450
483
|
if @top_win_height + 5 <= @lines then
|
451
484
|
@top_win_height += 1
|
452
485
|
set_windows
|
@@ -479,33 +512,52 @@ def handle_key
|
|
479
512
|
end
|
480
513
|
else
|
481
514
|
case ch
|
482
|
-
when Curses::Key::LEFT
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
end
|
495
|
-
@mode = :normal
|
496
|
-
end
|
515
|
+
when Curses::Key::LEFT
|
516
|
+
if @top_focus then
|
517
|
+
@left_margin_top -= 1 if @left_margin_top >= 1
|
518
|
+
else
|
519
|
+
@left_margin_bot -= 1 if @left_margin_bot >= 1
|
520
|
+
end
|
521
|
+
when Curses::Key::RIGHT
|
522
|
+
if @top_focus then
|
523
|
+
@left_margin_top += 1
|
524
|
+
else
|
525
|
+
@left_margin_bot += 1
|
526
|
+
end
|
497
527
|
when Curses::Key::UP, Curses::Key::DOWN
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
528
|
+
if @data then
|
529
|
+
if @top_focus then
|
530
|
+
@data.current.pos = @bot_win_first
|
531
|
+
if ch == Curses::Key::UP then
|
532
|
+
@data.prev
|
533
|
+
else
|
534
|
+
@data.next
|
535
|
+
end
|
536
|
+
if @data.current.pos then
|
537
|
+
@bot_win_first = @data.current.pos
|
538
|
+
else
|
539
|
+
@bot_win_first = 0
|
540
|
+
end
|
541
|
+
@mode = :normal
|
542
|
+
else
|
543
|
+
if ch == Curses::Key::UP then
|
544
|
+
@bot_win_first -= 1
|
545
|
+
else
|
546
|
+
@bot_win_first += 1
|
547
|
+
end
|
548
|
+
|
549
|
+
end
|
550
|
+
end
|
505
551
|
when Curses::Key::HOME
|
506
552
|
if @data then
|
507
553
|
@bot_win_first = 0
|
508
554
|
end
|
555
|
+
when Curses::Key::END
|
556
|
+
# XXX
|
557
|
+
when Curses::Key::NPAGE
|
558
|
+
# XXX
|
559
|
+
when Curses::Key::PPAGE
|
560
|
+
# XXX
|
509
561
|
end
|
510
562
|
end
|
511
563
|
|
@@ -565,8 +617,16 @@ def prompt_filename(str)
|
|
565
617
|
filename = prompt(str)
|
566
618
|
if filename == "?" then
|
567
619
|
@bot_win.clear
|
568
|
-
|
569
|
-
|
620
|
+
@bot_win.addstr File.expand_path(".")
|
621
|
+
@bot_win.addstr(":\n")
|
622
|
+
ent = (Dir.entries ".").sort
|
623
|
+
ent.each do | f |
|
624
|
+
next if f =~ /^\./
|
625
|
+
@bot_win.addstr(f)
|
626
|
+
if File.directory? f then
|
627
|
+
@bot_win.addstr("/")
|
628
|
+
end
|
629
|
+
@bot_win.addstr("\t")
|
570
630
|
end
|
571
631
|
@bot_win.refresh
|
572
632
|
else
|
data/lib/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
# $Id: version.rb
|
2
|
+
# $Id: version.rb 285 2010-11-21 09:26:46Z dz $
|
3
3
|
|
4
4
|
|
5
5
|
class Version
|
@@ -29,7 +29,7 @@ MAJOR = 0
|
|
29
29
|
MINOR = 9
|
30
30
|
PATCH = 0
|
31
31
|
STATE = "dev" # "dev", "beta", "rc", "" (for final)
|
32
|
-
STATEVER =
|
32
|
+
STATEVER = 5
|
33
33
|
|
34
34
|
STRING = "%d.%d.%d%s" % [MAJOR, MINOR,PATCH,Version.state]
|
35
35
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jota
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 470221477
|
5
5
|
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 0dev5
|
10
|
+
version: 0.9.0dev5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Derik van Zuetphen
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-11-22 08:22:25 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -23,7 +23,6 @@ description: ""
|
|
23
23
|
email: dz@426.ch
|
24
24
|
executables:
|
25
25
|
- jota
|
26
|
-
- jota.bat
|
27
26
|
extensions: []
|
28
27
|
|
29
28
|
extra_rdoc_files:
|