From neoneye at rubyforge.org Tue Feb 1 02:30:26 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 1 02:30:28 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source README Message-ID: <200502010730.j117UQdS028231@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv28222 Modified Files: README Log Message: described smart home in more detail. Index: README =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/README,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** README 29 Jan 2005 14:22:17 -0000 1.12 --- README 1 Feb 2005 07:30:24 -0000 1.13 *************** *** 6,10 **** no advanced edit strategies (it has a new datastructure that rocks). No undo/redo. If we don't consider the code for wrapping libncursesw, ! then the core of the editor only takes up 1200 lines of ruby code. This README is written with this editor. --- 6,10 ---- no advanced edit strategies (it has a new datastructure that rocks). No undo/redo. If we don't consider the code for wrapping libncursesw, ! then the core of the editor only takes up 1500 lines of ruby code. This README is written with this editor. *************** *** 40,44 **** backspace ...... erase char left of cursor (or selection) delete ......... erase char right of cursor (or selection) ! home ........... move cursor to linebegin end ............ move cursor to lineend ctrl left ...... move word left --- 40,44 ---- backspace ...... erase char left of cursor (or selection) delete ......... erase char right of cursor (or selection) ! home ........... move cursor either to linebegin or textbegin end ............ move cursor to lineend ctrl left ...... move word left From neoneye at rubyforge.org Tue Feb 1 02:36:27 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 1 02:36:29 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source TODO Message-ID: <200502010736.j117aRdS028303@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv28298 Modified Files: TODO Log Message: more stuff to do Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** TODO 31 Jan 2005 22:34:46 -0000 1.37 --- TODO 1 Feb 2005 07:36:25 -0000 1.38 *************** *** 4,8 **** ! resizing of window should flush the render_cache. --- 4,11 ---- ! user-interface: ! * resizing of window should flush the render_cache. ! * F1 should provide help. ! * search dialog (ala editpad). From neoneye at rubyforge.org Tue Feb 1 11:12:38 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 1 11:12:39 2005 Subject: [Aeditor-commit] projects/documents/homepage2 weblog.html Message-ID: <200502011612.j11GCcdS001572@rubyforge.org> Update of /var/cvs/aeditor/projects/documents/homepage2 In directory rubyforge.org:/tmp/cvs-serv1564 Modified Files: weblog.html Log Message: status for today. Index: weblog.html =================================================================== RCS file: /var/cvs/aeditor/projects/documents/homepage2/weblog.html,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** weblog.html 19 Jan 2005 19:21:57 -0000 1.3 --- weblog.html 1 Feb 2005 16:12:36 -0000 1.4 *************** *** 36,39 **** --- 36,82 ----
+

Things I did today - 01 feb 2005

+

I have had my first day free from job in long time, so I have + been busy with solving all kind of issues (Things that I really + should have been doing ages ago). Im usually very bad at solving + realworld issues, because im sucked into a computer most of the time.

+ +

Someone tried to break in to my appartment this weekend, + apparently nothing got stolen. Its impossible for me to tell if + any of the backup cds are gone :-(. With that whole in + the window the temperature has been quite low inside. Today I + have arranged to get the broken window fixed.

+ +

On the job we released our program yesterday (31 jan 2005), so + my colleagues wanted to be able to reach me no matter + where i am, in case the customer has problems with our product. + I had a heavy cellphone ages ago, which I never used. + Today I have bought a cheap cellphone.

+ +

I have had these glasses for a long time, so long that they had + become ugly and twisted. Today I went to glass-specialist and got + the glasses rewamped. They look and feels now as good as new. + +

Today I went to the university and bought all the books that + I need for this course on the university. Plus I bought the + Programming Ruby second edition (and discovered that my + [ruby embedded into c++] project was mentioned in it, exciting).

+ +

Today I have rearranged the furnitures and cleaned up my + appartment, carried down 3 monitors and 6 computers + to my basement. All the piles of A4 papers have been putted in bags + and has been stored under my bed. My university assignments has been + put into a ringbinder.

+ +

In the appartment complex where I live, we are about to get + a cheap internet+phone+tv connection. Today I have been filling + out 3 formulars so that it can be installed at my place.

+ +

Today I talked in phone with the tax woman, attempting to figure + out how to solve a tax issue of mine. But I never really understood + this. Maybe im bad at money.

+ +

And today perhaps my 19" tft display will arrive?

+

AEditor 2.1 released - 19 jan 2005

Yesterday I packed up 2.1, codename "megacorp". Since last From neoneye at rubyforge.org Tue Feb 1 16:32:17 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 1 16:32:19 2005 Subject: [Aeditor-commit] projects/documents/homepage/aeditor_shots 054.png Message-ID: <200502012132.j11LWHdS017995@rubyforge.org> Update of /var/cvs/aeditor/projects/documents/homepage/aeditor_shots In directory rubyforge.org:/tmp/cvs-serv17966 Added Files: 054.png Log Message: draft on how I imaging aeditor should evolve. --- NEW FILE: 054.png --- (This appears to be a binary file; contents omitted.) From neoneye at rubyforge.org Wed Feb 2 13:24:43 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 2 13:24:45 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source main_tui.rb ncursesw.rb Message-ID: <200502021824.j12IOhdS028066@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv28022 Modified Files: main_tui.rb ncursesw.rb Log Message: Lines that contained fullwidth chars got rendered incorrect, because I discarded its x information.. and padded with too many spaces. Now they render better. Discovered another glitch.. when the window is very narrow, then ncurses or xterm seems to place other places that we asked it for. The text being rendered has weird glyphs in it. Maybe its because I don't use addnstr ? Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.69 retrieving revision 1.70 diff -C2 -d -r1.69 -r1.70 *** main_tui.rb 31 Jan 2005 21:14:32 -0000 1.69 --- main_tui.rb 2 Feb 2005 18:24:41 -0000 1.70 *************** *** 246,249 **** --- 246,274 ---- @canvas.height end + def push_halfwidth(glyph, pen) + @x += 1 + return if @x - @scroll_x <= 0 + return if @x - @scroll_x > width + @render_glyphs[@n] = glyph + @render_pens[@n] = pen + @n += 1 + end + def push_fullwidth(glyph, pen) + if @x - @scroll_x == -1 + @x += 1 + push_halfwidth(32, pen) + return + end + if @x - @scroll_x == width - 1 + push_halfwidth(32, pen) + return + end + @x += 2 + return if @x - @scroll_x <= 0 + return if @x - @scroll_x > width + @render_glyphs[@n] = glyph + @render_pens[@n] = pen + @n += 1 + end def render_row(vy, text, ay, options) *************** *** 278,287 **** ! n = 6 - @scroll_x # reserve some space for line-numbers ! x = 0 (text || '').unpack('U*').each do |glyph| ! w = measure_width(x, glyph) pen = nil ! if sel1 <= x and x < sel2 pen = 3 end --- 303,312 ---- ! @n = 6 # reserve some space for line-numbers ! @x = 0 (text || '').unpack('U*').each do |glyph| ! w = measure_width(@x, glyph) pen = nil ! if sel1 <= @x and @x < sel2 pen = 3 end *************** *** 289,346 **** w = 0 # ignore newlines elsif glyph == 9 ! @render_glyphs[n] = 32 # 0x2192 # 0x2500 # 46 ! @render_pens[n] = pen || 8 ! n += 1 (w-1).times do ! @render_glyphs[n] = 32 ! @render_pens[n] = pen || 8 ! n += 1 end ! elsif x >= @scroll_x ! @render_glyphs[n] = glyph ! @render_pens[n] = pen || 1 ! n += 1 else ! w.times do ! @render_glyphs[n] = 32 ! @render_pens[n] = pen || 1 ! n += 1 ! end end - x += w end ! (@scroll_x + width - x).times do pen = nil ! if sel1 <= x and x < sel2 pen = 3 end ! ! @render_glyphs[n] = 32 ! @render_pens[n] = pen || 1 ! n += 1 ! x += 1 end # format linenumbers - ofs = 0 5.times do |i| ! @render_pens[ofs + i] = 4 end if ay number = (ay+1).to_s.rjust(5) 0.upto(4) do |i| ! @render_glyphs[ofs + i] = number[i] end else 0.upto(4) do |i| ! @render_glyphs[ofs + i] = 32 end end ! @render_pens[ofs + 5] = 6 ! @render_glyphs[ofs + 5] = 0x2502 # show fold if (options & 2) != 0 ! @render_glyphs[ofs + 5] = 32 # 0x256f # 0x2570 @render_pens.map!{5} end --- 314,359 ---- w = 0 # ignore newlines elsif glyph == 9 ! # these are also nice glyphs: 0x2192, 0x2500, 46 ! push_halfwidth(32, pen || 8) (w-1).times do ! push_halfwidth(32, pen || 8) end ! elsif w == 1 ! push_halfwidth(glyph, pen || 1) ! elsif w == 2 ! push_fullwidth(glyph, pen || 1) else ! $logger.error "unknown glyph #{glyph.inspect}" ! raise "glyph problem" end end ! while @x < @scroll_x + width pen = nil ! if sel1 <= @x and @x < sel2 pen = 3 end ! push_halfwidth(32, pen || 1) end # format linenumbers 5.times do |i| ! @render_pens[i] = 4 end if ay number = (ay+1).to_s.rjust(5) 0.upto(4) do |i| ! @render_glyphs[i] = number[i] end else 0.upto(4) do |i| ! @render_glyphs[i] = 32 end end ! @render_pens[5] = 6 ! @render_glyphs[5] = 0x2502 # show fold if (options & 2) != 0 ! @render_glyphs[5] = 32 # 0x256f # 0x2570 @render_pens.map!{5} end *************** *** 350,354 **** #@render_glyphs[x + 5] = 0x2570 # 45 5.times do |i| ! @render_pens[ofs + i] = 3 end end --- 363,367 ---- #@render_glyphs[x + 5] = 0x2570 # 45 5.times do |i| ! @render_pens[i] = 3 end end *************** *** 358,367 **** if (@view.sel_y < ay and ay < @view.cursor_y) or (@view.cursor_y < ay and ay < @view.sel_y) ! width.times do |i| ! @render_pens[ofs + 6 + i] = 3 end end end #=begin @canvas.render_row2( --- 371,383 ---- if (@view.sel_y < ay and ay < @view.cursor_y) or (@view.cursor_y < ay and ay < @view.sel_y) ! (@n-6).times do |i| ! @render_pens[6 + i] = 3 end end end + #if ay == 0 + # $logger.info "line0 = #{@render_glyphs[0, @n].inspect} n=#{@n}" + #end #=begin @canvas.render_row2( *************** *** 369,381 **** @render_glyphs, @render_pens, ! ofs, ! width+6 ) #=end end def cursor_show(x, y) ! @canvas.move(6 + x - @scroll_x, y) end def refresh @canvas.refresh end --- 385,400 ---- @render_glyphs, @render_pens, ! 0, ! @n ) #=end end def cursor_show(x, y) ! cx = 6 + x - @scroll_x ! #$logger.info "cx=#{cx} cy=#{y}" ! @canvas.move(cx, y) end def refresh + #$logger.info "curses refresh" @canvas.refresh end *************** *** 385,389 **** @tabsize - (x % @tabsize) else - #LibC.wcwidth(glyph) @canvas.measure_width(glyph) end --- 404,407 ---- Index: ncursesw.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/ncursesw.rb,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** ncursesw.rb 28 Jan 2005 21:00:20 -0000 1.23 --- ncursesw.rb 2 Feb 2005 18:24:41 -0000 1.24 *************** *** 99,102 **** --- 99,103 ---- move(0, y) clear_to_eol + move(0, y) n.times do set_color(pens[i]) From neoneye at rubyforge.org Wed Feb 2 13:37:03 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 2 13:37:04 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES TODO Message-ID: <200502021837.j12Ib3dS028330@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv28326 Modified Files: CHANGES TODO Log Message: problems with rendering Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** CHANGES 31 Jan 2005 22:34:46 -0000 1.36 --- CHANGES 2 Feb 2005 18:37:01 -0000 1.37 *************** *** 1,3 **** ! 31-01-2005 Neoneye 5D * improved View#move_linebegin's smart mode so it gotoes the indentation point even though its placed on an empty line. --- 1,8 ---- ! 02-02-2005 Neoneye ! * lines with fullwidth glyphs got rendered incorrect. ! lines wider than the view also got rendered incorrect. ! It no longer causes rendering fuckup. ! ! 31-01-2005 Neoneye * improved View#move_linebegin's smart mode so it gotoes the indentation point even though its placed on an empty line. Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** TODO 1 Feb 2005 07:36:25 -0000 1.38 --- TODO 2 Feb 2005 18:37:01 -0000 1.39 *************** *** 124,127 **** --- 124,133 ---- + If I start the editor with the default document, by typing + ruby main_tui.rb + If the cursor is placed on the first line, and I + begin sideways scrolling (in a narrow window). + Then I get rendering fuckup.. maybe xterm/ncurses issue? + is it possible to probe ncursesw for if a glyph is renderable? In case the glyph cannot be rendered I would From neoneye at rubyforge.org Wed Feb 2 14:20:45 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 2 14:20:46 2005 Subject: [Aeditor-commit] projects/documents/homepage2 weblog.html Message-ID: <200502021920.j12JKjdS031277@rubyforge.org> Update of /var/cvs/aeditor/projects/documents/homepage2 In directory rubyforge.org:/tmp/cvs-serv31268 Modified Files: weblog.html Log Message: added description of myself. Index: weblog.html =================================================================== RCS file: /var/cvs/aeditor/projects/documents/homepage2/weblog.html,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** weblog.html 1 Feb 2005 16:12:36 -0000 1.4 --- weblog.html 2 Feb 2005 19:20:43 -0000 1.5 *************** *** 34,38 ****

Weblog about editors and Ruby

!

Things I did today - 01 feb 2005

--- 34,42 ----

Weblog about editors and Ruby

!

Hi, welcome to my blog, my name is Simon Strandgaard and im the ! author of AEditor. My age is 25 years and im studying ! mathematics and computer science. I usually chat on irc, logged in ! as neoneye on the #ruby-lang channel. ! I have a small appartment in Copenhagen, the capital of Denmark.

Things I did today - 01 feb 2005

From neoneye at rubyforge.org Wed Feb 2 14:57:18 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 2 14:57:18 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES TODO main_tui.rb Message-ID: <200502021957.j12JvIdS032501@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv32486 Modified Files: CHANGES TODO main_tui.rb Log Message: clear cache when resize Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.70 retrieving revision 1.71 diff -C2 -d -r1.70 -r1.71 *** main_tui.rb 2 Feb 2005 18:24:41 -0000 1.70 --- main_tui.rb 2 Feb 2005 19:57:16 -0000 1.71 *************** *** 94,97 **** --- 94,100 ---- end end + def render_cache_clear + @render_info = {} + end def event_loop @view.resize(width, height) *************** *** 228,231 **** --- 231,235 ---- when 410 @view.resize(width, height) + render_cache_clear when 800 @view.move_top Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** CHANGES 2 Feb 2005 18:37:01 -0000 1.37 --- CHANGES 2 Feb 2005 19:57:16 -0000 1.38 *************** *** 1,3 **** --- 1,5 ---- 02-02-2005 Neoneye + * resizing the window now clears the cache, so we no longer + get rendering fuckups. * lines with fullwidth glyphs got rendered incorrect. lines wider than the view also got rendered incorrect. Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** TODO 2 Feb 2005 18:37:01 -0000 1.39 --- TODO 2 Feb 2005 19:57:16 -0000 1.40 *************** *** 5,9 **** user-interface: - * resizing of window should flush the render_cache. * F1 should provide help. * search dialog (ala editpad). --- 5,8 ---- From neoneye at rubyforge.org Wed Feb 2 15:33:57 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 2 15:33:58 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES tui.c Message-ID: <200502022033.j12KXvdS002305@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv2291 Modified Files: CHANGES tui.c Log Message: its much better to invoke raw() rather than cbreak(). Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.38 retrieving revision 1.39 diff -C2 -d -r1.38 -r1.39 *** CHANGES 2 Feb 2005 19:57:16 -0000 1.38 --- CHANGES 2 Feb 2005 20:33:55 -0000 1.39 *************** *** 1,3 **** --- 1,8 ---- 02-02-2005 Neoneye + * by invoking raw() rather than cbreak() in tui.c, then we + get all the input from ncurses. For instance with cbreak + if I typed CTRL-S I experienced that the display went dead + and nothing happened.. until I typed CTRL-Q. Xterm or ncurses + must have been in an odd mode. Luckily this issue is now gone. * resizing the window now clears the cache, so we no longer get rendering fuckups. Index: tui.c =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/tui.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** tui.c 28 Jan 2005 20:56:02 -0000 1.1 --- tui.c 2 Feb 2005 20:33:55 -0000 1.2 *************** *** 3,6 **** --- 3,22 ---- #include "locale.h" + /* + + if (c == KEY_MOUSE) { + MEVENT event; + + getmouse(&event); + wprintw(win, "KEY_MOUSE, %s", mouse_decode(&event)); + getyx(win, y, x); + move(event.y, event.x); + addch('*'); + wmove(win, y, x); + } + + */ + + VALUE tui_init(VALUE self) { setlocale(LC_ALL, ""); *************** *** 12,16 **** keypad(stdscr, TRUE); /* enable keyboard mapping */ nonl(); /* tell curses not to do NL->CR/NL on output */ ! cbreak(); /* take input chars one at a time, no wait for \n */ noecho(); /* don't echo input */ meta(stdscr, 1); --- 28,32 ---- keypad(stdscr, TRUE); /* enable keyboard mapping */ nonl(); /* tell curses not to do NL->CR/NL on output */ ! raw(); /* characters typed are immediately passed through */ noecho(); /* don't echo input */ meta(stdscr, 1); From neoneye at rubyforge.org Wed Feb 2 17:08:17 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 2 17:08:18 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES TODO main_tui.rb tui.c Message-ID: <200502022208.j12M8HdS009658@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv9652 Modified Files: CHANGES TODO main_tui.rb tui.c Log Message: colorize the 80th column. Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.71 retrieving revision 1.72 diff -C2 -d -r1.71 -r1.72 *** main_tui.rb 2 Feb 2005 19:57:16 -0000 1.71 --- main_tui.rb 2 Feb 2005 22:08:15 -0000 1.72 *************** *** 71,74 **** --- 71,75 ---- #@view.lexer = @lexer @tabsize = 4 + @red_column = 70 @selection_mode = 0 @selection_text = '' *************** *** 305,310 **** end @render_info[vy] = info ! ! @n = 6 # reserve some space for line-numbers @x = 0 --- 306,310 ---- end @render_info[vy] = info ! @n = 6 # reserve some space for line-numbers @x = 0 *************** *** 315,318 **** --- 315,321 ---- pen = 3 end + if @x <= @red_column and @x + w > @red_column + pen = 9 + end if glyph == 10 or glyph == 13 w = 0 # ignore newlines *************** *** 337,341 **** pen = 3 end ! push_halfwidth(32, pen || 1) end --- 340,348 ---- pen = 3 end ! if @x == @red_column ! push_halfwidth(0x2502, pen || 6) ! else ! push_halfwidth(32, pen || 1) ! end end Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** CHANGES 2 Feb 2005 20:33:55 -0000 1.39 --- CHANGES 2 Feb 2005 22:08:15 -0000 1.40 *************** *** 1,3 **** --- 1,5 ---- 02-02-2005 Neoneye + * [main] @red_column added, which for instance colorizes the 80th + column, so that you are warned if you have too long lines. * by invoking raw() rather than cbreak() in tui.c, then we get all the input from ncurses. For instance with cbreak Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** TODO 2 Feb 2005 19:57:16 -0000 1.40 --- TODO 2 Feb 2005 22:08:15 -0000 1.41 *************** *** 7,10 **** --- 7,11 ---- * F1 should provide help. * search dialog (ala editpad). + * mouse support. Index: tui.c =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/tui.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** tui.c 2 Feb 2005 20:33:55 -0000 1.2 --- tui.c 2 Feb 2005 22:08:15 -0000 1.3 *************** *** 47,50 **** --- 47,51 ---- init_pair(7, COLOR_CYAN, COLOR_BLUE); /* - */ init_pair(8, COLOR_BLUE, COLOR_BLUE); /* tabs */ + init_pair(9, COLOR_BLACK, COLOR_RED); /* error */ color_set(1, 0); From neoneye at rubyforge.org Wed Feb 2 17:08:40 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 2 17:08:41 2005 Subject: [Aeditor-commit] projects/documents/homepage/aeditor_shots 055.png Message-ID: <200502022208.j12M8edS009672@rubyforge.org> Update of /var/cvs/aeditor/projects/documents/homepage/aeditor_shots In directory rubyforge.org:/tmp/cvs-serv9606 Added Files: 055.png Log Message: photo of colorization of the 60th column. --- NEW FILE: 055.png --- (This appears to be a binary file; contents omitted.) From neoneye at rubyforge.org Wed Feb 2 17:23:39 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 2 17:23:41 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES README Message-ID: <200502022223.j12MNddS010200@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv10194 Modified Files: CHANGES README Log Message: im ready to release something Index: README =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/README,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** README 1 Feb 2005 07:30:24 -0000 1.13 --- README 2 Feb 2005 22:23:37 -0000 1.14 *************** *** 1,3 **** ! AEDITOR 2.2 =========== --- 1,3 ---- ! AEDITOR 2.3 =========== *************** *** 14,18 **** screenshot: ! http://aeditor.rubyforge.org/aeditor_shots/053.png --- 14,18 ---- screenshot: ! http://aeditor.rubyforge.org/aeditor_shots/055.png *************** *** 93,99 **** Fetch ncurses version 5.4. ! ./configure --enable-widec --with-shared ! make ! make install --- 93,114 ---- Fetch ncurses version 5.4. ! prompt> ./configure --enable-widec --with-shared ! prompt> make ! prompt> make install ! ! ! ! Installing of AEditor ! ===================== ! ! prompt> ruby extconf.rb ! prompt> make ! ! now you can run aeditor ! ! prompt> ruby main_tui.rb ! ! ! Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** CHANGES 2 Feb 2005 22:08:15 -0000 1.40 --- CHANGES 2 Feb 2005 22:23:37 -0000 1.41 *************** *** 1,3 **** --- 1,4 ---- 02-02-2005 Neoneye + * released version 2.3 (darkmatter release). * [main] @red_column added, which for instance colorizes the 80th column, so that you are warned if you have too long lines. From neoneye at rubyforge.org Thu Feb 3 03:14:51 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 03:14:52 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb Message-ID: <200502030814.j138EpdS021799@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv21790 Modified Files: core.rb Log Message: the View class: separated fundemental stuff from operations. Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.64 retrieving revision 1.65 diff -C2 -d -r1.64 -r1.65 *** core.rb 31 Jan 2005 22:34:46 -0000 1.64 --- core.rb 3 Feb 2005 08:14:49 -0000 1.65 *************** *** 259,263 **** end ! class Caretaker include Helpers def initialize(model) --- 259,263 ---- end ! class Base include Helpers def initialize(model) *************** *** 388,415 **** @scroll_x = x end - def scroll_to_cursor - if @cursor_x < @scroll_x - @scroll_x = @cursor_x - end - if @cursor_x >= @scroll_x + @width - @scroll_x = @cursor_x + 1 - @width - end - if @cursor_y < @scroll_y - @scroll_y = @cursor_y - end - if @cursor_y >= @scroll_y - h1 = @height - 1 - bot = ay2vy(@scroll_y) + h1 - cvy = ay2vy(@cursor_y) - if cvy > bot - say = vy2ay(bot) - if @cursor_y > say - newsvy = [cvy - h1, 0].max - @scroll_y = vy2ay(newsvy) - end - end - end - end - # purpose: # convert from visible y coordinates to absolute y coordinates. --- 388,391 ---- *************** *** 422,426 **** vis[vy] end - # purpose: # convert from absolute y coordinates to visible y coordinates. --- 398,401 ---- *************** *** 468,471 **** --- 443,447 ---- @width, @height = width, height end + # determine how wide the glyph are: 1=halfwidth, 2=fullwidth. def measure_width(x, glyph) return 1 unless @canvas *************** *** 502,505 **** --- 478,538 ---- [x, y] end + # get list of folding levels + def folds + @lines.map{|l| l.folded_lines} + end + # get list of visible lines + def visible + res = [] + i = 0 + while i < @lines.size + res << i + i += @lines[i].folded_lines + 1 + end + res + end + def check_integrity + errors = [] + if @lines.size < 1 + errors << "the number of lines must be 1 or greater" + end + if @dirty & DIRTY_CURSOR == 0 + unless @scroll_y.between?(0, @lines.size-1) + errors << "scrolled over the edge, scroll_y=#{@scroll_y}" + end + end + unless @cursor_y.between?(0, @lines.size-1) + errors << "cursor over the edge, cursor_y=#{@cursor_y}" + end + return if errors.empty? + raise IntegrityError, errors.join("\n") + end + end + + + class Caretaker < Base + def scroll_to_cursor + if @cursor_x < @scroll_x + @scroll_x = @cursor_x + end + if @cursor_x >= @scroll_x + @width + @scroll_x = @cursor_x + 1 - @width + end + if @cursor_y < @scroll_y + @scroll_y = @cursor_y + end + if @cursor_y >= @scroll_y + h1 = @height - 1 + bot = ay2vy(@scroll_y) + h1 + cvy = ay2vy(@cursor_y) + if cvy > bot + say = vy2ay(bot) + if @cursor_y > say + newsvy = [cvy - h1, 0].max + @scroll_y = vy2ay(newsvy) + end + end + end + end def insert(utf8_string) ary = utf8_string.unpack("U*") *************** *** 800,815 **** @lines[@cursor_y].folded_lines = 0 end - def folds - @lines.map{|l| l.folded_lines} - end - def visible - res = [] - i = 0 - while i < @lines.size - res << i - i += @lines[i].folded_lines + 1 - end - res - end def move_to_prev_visible_line visible.reverse_each do |y| --- 833,836 ---- *************** *** 828,847 **** end end - def check_integrity - errors = [] - if @lines.size < 1 - errors << "the number of lines must be 1 or greater" - end - if @dirty & DIRTY_CURSOR == 0 - unless @scroll_y.between?(0, @lines.size-1) - errors << "scrolled over the edge, scroll_y=#{@scroll_y}" - end - end - unless @cursor_y.between?(0, @lines.size-1) - errors << "cursor over the edge, cursor_y=#{@cursor_y}" - end - return if errors.empty? - raise IntegrityError, errors.join("\n") - end end --- 849,852 ---- From neoneye at rubyforge.org Thu Feb 3 04:52:21 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 04:52:23 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502030952.j139qLdS026428@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv26381 Modified Files: test_core.rb Log Message: This morning it has taken me long time to get started.. 2 hours to be precise. I struggled writing this days first test.. no matter what I tried, the lexer seemed unnecessary complex.. I realized that by letting the lexer be attached to the model, then the lexer could be a standalone project which can do all caching on its own. Whenever the model is changed it updates itself accordingly. This is nice. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** test_core.rb 31 Jan 2005 22:34:46 -0000 1.51 --- test_core.rb 3 Feb 2005 09:52:19 -0000 1.52 *************** *** 1657,1659 **** # TODO: implement me end ! end \ No newline at end of file --- 1657,1738 ---- # TODO: implement me end ! end ! ! ! class MockLexer2 < AEditor::Lexer::Base ! def initialize(model) ! @model = model ! super() ! end ! def model_update(model, info) ! return if info.event == :before ! return if info.event != :after ! end ! def colorize(ay) ! b = @model.p2b(0, ay) ! w = @model.bytes[ay] ! text = @model.text[b, w] ! pen = text[0, 1].to_i ! glyphs = text.unpack('U*') ! glyphs.map{|g| pen} ! end ! end ! ! class TestViewColorize < Test::Unit::TestCase ! def setup ! super ! @model = AEditor::Model::Caretaker.new ! @model.load((1..9).to_a.map{|i| i.to_s * i}.join("\n")) ! @lexer = MockLexer2.new(@model) ! @model.attach(@lexer) ! end ! def teardown ! super ! @model.check_integrity ! end ! def test_typical1 ! assert_equal([1, 1], @lexer.colorize(0)) ! end ! def test_typical2 ! assert_equal([2, 2, 2], @lexer.colorize(1)) ! end ! def test_typical3 ! assert_equal([3, 3, 3, 3], @lexer.colorize(2)) ! end ! end ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! From neoneye at rubyforge.org Thu Feb 3 07:01:32 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 07:01:34 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502031201.j13C1WdS000377@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv371 Modified Files: core.rb test_core.rb Log Message: we can now cache the line states Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.52 retrieving revision 1.53 diff -C2 -d -r1.52 -r1.53 *** test_core.rb 3 Feb 2005 09:52:19 -0000 1.52 --- test_core.rb 3 Feb 2005 12:01:30 -0000 1.53 *************** *** 1663,1667 **** --- 1663,1676 ---- def initialize(model) @model = model + @line_states = [0] + @dirty_lines = [] + @cache = {} super() + + @left_state = 0 + @right_state = 0 + @pens = [] + + @state_counter = 1 end def model_update(model, info) *************** *** 1669,1679 **** return if info.event != :after end ! def colorize(ay) ! b = @model.p2b(0, ay) ! w = @model.bytes[ay] ! text = @model.text[b, w] pen = text[0, 1].to_i glyphs = text.unpack('U*') ! glyphs.map{|g| pen} end end --- 1678,1710 ---- return if info.event != :after end ! def lex_line(text) pen = text[0, 1].to_i glyphs = text.unpack('U*') ! @pens = glyphs.map{|g| pen} ! @right_state = @state_counter ! @state_counter += 1 ! nil ! end ! def colorize(ay) ! # TODO: flush dirty_list here ! ! # sync ! until @line_states.size > ay ! y = @line_states.size - 1 ! lex_line(@model.line(y)) ! @line_states << @right_state ! end ! ! @left_state = @line_states[ay] ! lex_line(@model.line(ay)) ! @line_states[ay + 1] = @right_state ! ! @pens ! end ! def cached_states ! @line_states ! end ! def cached_lines ! @cache.keys.sort end end *************** *** 1691,1702 **** --- 1722,1746 ---- @model.check_integrity end + def test_init + assert_equal([0], @lexer.cached_states) + end def test_typical1 assert_equal([1, 1], @lexer.colorize(0)) + assert_equal([0, 1], @lexer.cached_states) end def test_typical2 + assert_equal("22\n", @model.line(1)) assert_equal([2, 2, 2], @lexer.colorize(1)) + assert_equal([0, 1, 2], @lexer.cached_states) end def test_typical3 + assert_equal("333\n", @model.line(2)) assert_equal([3, 3, 3, 3], @lexer.colorize(2)) + assert_equal([0, 1, 2, 3], @lexer.cached_states) + end + def test_typical4 + assert_equal("7777777\n", @model.line(6)) + assert_equal([7, 7, 7, 7, 7, 7, 7, 7], @lexer.colorize(6)) + assert_equal([0, 1, 2, 3, 4, 5, 6, 7], @lexer.cached_states) end end Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.65 retrieving revision 1.66 diff -C2 -d -r1.65 -r1.66 *** core.rb 3 Feb 2005 08:14:49 -0000 1.65 --- core.rb 3 Feb 2005 12:01:30 -0000 1.66 *************** *** 186,193 **** end private :notify ! def glyphs(y) w = @bytes[y] b = p2b(0, y) ! @text[b, w].unpack('U*') end # replace everything --- 186,196 ---- end private :notify ! def line(y) w = @bytes[y] b = p2b(0, y) ! @text[b, w] ! end ! def glyphs(y) ! line(y).unpack('U*') end # replace everything From neoneye at rubyforge.org Thu Feb 3 07:19:30 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 07:19:31 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502031219.j13CJUdS000725@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv712 Modified Files: test_core.rb Log Message: preparing to tag certain lines as dirty Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** test_core.rb 3 Feb 2005 12:01:30 -0000 1.53 --- test_core.rb 3 Feb 2005 12:19:28 -0000 1.54 *************** *** 1664,1669 **** @model = model @line_states = [0] ! @dirty_lines = [] ! @cache = {} super() --- 1664,1668 ---- @model = model @line_states = [0] ! @topmost_dirty_line = 0 super() *************** *** 1674,1677 **** --- 1673,1684 ---- @state_counter = 1 end + def dirty(ay) + if ay >= 0 and ay < @line_states.size + @line_states[ay] = nil + if ay < @topmost_dirty_line + @topmost_dirty_line = ay + end + end + end def model_update(model, info) return if info.event == :before *************** *** 1688,1702 **** --- 1695,1724 ---- def colorize(ay) # TODO: flush dirty_list here + if @topmost_dirty_line < ay + end # sync until @line_states.size > ay y = @line_states.size - 1 + @left_state = @line_states[y] lex_line(@model.line(y)) @line_states << @right_state end + # compute the requested line @left_state = @line_states[ay] lex_line(@model.line(ay)) + + # maybe propagate + if ay + 2 < @line_states.size + if @line_states[ay + 1] != @right_state + dirty(ay + 2) + end + end @line_states[ay + 1] = @right_state + + if @topmost_dirty_line < ay + @topmost_dirty_line = ay + 1 + end @pens *************** *** 1706,1710 **** end def cached_lines ! @cache.keys.sort end end --- 1728,1732 ---- end def cached_lines ! #@cache.keys.sort end end *************** *** 1743,1746 **** --- 1765,1770 ---- assert_equal([7, 7, 7, 7, 7, 7, 7, 7], @lexer.colorize(6)) assert_equal([0, 1, 2, 3, 4, 5, 6, 7], @lexer.cached_states) + @lexer.dirty(2) + assert_equal([0, 1, nil, 3, 4, 5, 6, 7], @lexer.cached_states) end end From neoneye at rubyforge.org Thu Feb 3 07:33:47 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 07:33:48 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502031233.j13CXldS000979@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv972 Modified Files: test_core.rb Log Message: merged tests.. more dirtificaton of the lexer cacher Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.54 retrieving revision 1.55 diff -C2 -d -r1.54 -r1.55 *** test_core.rb 3 Feb 2005 12:19:28 -0000 1.54 --- test_core.rb 3 Feb 2005 12:33:45 -0000 1.55 *************** *** 1718,1722 **** @line_states[ay + 1] = @right_state ! if @topmost_dirty_line < ay @topmost_dirty_line = ay + 1 end --- 1718,1722 ---- @line_states[ay + 1] = @right_state ! if @topmost_dirty_line <= ay @topmost_dirty_line = ay + 1 end *************** *** 1724,1730 **** @pens end ! def cached_states @line_states end def cached_lines #@cache.keys.sort --- 1724,1733 ---- @pens end ! def states @line_states end + def tdl + @topmost_dirty_line + end def cached_lines #@cache.keys.sort *************** *** 1744,1770 **** @model.check_integrity end - def test_init - assert_equal([0], @lexer.cached_states) - end def test_typical1 assert_equal([1, 1], @lexer.colorize(0)) ! assert_equal([0, 1], @lexer.cached_states) ! end ! def test_typical2 assert_equal("22\n", @model.line(1)) assert_equal([2, 2, 2], @lexer.colorize(1)) ! assert_equal([0, 1, 2], @lexer.cached_states) ! end ! def test_typical3 assert_equal("333\n", @model.line(2)) assert_equal([3, 3, 3, 3], @lexer.colorize(2)) ! assert_equal([0, 1, 2, 3], @lexer.cached_states) end ! def test_typical4 assert_equal("7777777\n", @model.line(6)) assert_equal([7, 7, 7, 7, 7, 7, 7, 7], @lexer.colorize(6)) ! assert_equal([0, 1, 2, 3, 4, 5, 6, 7], @lexer.cached_states) ! @lexer.dirty(2) ! assert_equal([0, 1, nil, 3, 4, 5, 6, 7], @lexer.cached_states) end end --- 1747,1788 ---- @model.check_integrity end def test_typical1 + assert_equal([0], @lexer.states) assert_equal([1, 1], @lexer.colorize(0)) ! assert_equal([0, 1], @lexer.states) ! assert_equal(1, @lexer.tdl) assert_equal("22\n", @model.line(1)) assert_equal([2, 2, 2], @lexer.colorize(1)) ! assert_equal([0, 1, 2], @lexer.states) ! assert_equal(2, @lexer.tdl) assert_equal("333\n", @model.line(2)) assert_equal([3, 3, 3, 3], @lexer.colorize(2)) ! assert_equal([0, 1, 2, 3], @lexer.states) ! assert_equal(3, @lexer.tdl) ! assert_equal("55555\n", @model.line(4)) ! assert_equal([5, 5, 5, 5, 5, 5], @lexer.colorize(4)) ! assert_equal([0, 1, 2, 3, 4, 5], @lexer.states) ! assert_equal(5, @lexer.tdl) end ! def test_dirty1 assert_equal("7777777\n", @model.line(6)) assert_equal([7, 7, 7, 7, 7, 7, 7, 7], @lexer.colorize(6)) ! assert_equal([0, 1, 2, 3, 4, 5, 6, 7], @lexer.states) ! assert_equal(7, @lexer.tdl) ! @lexer.dirty(3) ! assert_equal([0, 1, 2, nil, 4, 5, 6, 7], @lexer.states) ! assert_equal(3, @lexer.tdl) ! @lexer.dirty(5) ! assert_equal([0, 1, 2, nil, 4, nil, 6, 7], @lexer.states) ! assert_equal(3, @lexer.tdl) ! @lexer.dirty(1) ! assert_equal([0, nil, 2, nil, 4, nil, 6, 7], @lexer.states) ! assert_equal(1, @lexer.tdl) ! end ! def test_dirty2 ! assert_equal([0], @lexer.states) ! assert_equal(0, @lexer.tdl) ! @lexer.dirty(3) ! assert_equal([0], @lexer.states, 'nothing should happen') end end From neoneye at rubyforge.org Thu Feb 3 08:38:57 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 08:38:58 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502031338.j13DcvdS003866@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv3861 Modified Files: test_core.rb Log Message: we can now lex the dirty lines Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.55 retrieving revision 1.56 diff -C2 -d -r1.55 -r1.56 *** test_core.rb 3 Feb 2005 12:33:45 -0000 1.55 --- test_core.rb 3 Feb 2005 13:38:55 -0000 1.56 *************** *** 1693,1702 **** nil end def colorize(ay) ! # TODO: flush dirty_list here ! if @topmost_dirty_line < ay end ! # sync until @line_states.size > ay y = @line_states.size - 1 --- 1693,1710 ---- nil end + def set_line_state(y, state) + dirty(y + 1) if y+1 < @line_states.size and @line_states[y + 1] != state + @line_states[y] = state + end def colorize(ay) ! # render dirty lines ! @topmost_dirty_line.upto([ay, @line_states.size-1].min) do |y| ! next if @line_states[y] ! @left_state = @line_states[y-1] ! lex_line(@model.line(y)) ! set_line_state(y, @right_state) end ! # render missing lines until @line_states.size > ay y = @line_states.size - 1 *************** *** 1709,1720 **** @left_state = @line_states[ay] lex_line(@model.line(ay)) ! ! # maybe propagate ! if ay + 2 < @line_states.size ! if @line_states[ay + 1] != @right_state ! dirty(ay + 2) ! end ! end ! @line_states[ay + 1] = @right_state if @topmost_dirty_line <= ay --- 1717,1721 ---- @left_state = @line_states[ay] lex_line(@model.line(ay)) ! set_line_state(ay+1, @right_state) if @topmost_dirty_line <= ay *************** *** 1722,1726 **** end ! @pens end def states --- 1723,1727 ---- end ! @pens end def states *************** *** 1786,1789 **** --- 1787,1804 ---- assert_equal([0], @lexer.states, 'nothing should happen') end + def test_sync_dirty1 + assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) + @lexer.dirty(5) + @lexer.dirty(3) + @lexer.dirty(1) + assert_equal(1, @lexer.tdl) + assert_equal([0, nil, 2, nil, 4, nil, 6], @lexer.states) + assert_equal([2, 2, 2], @lexer.colorize(1)) + assert_equal([0, 7, 8, nil, 4, nil, 6], @lexer.states) + assert_equal(2, @lexer.tdl) + assert_equal([3, 3, 3, 3], @lexer.colorize(2)) + assert_equal([0, 7, 8, 9, nil, nil, 6], @lexer.states) + assert_equal(3, @lexer.tdl) + end end From neoneye at rubyforge.org Thu Feb 3 10:22:53 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 10:22:54 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502031522.j13FMrdS011339@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv11312 Modified Files: test_core.rb Log Message: argh.. I had lots of offbyone problems.. now I have reworked the design so that it hopefully are more robust. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.56 retrieving revision 1.57 diff -C2 -d -r1.56 -r1.57 *** test_core.rb 3 Feb 2005 13:38:55 -0000 1.56 --- test_core.rb 3 Feb 2005 15:22:51 -0000 1.57 *************** *** 1663,1667 **** def initialize(model) @model = model ! @line_states = [0] @topmost_dirty_line = 0 super() --- 1663,1667 ---- def initialize(model) @model = model ! @line_states = [] @topmost_dirty_line = 0 super() *************** *** 1673,1689 **** @state_counter = 1 end - def dirty(ay) - if ay >= 0 and ay < @line_states.size - @line_states[ay] = nil - if ay < @topmost_dirty_line - @topmost_dirty_line = ay - end - end - end def model_update(model, info) return if info.event == :before return if info.event != :after end def lex_line(text) pen = text[0, 1].to_i glyphs = text.unpack('U*') --- 1673,1692 ---- @state_counter = 1 end def model_update(model, info) return if info.event == :before return if info.event != :after + # TODO: manipulate @line_states + sy = info.source_y2 + dy = info.dest_y2 + n = dy - sy + if n > 0 + n.times { @line_states.insert(sy, nil) } + else + @line_states.slice!(dy, -n) + end + info.y1.upto([sy, dy].min) {|i| dirty(i+1) } end def lex_line(text) + #puts "lex #{text.inspect}" pen = text[0, 1].to_i glyphs = text.unpack('U*') *************** *** 1693,1702 **** nil end ! def set_line_state(y, state) ! dirty(y + 1) if y+1 < @line_states.size and @line_states[y + 1] != state @line_states[y] = state end def colorize(ay) # render dirty lines @topmost_dirty_line.upto([ay, @line_states.size-1].min) do |y| next if @line_states[y] --- 1696,1717 ---- nil end ! def dirty(y) ! return unless y >= 0 and y < @line_states.size ! @line_states[y] = nil ! @topmost_dirty_line = [@topmost_dirty_line, y].min ! end ! def set_right_state(y, state) ! dirty(y + 1) if y + 1 < @line_states.size and @line_states[y + 1] != state @line_states[y] = state end + def get_left_state(y) + raise "y (#{y}) must not be negative" if y < 0 + raise "y (#{y}) was outside" if y-1 >= @line_states.size + return 0 if y == 0 + @line_states[y - 1] + end def colorize(ay) # render dirty lines + =begin @topmost_dirty_line.upto([ay, @line_states.size-1].min) do |y| next if @line_states[y] *************** *** 1705,1725 **** set_line_state(y, @right_state) end # render missing lines ! until @line_states.size > ay ! y = @line_states.size - 1 ! @left_state = @line_states[y] lex_line(@model.line(y)) ! @line_states << @right_state end # compute the requested line ! @left_state = @line_states[ay] lex_line(@model.line(ay)) ! set_line_state(ay+1, @right_state) ! ! if @topmost_dirty_line <= ay ! @topmost_dirty_line = ay + 1 ! end @pens --- 1720,1738 ---- set_line_state(y, @right_state) end + =end # render missing lines ! (@line_states.size).upto(ay-1) do |y| ! #puts "render #{y}" ! @left_state = get_left_state(y) lex_line(@model.line(y)) ! set_right_state(y, @right_state) end # compute the requested line ! @left_state = get_left_state(ay) lex_line(@model.line(ay)) ! @topmost_dirty_line = [@topmost_dirty_line, ay + 1].max ! set_right_state(ay, @right_state) @pens *************** *** 1749,1767 **** end def test_typical1 ! assert_equal([0], @lexer.states) assert_equal([1, 1], @lexer.colorize(0)) ! assert_equal([0, 1], @lexer.states) assert_equal(1, @lexer.tdl) assert_equal("22\n", @model.line(1)) assert_equal([2, 2, 2], @lexer.colorize(1)) ! assert_equal([0, 1, 2], @lexer.states) assert_equal(2, @lexer.tdl) assert_equal("333\n", @model.line(2)) assert_equal([3, 3, 3, 3], @lexer.colorize(2)) ! assert_equal([0, 1, 2, 3], @lexer.states) assert_equal(3, @lexer.tdl) assert_equal("55555\n", @model.line(4)) assert_equal([5, 5, 5, 5, 5, 5], @lexer.colorize(4)) ! assert_equal([0, 1, 2, 3, 4, 5], @lexer.states) assert_equal(5, @lexer.tdl) end --- 1762,1781 ---- end def test_typical1 ! assert_equal([], @lexer.states) ! assert_equal(0, @lexer.tdl) assert_equal([1, 1], @lexer.colorize(0)) ! assert_equal([1], @lexer.states) assert_equal(1, @lexer.tdl) assert_equal("22\n", @model.line(1)) assert_equal([2, 2, 2], @lexer.colorize(1)) ! assert_equal([1, 2], @lexer.states) assert_equal(2, @lexer.tdl) assert_equal("333\n", @model.line(2)) assert_equal([3, 3, 3, 3], @lexer.colorize(2)) ! assert_equal([1, 2, 3], @lexer.states) assert_equal(3, @lexer.tdl) assert_equal("55555\n", @model.line(4)) assert_equal([5, 5, 5, 5, 5, 5], @lexer.colorize(4)) ! assert_equal([1, 2, 3, 4, 5], @lexer.states) assert_equal(5, @lexer.tdl) end *************** *** 1769,1791 **** assert_equal("7777777\n", @model.line(6)) assert_equal([7, 7, 7, 7, 7, 7, 7, 7], @lexer.colorize(6)) ! assert_equal([0, 1, 2, 3, 4, 5, 6, 7], @lexer.states) assert_equal(7, @lexer.tdl) @lexer.dirty(3) ! assert_equal([0, 1, 2, nil, 4, 5, 6, 7], @lexer.states) assert_equal(3, @lexer.tdl) @lexer.dirty(5) ! assert_equal([0, 1, 2, nil, 4, nil, 6, 7], @lexer.states) assert_equal(3, @lexer.tdl) @lexer.dirty(1) ! assert_equal([0, nil, 2, nil, 4, nil, 6, 7], @lexer.states) assert_equal(1, @lexer.tdl) end def test_dirty2 ! assert_equal([0], @lexer.states) assert_equal(0, @lexer.tdl) @lexer.dirty(3) ! assert_equal([0], @lexer.states, 'nothing should happen') end ! def test_sync_dirty1 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) @lexer.dirty(5) --- 1783,1805 ---- assert_equal("7777777\n", @model.line(6)) assert_equal([7, 7, 7, 7, 7, 7, 7, 7], @lexer.colorize(6)) ! assert_equal([1, 2, 3, 4, 5, 6, 7], @lexer.states) assert_equal(7, @lexer.tdl) @lexer.dirty(3) ! assert_equal([1, 2, 3, nil, 5, 6, 7], @lexer.states) assert_equal(3, @lexer.tdl) @lexer.dirty(5) ! assert_equal([1, 2, 3, nil, 5, nil, 7], @lexer.states) assert_equal(3, @lexer.tdl) @lexer.dirty(1) ! assert_equal([1, nil, 3, nil, 5, nil, 7], @lexer.states) assert_equal(1, @lexer.tdl) end def test_dirty2 ! assert_equal([], @lexer.states) assert_equal(0, @lexer.tdl) @lexer.dirty(3) ! assert_equal([], @lexer.states, 'nothing should happen') end ! def xtest_sync_dirty1 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) @lexer.dirty(5) *************** *** 1796,1804 **** assert_equal([2, 2, 2], @lexer.colorize(1)) assert_equal([0, 7, 8, nil, 4, nil, 6], @lexer.states) ! assert_equal(2, @lexer.tdl) assert_equal([3, 3, 3, 3], @lexer.colorize(2)) assert_equal([0, 7, 8, 9, nil, nil, 6], @lexer.states) assert_equal(3, @lexer.tdl) end end --- 1810,1832 ---- assert_equal([2, 2, 2], @lexer.colorize(1)) assert_equal([0, 7, 8, nil, 4, nil, 6], @lexer.states) ! assert_equal(3, @lexer.tdl) assert_equal([3, 3, 3, 3], @lexer.colorize(2)) assert_equal([0, 7, 8, 9, nil, nil, 6], @lexer.states) + assert_equal(3, @lexer.tdl) # TODO: fix me + end + def xtest_modelnotify1 + assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) + assert_equal([0, 1, 2, 3, 4, 5, 6], @lexer.states) + assert_equal(7, @lexer.tdl) + @model.replace(0, 2, 1, 2, "0") + assert_equal([0, 1, 2, nil, 4, 5, 6], @lexer.states) assert_equal(3, @lexer.tdl) end + def xtest_modelnotify2 + assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) + assert_equal([0, 1, 2, 3, 4, 5, 6], @lexer.states) + @model.replace(0, 2, 1, 3, "0\n0") + assert_equal([0, 1, 2, nil, nil, 5, 6], @lexer.states) + end end From neoneye at rubyforge.org Thu Feb 3 10:31:23 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 10:31:24 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502031531.j13FVNdS011560@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv11546 Modified Files: test_core.rb Log Message: the lexer seems to have become more robust Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.57 retrieving revision 1.58 diff -C2 -d -r1.57 -r1.58 *** test_core.rb 3 Feb 2005 15:22:51 -0000 1.57 --- test_core.rb 3 Feb 2005 15:31:21 -0000 1.58 *************** *** 1713,1724 **** def colorize(ay) # render dirty lines ! =begin ! @topmost_dirty_line.upto([ay, @line_states.size-1].min) do |y| next if @line_states[y] ! @left_state = @line_states[y-1] lex_line(@model.line(y)) ! set_line_state(y, @right_state) end - =end # render missing lines --- 1713,1722 ---- def colorize(ay) # render dirty lines ! @topmost_dirty_line.upto([ay, @line_states.size].min-1) do |y| next if @line_states[y] ! @left_state = get_left_state(y) lex_line(@model.line(y)) ! set_right_state(y, @right_state) end # render missing lines *************** *** 1801,1817 **** assert_equal([], @lexer.states, 'nothing should happen') end ! def xtest_sync_dirty1 ! assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) @lexer.dirty(5) @lexer.dirty(3) @lexer.dirty(1) assert_equal(1, @lexer.tdl) ! assert_equal([0, nil, 2, nil, 4, nil, 6], @lexer.states) assert_equal([2, 2, 2], @lexer.colorize(1)) ! assert_equal([0, 7, 8, nil, 4, nil, 6], @lexer.states) ! assert_equal(3, @lexer.tdl) ! assert_equal([3, 3, 3, 3], @lexer.colorize(2)) ! assert_equal([0, 7, 8, 9, nil, nil, 6], @lexer.states) ! assert_equal(3, @lexer.tdl) # TODO: fix me end def xtest_modelnotify1 --- 1799,1815 ---- assert_equal([], @lexer.states, 'nothing should happen') end ! def test_sync_dirty1 ! assert_equal([7, 7, 7, 7, 7, 7, 7, 7], @lexer.colorize(6)) @lexer.dirty(5) @lexer.dirty(3) @lexer.dirty(1) assert_equal(1, @lexer.tdl) ! assert_equal([1, nil, 3, nil, 5, nil, 7], @lexer.states) assert_equal([2, 2, 2], @lexer.colorize(1)) ! assert_equal([1, 8, nil, nil, 5, nil, 7], @lexer.states) ! assert_equal(2, @lexer.tdl) ! assert_equal([4, 4, 4, 4, 4], @lexer.colorize(3)) ! assert_equal([1, 8, 9, 10, nil, nil, 7], @lexer.states) ! assert_equal(4, @lexer.tdl) end def xtest_modelnotify1 From neoneye at rubyforge.org Thu Feb 3 10:46:29 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 10:46:30 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502031546.j13FkTdS011946@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv11922 Modified Files: test_core.rb Log Message: now lexer behaves nice when it gets a model_notify Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.58 retrieving revision 1.59 diff -C2 -d -r1.58 -r1.59 *** test_core.rb 3 Feb 2005 15:31:21 -0000 1.58 --- test_core.rb 3 Feb 2005 15:46:27 -0000 1.59 *************** *** 1663,1672 **** def initialize(model) @model = model ! @line_states = [] @topmost_dirty_line = 0 super() ! @left_state = 0 ! @right_state = 0 @pens = [] --- 1663,1672 ---- def initialize(model) @model = model ! @right_states = [] @topmost_dirty_line = 0 super() ! @left = 0 ! @right = 0 @pens = [] *************** *** 1676,1689 **** return if info.event == :before return if info.event != :after ! # TODO: manipulate @line_states sy = info.source_y2 dy = info.dest_y2 n = dy - sy if n > 0 ! n.times { @line_states.insert(sy, nil) } else ! @line_states.slice!(dy, -n) end ! info.y1.upto([sy, dy].min) {|i| dirty(i+1) } end def lex_line(text) --- 1676,1689 ---- return if info.event == :before return if info.event != :after ! # TODO: manipulate @right_states sy = info.source_y2 dy = info.dest_y2 n = dy - sy if n > 0 ! n.times { @right_states.insert(sy, nil) } else ! @right_states.slice!(dy, -n) end ! info.y1.upto([sy, dy].min) {|i| dirty(i) } end def lex_line(text) *************** *** 1692,1741 **** glyphs = text.unpack('U*') @pens = glyphs.map{|g| pen} ! @right_state = @state_counter @state_counter += 1 nil end def dirty(y) ! return unless y >= 0 and y < @line_states.size ! @line_states[y] = nil @topmost_dirty_line = [@topmost_dirty_line, y].min end def set_right_state(y, state) ! dirty(y + 1) if y + 1 < @line_states.size and @line_states[y + 1] != state ! @line_states[y] = state end def get_left_state(y) raise "y (#{y}) must not be negative" if y < 0 ! raise "y (#{y}) was outside" if y-1 >= @line_states.size return 0 if y == 0 ! @line_states[y - 1] end def colorize(ay) # render dirty lines ! @topmost_dirty_line.upto([ay, @line_states.size].min-1) do |y| ! next if @line_states[y] ! @left_state = get_left_state(y) lex_line(@model.line(y)) ! set_right_state(y, @right_state) end # render missing lines ! (@line_states.size).upto(ay-1) do |y| #puts "render #{y}" ! @left_state = get_left_state(y) lex_line(@model.line(y)) ! set_right_state(y, @right_state) end # compute the requested line ! @left_state = get_left_state(ay) lex_line(@model.line(ay)) @topmost_dirty_line = [@topmost_dirty_line, ay + 1].max ! set_right_state(ay, @right_state) @pens end def states ! @line_states end def tdl --- 1692,1741 ---- glyphs = text.unpack('U*') @pens = glyphs.map{|g| pen} ! @right = @state_counter @state_counter += 1 nil end def dirty(y) ! return unless y >= 0 and y < @right_states.size ! @right_states[y] = nil @topmost_dirty_line = [@topmost_dirty_line, y].min end def set_right_state(y, state) ! dirty(y + 1) if y + 1 < @right_states.size and @right_states[y + 1] != state ! @right_states[y] = state end def get_left_state(y) raise "y (#{y}) must not be negative" if y < 0 ! raise "y (#{y}) was outside" if y-1 >= @right_states.size return 0 if y == 0 ! @right_states[y - 1] end def colorize(ay) # render dirty lines ! @topmost_dirty_line.upto([ay, @right_states.size].min-1) do |y| ! next if @right_states[y] ! @left = get_left_state(y) lex_line(@model.line(y)) ! set_right_state(y, @right) end # render missing lines ! (@right_states.size).upto(ay-1) do |y| #puts "render #{y}" ! @left = get_left_state(y) lex_line(@model.line(y)) ! set_right_state(y, @right) end # compute the requested line ! @left = get_left_state(ay) lex_line(@model.line(ay)) @topmost_dirty_line = [@topmost_dirty_line, ay + 1].max ! set_right_state(ay, @right) @pens end def states ! @right_states end def tdl *************** *** 1813,1829 **** assert_equal(4, @lexer.tdl) end ! def xtest_modelnotify1 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([0, 1, 2, 3, 4, 5, 6], @lexer.states) ! assert_equal(7, @lexer.tdl) @model.replace(0, 2, 1, 2, "0") ! assert_equal([0, 1, 2, nil, 4, 5, 6], @lexer.states) ! assert_equal(3, @lexer.tdl) end ! def xtest_modelnotify2 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([0, 1, 2, 3, 4, 5, 6], @lexer.states) @model.replace(0, 2, 1, 3, "0\n0") ! assert_equal([0, 1, 2, nil, nil, 5, 6], @lexer.states) end end --- 1813,1830 ---- assert_equal(4, @lexer.tdl) end ! def test_modelnotify1 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) ! assert_equal(6, @lexer.tdl) @model.replace(0, 2, 1, 2, "0") ! assert_equal([1, 2, nil, 4, 5, 6], @lexer.states) ! assert_equal(2, @lexer.tdl) end ! def test_modelnotify2 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) @model.replace(0, 2, 1, 3, "0\n0") ! assert_equal([1, 2, nil, nil, 5, 6], @lexer.states) ! assert_equal(2, @lexer.tdl) end end From neoneye at rubyforge.org Thu Feb 3 15:00:01 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 15:00:02 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502032000.j13K01dS027006@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv26635 Modified Files: test_core.rb Log Message: lexer cache.. more testing of remove/insert Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.59 retrieving revision 1.60 diff -C2 -d -r1.59 -r1.60 *** test_core.rb 3 Feb 2005 15:46:27 -0000 1.59 --- test_core.rb 3 Feb 2005 19:59:59 -0000 1.60 *************** *** 1813,1817 **** assert_equal(4, @lexer.tdl) end ! def test_modelnotify1 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) --- 1813,1817 ---- assert_equal(4, @lexer.tdl) end ! def test_modelnotify_same1 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) *************** *** 1821,1825 **** assert_equal(2, @lexer.tdl) end ! def test_modelnotify2 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) --- 1821,1825 ---- assert_equal(2, @lexer.tdl) end ! def test_modelnotify_same2 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) *************** *** 1828,1831 **** --- 1828,1846 ---- assert_equal(2, @lexer.tdl) end + def test_modelnotify_remove1 + assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) + assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) + @model.replace(0, 2, 0, 3, "") + assert_equal([1, 2, nil, 5, 6], @lexer.states) + assert_equal(2, @lexer.tdl) + end + def test_modelnotify_insert1 + assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) + assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) + @model.replace(0, 3, 0, 3, "0\n") + assert_equal("333\n0\n4444\n", @model.line(2) + @model.line(3) + @model.line(4)) + assert_equal([1, 2, 3, nil, 4, 5, 6], @lexer.states) + assert_equal(3, @lexer.tdl) + end end From neoneye at rubyforge.org Thu Feb 3 20:05:45 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Thu Feb 3 20:05:45 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502040105.j1415jdS012904@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv12893 Modified Files: test_core.rb Log Message: preparations for LRU caching of pens Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.60 retrieving revision 1.61 diff -C2 -d -r1.60 -r1.61 *** test_core.rb 3 Feb 2005 19:59:59 -0000 1.60 --- test_core.rb 4 Feb 2005 01:05:42 -0000 1.61 *************** *** 1676,1680 **** return if info.event == :before return if info.event != :after - # TODO: manipulate @right_states sy = info.source_y2 dy = info.dest_y2 --- 1676,1679 ---- *************** *** 1682,1687 **** --- 1681,1688 ---- if n > 0 n.times { @right_states.insert(sy, nil) } + # TODO: displace all cached pens else @right_states.slice!(dy, -n) + # TODO: displace all cached pens end info.y1.upto([sy, dy].min) {|i| dirty(i) } *************** *** 1700,1703 **** --- 1701,1705 ---- @right_states[y] = nil @topmost_dirty_line = [@topmost_dirty_line, y].min + # TODO: dirtify cached pens for this line end def set_right_state(y, state) *************** *** 1728,1731 **** --- 1730,1738 ---- end + # if ay < @right_states.size and @right_states[ay] + # res = load(ay) + # return res.clone if res + # end + # compute the requested line @left = get_left_state(ay) *************** *** 1734,1737 **** --- 1741,1746 ---- set_right_state(ay, @right) + # store(ay, @pens.clone) + @pens end *************** *** 1835,1838 **** --- 1844,1854 ---- assert_equal(2, @lexer.tdl) end + def test_modelnotify_remove2 + assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) + assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) + @model.replace(0, 1, 0, 4, "") + assert_equal([1, nil, 6], @lexer.states) + assert_equal(1, @lexer.tdl) + end def test_modelnotify_insert1 assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) *************** *** 1843,1846 **** --- 1859,1869 ---- assert_equal(3, @lexer.tdl) end + def test_modelnotify_insert2 + assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) + assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) + @model.replace(0, 3, 0, 3, "0\n0\n0\n") + assert_equal([1, 2, 3, nil, nil, nil, 4, 5, 6], @lexer.states) + assert_equal(3, @lexer.tdl) + end end From neoneye at rubyforge.org Fri Feb 4 04:27:24 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 4 04:27:24 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES Message-ID: <200502040927.j149ROdS019062@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv19057 Modified Files: CHANGES Log Message: status last night Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.41 retrieving revision 1.42 diff -C2 -d -r1.41 -r1.42 *** CHANGES 2 Feb 2005 22:23:37 -0000 1.41 --- CHANGES 4 Feb 2005 09:27:22 -0000 1.42 *************** *** 1,2 **** --- 1,5 ---- + 03-02-2005 Neoneye + * early code for a lexer cache. + 02-02-2005 Neoneye * released version 2.3 (darkmatter release). From neoneye at rubyforge.org Fri Feb 4 06:07:44 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 4 06:07:45 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502041107.j14B7idS024026@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv24019 Modified Files: test_core.rb Log Message: wrote a LRUCache class Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.61 retrieving revision 1.62 diff -C2 -d -r1.61 -r1.62 *** test_core.rb 4 Feb 2005 01:05:42 -0000 1.61 --- test_core.rb 4 Feb 2005 11:07:42 -0000 1.62 *************** *** 1660,1663 **** --- 1660,1804 ---- + class LRUCache + def initialize + @size = 1 + @pens = {} + @used = [] + end + attr_reader :size, :used, :pens + def resize(n) + raise ArgumentError if n < 0 + @size = n + wipe + end + def wipe + while @used.size > @size + @pens.delete(@used.pop) + end + end + private :wipe + def store(key, value) + @used.delete(key) + @used.unshift(key) + @pens[key] = value + wipe + end + def has_key?(key) + @pens.has_key?(key) + end + def load(key) + return nil unless has_key?(key) + @used.delete(key) + @used.unshift(key) + @pens[key] + end + def insert(y, n) + displaced = {} + @used.each_with_index do |key, i| + if key >= y + @used[i] = key+n + displaced[key+n] = @pens.delete(key) + end + end + @pens.merge!(displaced) + end + def remove(y, n) + # phase 1: erase key-values between y and y+n + to_delete = [] + @used.each_with_index do |key, i| + if key >= y and key < y+n + to_delete << key + end + end + to_delete.each do |key| + @used.delete(key) + @pens.delete(key) + end + # phase 2: displace key-values above y+n to y + displaced = {} + @used.each_with_index do |key, i| + if key >= y+n + @used[i] = key-n + displaced[key-n] = @pens.delete(key) + end + end + @pens.merge!(displaced) + end + end + + class TestLRUCache < Test::Unit::TestCase + def setup + @lru = LRUCache.new + end + def teardown + end + def test_init + assert_equal(1, @lru.size) + end + def test_store1 + @lru.resize(4) + assert_equal([], @lru.used) + @lru.store(5, 'im 5') + assert_equal([5], @lru.used) + @lru.store(3, 'im 3') + assert_equal([3, 5], @lru.used) + @lru.store(7, 'im 7') + assert_equal([7, 3, 5], @lru.used) + @lru.store(1, 'im 1') + assert_equal([1, 7, 3, 5], @lru.used) + assert_equal([1, 3, 5, 7], @lru.pens.keys.sort) + @lru.store(9, 'im 9') + assert_equal([9, 1, 7, 3], @lru.used) + assert_equal([1, 3, 7, 9], @lru.pens.keys.sort) + @lru.resize(2) + assert_equal([9, 1], @lru.used) + assert_equal([1, 9], @lru.pens.keys.sort) + assert_equal(true, @lru.has_key?(1)) + assert_equal(false, @lru.has_key?(3)) + end + def test_store2 + @lru.resize(4) + @lru.store(3, 'c') + @lru.store(1, 'a') + @lru.store(2, 'b') + assert_equal([2, 1, 3], @lru.used) + @lru.store(1, 'A') + assert_equal([1, 2, 3], @lru.used) + end + def test_load1 + @lru.resize(4) + @lru.store(1, 'a') + @lru.store(2, 'b') + @lru.store(3, 'c') + assert_equal('a', @lru.load(1)) + assert_equal('b', @lru.load(2)) + assert_equal('c', @lru.load(3)) + assert_equal(nil, @lru.load(4)) + end + def test_insert1 + @lru.resize(4) + @lru.store(3, 'z') + @lru.store(1, 'x') + @lru.store(2, 'y') + assert_equal(%w(x y z), @lru.pens.values.sort) + assert_equal([1, 2, 3], @lru.pens.keys.sort) + @lru.insert(2, 1) + assert_equal([3, 1, 4], @lru.used) + assert_equal(%w(x y z), @lru.pens.values.sort) + assert_equal([1, 3, 4], @lru.pens.keys.sort) + end + def test_remove1 + @lru.resize(4) + @lru.store(3, 'z') + @lru.store(1, 'x') + @lru.store(2, 'y') + @lru.store(4, 'w') + @lru.remove(2, 2) + assert_equal([2, 1], @lru.used) + assert_equal(%w(w x), @lru.pens.values.sort) + assert_equal([1, 2], @lru.pens.keys.sort) + end + end + class MockLexer2 < AEditor::Lexer::Base def initialize(model) From neoneye at rubyforge.org Fri Feb 4 06:33:34 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 4 06:33:36 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES core.rb test_core.rb Message-ID: <200502041133.j14BXYdS024418@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv24413 Modified Files: CHANGES core.rb test_core.rb Log Message: Wrote a LRU cache Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** CHANGES 4 Feb 2005 09:27:22 -0000 1.42 --- CHANGES 4 Feb 2005 11:33:32 -0000 1.43 *************** *** 1,2 **** --- 1,6 ---- + 04-02-2005 Neoneye + * wrote a LRU cache so that I can remember the colorization per + visible line. + 03-02-2005 Neoneye * early code for a lexer cache. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.62 retrieving revision 1.63 diff -C2 -d -r1.62 -r1.63 *** test_core.rb 4 Feb 2005 11:07:42 -0000 1.62 --- test_core.rb 4 Feb 2005 11:33:32 -0000 1.63 *************** *** 1660,1736 **** - class LRUCache - def initialize - @size = 1 - @pens = {} - @used = [] - end - attr_reader :size, :used, :pens - def resize(n) - raise ArgumentError if n < 0 - @size = n - wipe - end - def wipe - while @used.size > @size - @pens.delete(@used.pop) - end - end - private :wipe - def store(key, value) - @used.delete(key) - @used.unshift(key) - @pens[key] = value - wipe - end - def has_key?(key) - @pens.has_key?(key) - end - def load(key) - return nil unless has_key?(key) - @used.delete(key) - @used.unshift(key) - @pens[key] - end - def insert(y, n) - displaced = {} - @used.each_with_index do |key, i| - if key >= y - @used[i] = key+n - displaced[key+n] = @pens.delete(key) - end - end - @pens.merge!(displaced) - end - def remove(y, n) - # phase 1: erase key-values between y and y+n - to_delete = [] - @used.each_with_index do |key, i| - if key >= y and key < y+n - to_delete << key - end - end - to_delete.each do |key| - @used.delete(key) - @pens.delete(key) - end - # phase 2: displace key-values above y+n to y - displaced = {} - @used.each_with_index do |key, i| - if key >= y+n - @used[i] = key-n - displaced[key-n] = @pens.delete(key) - end - end - @pens.merge!(displaced) - end - end - class TestLRUCache < Test::Unit::TestCase def setup ! @lru = LRUCache.new end - def teardown - end def test_init assert_equal(1, @lru.size) --- 1660,1667 ---- class TestLRUCache < Test::Unit::TestCase def setup ! @lru = AEditor::Lexer::LRUCache.new end def test_init assert_equal(1, @lru.size) Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.66 retrieving revision 1.67 diff -C2 -d -r1.66 -r1.67 *** core.rb 3 Feb 2005 12:01:30 -0000 1.66 --- core.rb 4 Feb 2005 11:33:32 -0000 1.67 *************** *** 887,890 **** --- 887,956 ---- module Lexer + + # purpose: + # remember the most recently used pen-lines + class LRUCache + def initialize + @size = 1 + @pens = {} + @used = [] + end + attr_reader :size, :used, :pens + def resize(n) + raise ArgumentError if n < 0 + @size = n + wipe + end + def wipe + while @used.size > @size + @pens.delete(@used.pop) + end + end + private :wipe + def store(key, value) + @used.delete(key) + @used.unshift(key) + @pens[key] = value + wipe + end + def has_key?(key) + @pens.has_key?(key) + end + # note: remember to .clone the data you get from .load + def load(key) + return nil unless has_key?(key) + @used.delete(key) + @used.unshift(key) + @pens[key] + end + def displace(y, n) + displaced = {} + @used.each_with_index do |key, i| + if key >= y + @used[i] = key+n + displaced[key+n] = @pens.delete(key) + end + end + @pens.merge!(displaced) + end + alias :insert :displace + private :displace + public :insert + def remove_in_range(y, n) + ary = [] + @used.each {|key| ary << key if key >= y and key < y+n } + ary.each do |key| + @used.delete(key) + @pens.delete(key) + end + end + private :remove_in_range + def remove(y, n) + remove_in_range(y, n) + displace(y+n, -n) + end + end + + class Base end From neoneye at rubyforge.org Fri Feb 4 07:13:29 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 4 07:13:35 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502041213.j14CDTdS026580@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv26575 Modified Files: core.rb test_core.rb Log Message: added aliases [] and []= to the LRU class Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.63 retrieving revision 1.64 diff -C2 -d -r1.63 -r1.64 *** test_core.rb 4 Feb 2005 11:33:32 -0000 1.63 --- test_core.rb 4 Feb 2005 12:13:27 -0000 1.64 *************** *** 1662,1666 **** class TestLRUCache < Test::Unit::TestCase def setup ! @lru = AEditor::Lexer::LRUCache.new end def test_init --- 1662,1666 ---- class TestLRUCache < Test::Unit::TestCase def setup ! @lru = AEditor::Lexer::LRU.new end def test_init *************** *** 1670,1683 **** @lru.resize(4) assert_equal([], @lru.used) ! @lru.store(5, 'im 5') assert_equal([5], @lru.used) ! @lru.store(3, 'im 3') assert_equal([3, 5], @lru.used) ! @lru.store(7, 'im 7') assert_equal([7, 3, 5], @lru.used) ! @lru.store(1, 'im 1') assert_equal([1, 7, 3, 5], @lru.used) assert_equal([1, 3, 5, 7], @lru.pens.keys.sort) ! @lru.store(9, 'im 9') assert_equal([9, 1, 7, 3], @lru.used) assert_equal([1, 3, 7, 9], @lru.pens.keys.sort) --- 1670,1683 ---- @lru.resize(4) assert_equal([], @lru.used) ! @lru[5] = 'im 5' assert_equal([5], @lru.used) ! @lru[3] = 'im 3' assert_equal([3, 5], @lru.used) ! @lru[7] = 'im 7' assert_equal([7, 3, 5], @lru.used) ! @lru[1] = 'im 1' assert_equal([1, 7, 3, 5], @lru.used) assert_equal([1, 3, 5, 7], @lru.pens.keys.sort) ! @lru[9] = 'im 9' assert_equal([9, 1, 7, 3], @lru.used) assert_equal([1, 3, 7, 9], @lru.pens.keys.sort) *************** *** 1690,1715 **** def test_store2 @lru.resize(4) ! @lru.store(3, 'c') ! @lru.store(1, 'a') ! @lru.store(2, 'b') assert_equal([2, 1, 3], @lru.used) ! @lru.store(1, 'A') assert_equal([1, 2, 3], @lru.used) end def test_load1 @lru.resize(4) ! @lru.store(1, 'a') ! @lru.store(2, 'b') ! @lru.store(3, 'c') ! assert_equal('a', @lru.load(1)) ! assert_equal('b', @lru.load(2)) ! assert_equal('c', @lru.load(3)) ! assert_equal(nil, @lru.load(4)) end def test_insert1 @lru.resize(4) ! @lru.store(3, 'z') ! @lru.store(1, 'x') ! @lru.store(2, 'y') assert_equal(%w(x y z), @lru.pens.values.sort) assert_equal([1, 2, 3], @lru.pens.keys.sort) --- 1690,1715 ---- def test_store2 @lru.resize(4) ! @lru[3] = 'c' ! @lru[1] = 'a' ! @lru[2] = 'b' assert_equal([2, 1, 3], @lru.used) ! @lru[1] = 'A' assert_equal([1, 2, 3], @lru.used) end def test_load1 @lru.resize(4) ! @lru[1] = 'a' ! @lru[2] = 'b' ! @lru[3] = 'c' ! assert_equal('a', @lru[1]) ! assert_equal('b', @lru[2]) ! assert_equal('c', @lru[3]) ! assert_equal(nil, @lru[4]) end def test_insert1 @lru.resize(4) ! @lru[3] = 'z' ! @lru[1] = 'x' ! @lru[2] = 'y' assert_equal(%w(x y z), @lru.pens.values.sort) assert_equal([1, 2, 3], @lru.pens.keys.sort) *************** *** 1721,1728 **** def test_remove1 @lru.resize(4) ! @lru.store(3, 'z') ! @lru.store(1, 'x') ! @lru.store(2, 'y') ! @lru.store(4, 'w') @lru.remove(2, 2) assert_equal([2, 1], @lru.used) --- 1721,1728 ---- def test_remove1 @lru.resize(4) ! @lru[3] = 'z' ! @lru[1] = 'x' ! @lru[2] = 'y' ! @lru[4] = 'w' @lru.remove(2, 2) assert_equal([2, 1], @lru.used) Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.67 retrieving revision 1.68 diff -C2 -d -r1.67 -r1.68 *** core.rb 4 Feb 2005 11:33:32 -0000 1.67 --- core.rb 4 Feb 2005 12:13:27 -0000 1.68 *************** *** 890,894 **** # purpose: # remember the most recently used pen-lines ! class LRUCache def initialize @size = 1 --- 890,894 ---- # purpose: # remember the most recently used pen-lines ! class LRU def initialize @size = 1 *************** *** 914,917 **** --- 914,918 ---- wipe end + alias_method('[]=', :store) def has_key?(key) @pens.has_key?(key) *************** *** 924,927 **** --- 925,929 ---- @pens[key] end + alias_method('[]', :load) def displace(y, n) displaced = {} From neoneye at rubyforge.org Fri Feb 4 07:42:28 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 4 07:42:29 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502041242.j14CgSdS027211@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv27205 Modified Files: core.rb test_core.rb Log Message: LRU#delete added Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.64 retrieving revision 1.65 diff -C2 -d -r1.64 -r1.65 *** test_core.rb 4 Feb 2005 12:13:27 -0000 1.64 --- test_core.rb 4 Feb 2005 12:42:26 -0000 1.65 *************** *** 1730,1733 **** --- 1730,1747 ---- assert_equal([1, 2], @lru.pens.keys.sort) end + def test_delete1 + @lru.resize(4) + @lru[3] = 'z' + @lru[1] = 'x' + @lru[2] = 'y' + assert_equal('x', @lru.delete(1)) + assert_equal([2, 3], @lru.used) + assert_equal(%w(y z), @lru.pens.values.sort) + assert_equal([2, 3], @lru.pens.keys.sort) + assert_equal('y', @lru.delete(2)) + assert_equal([3], @lru.used) + assert_equal(%w(z), @lru.pens.values.sort) + assert_equal([3], @lru.pens.keys.sort) + end end Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.68 retrieving revision 1.69 diff -C2 -d -r1.68 -r1.69 *** core.rb 4 Feb 2005 12:13:27 -0000 1.68 --- core.rb 4 Feb 2005 12:42:26 -0000 1.69 *************** *** 926,929 **** --- 926,933 ---- end alias_method('[]', :load) + def delete(key) + @used.delete(key) + @pens.delete(key) + end def displace(y, n) displaced = {} *************** *** 942,949 **** ary = [] @used.each {|key| ary << key if key >= y and key < y+n } ! ary.each do |key| ! @used.delete(key) ! @pens.delete(key) ! end end private :remove_in_range --- 946,950 ---- ary = [] @used.each {|key| ary << key if key >= y and key < y+n } ! ary.each {|key| delete(key) } end private :remove_in_range From neoneye at rubyforge.org Fri Feb 4 10:09:13 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 4 10:09:14 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502041509.j14F9DdS002990@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv2976 Modified Files: test_core.rb Log Message: added LRU caching to the MockLexer2 Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.65 retrieving revision 1.66 diff -C2 -d -r1.65 -r1.66 *** test_core.rb 4 Feb 2005 12:42:26 -0000 1.65 --- test_core.rb 4 Feb 2005 15:09:11 -0000 1.66 *************** *** 1756,1762 **** --- 1756,1767 ---- @right = 0 @pens = [] + @lru = AEditor::Lexer::LRU.new @state_counter = 1 end + attr_reader :lru + def resize(n) + @lru.resize(n) + end def model_update(model, info) return if info.event == :before *************** *** 1767,1774 **** if n > 0 n.times { @right_states.insert(sy, nil) } ! # TODO: displace all cached pens else @right_states.slice!(dy, -n) ! # TODO: displace all cached pens end info.y1.upto([sy, dy].min) {|i| dirty(i) } --- 1772,1779 ---- if n > 0 n.times { @right_states.insert(sy, nil) } ! @lru.insert(sy, n) # displace all cached pens else @right_states.slice!(dy, -n) ! @lru.remove(dy+n, -n) # displace all cached pens end info.y1.upto([sy, dy].min) {|i| dirty(i) } *************** *** 1787,1791 **** @right_states[y] = nil @topmost_dirty_line = [@topmost_dirty_line, y].min ! # TODO: dirtify cached pens for this line end def set_right_state(y, state) --- 1792,1796 ---- @right_states[y] = nil @topmost_dirty_line = [@topmost_dirty_line, y].min ! @lru.delete(y) # dirtify cached pens for this line end def set_right_state(y, state) *************** *** 1816,1823 **** end ! # if ay < @right_states.size and @right_states[ay] ! # res = load(ay) ! # return res.clone if res ! # end # compute the requested line --- 1821,1828 ---- end ! if ay < @right_states.size and @right_states[ay] ! res = @lru[ay] ! return res if res ! end # compute the requested line *************** *** 1827,1831 **** set_right_state(ay, @right) ! # store(ay, @pens.clone) @pens --- 1832,1836 ---- set_right_state(ay, @right) ! @lru[ay] = @pens @pens *************** *** 1837,1843 **** @topmost_dirty_line end - def cached_lines - #@cache.keys.sort - end end --- 1842,1845 ---- *************** *** 1952,1955 **** --- 1954,2026 ---- assert_equal(3, @lexer.tdl) end + # requesting a line which has already been computed + # must result in the exact same result as first time + # it was computed.. because its cached. + # except if it was too long ago.. + def test_caching1 + assert_equal([], @lexer.lru.pens.keys.sort) + pens1 = @lexer.colorize(1) + assert_equal([2, 2, 2], pens1) + assert_equal([1], @lexer.lru.pens.keys.sort) + pens2 = @lexer.colorize(1) + assert_same(pens1, pens2, 'should be cached') + @lexer.dirty(1) + assert_equal([], @lexer.lru.used) + pens3 = @lexer.colorize(1) + assert_not_same(pens1, pens3, 'should not be cached') + end + def test_caching2 + @lexer.resize(2) + assert_equal([], @lexer.lru.pens.keys.sort) + pens1 = @lexer.colorize(1) + assert_equal([2, 2, 2], pens1) + assert_equal([1], @lexer.lru.pens.keys.sort) + pens2 = @lexer.colorize(2) + assert_equal([3, 3, 3, 3], pens2) + assert_equal([2, 1], @lexer.lru.used) + pens3 = @lexer.colorize(1) + assert_same(pens1, pens3, 'should be cached') + assert_equal([1, 2], @lexer.lru.used) + pens4 = @lexer.colorize(3) + assert_equal([4, 4, 4, 4, 4], pens4) + assert_equal([3, 1], @lexer.lru.used) + pens5 = @lexer.colorize(2) + assert_not_same(pens2, pens5, 'should not be cached') + end + def test_caching3 + assert_equal([], @lexer.lru.pens.keys.sort) + pens1 = @lexer.colorize(1) + assert_equal([2, 2, 2], pens1) + assert_equal([1], @lexer.lru.pens.keys.sort) + pens2 = @lexer.colorize(2) + assert_equal([3, 3, 3, 3], pens2) + assert_equal([2], @lexer.lru.pens.keys.sort) + assert_not_same(pens1, pens2, 'should not be cached') + pens3 = @lexer.colorize(1) # this is what we want to test + assert_equal([2, 2, 2], pens3) + assert_equal([1], @lexer.lru.pens.keys.sort) + assert_not_same(pens1, pens3, 'should not be cached') + end + def test_caching4 + @lexer.resize(5) + 5.times {|y| @lexer.colorize(y) } + assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + @model.replace(0, 2, 1, 2, '0') + assert_equal([4, 3, 1, 0], @lexer.lru.used, 'dirtification') + end + def test_caching5 + @lexer.resize(5) + 5.times {|y| @lexer.colorize(y) } + assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + @model.replace(0, 2, 0, 2, "0\n") + assert_equal([5, 4, 3, 1, 0], @lexer.lru.used, 'positive displacement') + end + def test_caching6 + @lexer.resize(5) + 5.times {|y| @lexer.colorize(y) } + assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + @model.replace(0, 2, 0, 3, "") + assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') + end end From neoneye at rubyforge.org Fri Feb 4 10:27:05 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 4 10:27:06 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES core.rb test_core.rb Message-ID: <200502041527.j14FR5dS003665@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv3645 Modified Files: CHANGES core.rb test_core.rb Log Message: moved MockLexer2 from 'test_core.rb' into 'core.rb'.. named it Simple Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** CHANGES 4 Feb 2005 11:33:32 -0000 1.43 --- CHANGES 4 Feb 2005 15:27:03 -0000 1.44 *************** *** 1,3 **** --- 1,7 ---- 04-02-2005 Neoneye + * integrated LRU cache with the linestate cache and named it + Lexer::Simple. A lexer must derive from this class and just + overload the lex_line method. The simple class with take care + of all caching. * wrote a LRU cache so that I can remember the colorization per visible line. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.66 retrieving revision 1.67 diff -C2 -d -r1.66 -r1.67 *** test_core.rb 4 Feb 2005 15:09:11 -0000 1.66 --- test_core.rb 4 Feb 2005 15:27:03 -0000 1.67 *************** *** 343,347 **** end def test_init_with_lexer1 ! lexer = MockLexer.new view = AEditor::View::Caretaker.new(@model) assert_nil(view.lexer) --- 343,347 ---- end def test_init_with_lexer1 ! lexer = MockLexer.new(@model) view = AEditor::View::Caretaker.new(@model) assert_nil(view.lexer) *************** *** 504,508 **** @view.resize(4, 2) @view.canvas, @canvas.view = @canvas, @view ! @lexer = MockLexer.new @view.lexer = @lexer end --- 504,508 ---- @view.resize(4, 2) @view.canvas, @canvas.view = @canvas, @view ! @lexer = MockLexer.new(@model) @view.lexer = @lexer end *************** *** 1746,1781 **** end ! class MockLexer2 < AEditor::Lexer::Base def initialize(model) - @model = model - @right_states = [] - @topmost_dirty_line = 0 - super() - - @left = 0 - @right = 0 - @pens = [] - @lru = AEditor::Lexer::LRU.new - @state_counter = 1 ! end ! attr_reader :lru ! def resize(n) ! @lru.resize(n) ! end ! def model_update(model, info) ! return if info.event == :before ! return if info.event != :after ! sy = info.source_y2 ! dy = info.dest_y2 ! n = dy - sy ! if n > 0 ! n.times { @right_states.insert(sy, nil) } ! @lru.insert(sy, n) # displace all cached pens ! else ! @right_states.slice!(dy, -n) ! @lru.remove(dy+n, -n) # displace all cached pens ! end ! info.y1.upto([sy, dy].min) {|i| dirty(i) } end def lex_line(text) --- 1746,1753 ---- end ! class MockLexer2 < AEditor::Lexer::Simple def initialize(model) @state_counter = 1 ! super(model) end def lex_line(text) *************** *** 1788,1848 **** nil end - def dirty(y) - return unless y >= 0 and y < @right_states.size - @right_states[y] = nil - @topmost_dirty_line = [@topmost_dirty_line, y].min - @lru.delete(y) # dirtify cached pens for this line - end - def set_right_state(y, state) - dirty(y + 1) if y + 1 < @right_states.size and @right_states[y + 1] != state - @right_states[y] = state - end - def get_left_state(y) - raise "y (#{y}) must not be negative" if y < 0 - raise "y (#{y}) was outside" if y-1 >= @right_states.size - return 0 if y == 0 - @right_states[y - 1] - end - def colorize(ay) - # render dirty lines - @topmost_dirty_line.upto([ay, @right_states.size].min-1) do |y| - next if @right_states[y] - @left = get_left_state(y) - lex_line(@model.line(y)) - set_right_state(y, @right) - end - - # render missing lines - (@right_states.size).upto(ay-1) do |y| - #puts "render #{y}" - @left = get_left_state(y) - lex_line(@model.line(y)) - set_right_state(y, @right) - end - - if ay < @right_states.size and @right_states[ay] - res = @lru[ay] - return res if res - end - - # compute the requested line - @left = get_left_state(ay) - lex_line(@model.line(ay)) - @topmost_dirty_line = [@topmost_dirty_line, ay + 1].max - set_right_state(ay, @right) - - @lru[ay] = @pens - - @pens - end - def states - @right_states - end - def tdl - @topmost_dirty_line - end end ! class TestViewColorize < Test::Unit::TestCase def setup super --- 1760,1766 ---- nil end end ! class TestLexerSimple < Test::Unit::TestCase def setup super *************** *** 2024,2061 **** end end - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- 1942,1943 ---- Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.69 retrieving revision 1.70 diff -C2 -d -r1.69 -r1.70 *** core.rb 4 Feb 2005 12:42:26 -0000 1.69 --- core.rb 4 Feb 2005 15:27:03 -0000 1.70 *************** *** 955,962 **** end - class Base end end # module Lexer --- 955,1068 ---- end class Base + def initialize(model) + @model = model + end + def resize(n) + # do nothing + end + def model_update(model, info) + # do nothing + end + def colorize(ay) + raise "derived class must overload" + end + end + + class Simple < Base + def initialize(model) + @right_states = [] + @topmost_dirty_line = 0 + @left = 0 + @right = 0 + @pens = [] + @lru = LRU.new + super(model) + end + attr_reader :lru + def resize(n) + @lru.resize(n) + end + def model_update(model, info) + return if info.event == :before + return if info.event != :after + sy = info.source_y2 + dy = info.dest_y2 + n = dy - sy + if n > 0 + n.times { @right_states.insert(sy, nil) } + @lru.insert(sy, n) # displace all cached pens + else + @right_states.slice!(dy, -n) + @lru.remove(dy+n, -n) # displace all cached pens + end + info.y1.upto([sy, dy].min) {|i| dirty(i) } + end + def lex_line(text) + #puts "lex #{text.inspect}" + pen = text[0, 1].to_i + glyphs = text.unpack('U*') + @pens = glyphs.map{|g| pen} + @right = @state_counter + @state_counter += 1 + nil + end + def dirty(y) + return unless y >= 0 and y < @right_states.size + @right_states[y] = nil + @topmost_dirty_line = [@topmost_dirty_line, y].min + @lru.delete(y) # dirtify cached pens for this line + end + def set_right_state(y, state) + dirty(y + 1) if y + 1 < @right_states.size and @right_states[y + 1] != state + @right_states[y] = state + end + def get_left_state(y) + raise "y (#{y}) must not be negative" if y < 0 + raise "y (#{y}) was outside" if y-1 >= @right_states.size + return 0 if y == 0 + @right_states[y - 1] + end + def colorize(ay) + # render dirty lines + @topmost_dirty_line.upto([ay, @right_states.size].min-1) do |y| + next if @right_states[y] + @left = get_left_state(y) + lex_line(@model.line(y)) + set_right_state(y, @right) + end + + # render missing lines + (@right_states.size).upto(ay-1) do |y| + #puts "render #{y}" + @left = get_left_state(y) + lex_line(@model.line(y)) + set_right_state(y, @right) + end + + if ay < @right_states.size and @right_states[ay] + res = @lru[ay] + return res if res + end + + # compute the requested line + @left = get_left_state(ay) + lex_line(@model.line(ay)) + @topmost_dirty_line = [@topmost_dirty_line, ay + 1].max + set_right_state(ay, @right) + + @lru[ay] = @pens + + @pens + end + def states + @right_states + end + def tdl + @topmost_dirty_line + end end + end # module Lexer From neoneye at rubyforge.org Fri Feb 4 13:46:05 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 4 13:46:05 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb main_tui.rb Message-ID: <200502041846.j14Ik5dS015635@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv15584 Modified Files: Tag: b04022005 core.rb main_tui.rb Log Message: early syntax coloring is working Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72 retrieving revision 1.72.2.1 diff -C2 -d -r1.72 -r1.72.2.1 *** main_tui.rb 2 Feb 2005 22:08:15 -0000 1.72 --- main_tui.rb 4 Feb 2005 18:46:03 -0000 1.72.2.1 *************** *** 10,13 **** --- 10,52 ---- end + require 'lexer' + + class LexTest < AEditor::Lexer::Simple + def initialize(model) + super(model) + @i = 0 + end + def lex_line(text) + glyphs = text.unpack('U*') + @pens = glyphs.map{ @i } + @i = (@i + 1) % 5 + end + end + + class LexRuby < AEditor::Lexer::Simple + def initialize(model) + super(model) + @lexer = LexerRuby::Lexer.new + end + def lex_line(text) + @lexer.set_states([]) + @lexer.set_result([]) + @lexer.lex_line(text) + tokens, states = @lexer.result.transpose + @pens = [] + @colors = { + :tab => 6, + :keyword => 2, + :punct => 2, + :string => 4 + } + @colors.default = 1 + tokens.each_with_index do |tok, i| + $logger.info states.inspect + @pens += [ @colors[states[i]] ] * tok.size + end + end + end + class MainTUI < AEditor::Canvas::Base NEONEYE = [0xff2e, 0xff25, 0xff2f, *************** *** 68,71 **** --- 107,113 ---- @view.canvas, self.view = self, @view @model.attach(@view) + + @lexer = LexRuby.new(@model) + @view.lexer = @lexer #@lexer = MockLexer.new #@view.lexer = @lexer *************** *** 276,280 **** @n += 1 end ! def render_row(vy, text, ay, options) --- 318,322 ---- @n += 1 end ! def render_row(vy, text, ay, pens, options) *************** *** 309,315 **** @n = 6 # reserve some space for line-numbers @x = 0 ! (text || '').unpack('U*').each do |glyph| w = measure_width(@x, glyph) pen = nil if sel1 <= @x and @x < sel2 pen = 3 --- 351,360 ---- @n = 6 # reserve some space for line-numbers @x = 0 ! (text || '').unpack('U*').each_with_index do |glyph, index| w = measure_width(@x, glyph) pen = nil + if pens + pen = pens[index] + end if sel1 <= @x and @x < sel2 pen = 3 Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70 retrieving revision 1.70.2.1 diff -C2 -d -r1.70 -r1.70.2.1 *** core.rb 4 Feb 2005 15:27:03 -0000 1.70 --- core.rb 4 Feb 2005 18:46:03 -0000 1.70.2.1 *************** *** 367,370 **** --- 367,371 ---- cy = y end + pens = nil if ay and ay.between?(0, @model.bytes.size-1) b = @model.p2b(0, ay) *************** *** 374,379 **** options |= 2 if @lines[ay].folded_lines > 0 render_ay = ay end ! @canvas.render_row(y, fragment, render_ay, options) end @canvas.cursor_show(@cursor_x, cy) if cy --- 375,381 ---- options |= 2 if @lines[ay].folded_lines > 0 render_ay = ay + pens = @lexer.colorize(ay) if @lexer end ! @canvas.render_row(y, fragment, render_ay, pens, options) end @canvas.cursor_show(@cursor_x, cy) if cy From neoneye at rubyforge.org Fri Feb 4 13:50:59 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 4 13:51:00 2005 Subject: [Aeditor-commit] projects/documents/homepage/aeditor_shots 056.png Message-ID: <200502041850.j14IoxdS015770@rubyforge.org> Update of /var/cvs/aeditor/projects/documents/homepage/aeditor_shots In directory rubyforge.org:/tmp/cvs-serv15647 Added Files: 056.png Log Message: picture of today. --- NEW FILE: 056.png --- (This appears to be a binary file; contents omitted.) From neoneye at rubyforge.org Sat Feb 5 07:09:13 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 5 07:09:14 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb Message-ID: <200502051209.j15C9DdS028857@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv28824 Modified Files: Tag: b04022005 core.rb Log Message: fuchsto pointed out that my error message were wrong. Fixed.. Thanks. Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.1 retrieving revision 1.70.2.2 diff -C2 -d -r1.70.2.1 -r1.70.2.2 *** core.rb 4 Feb 2005 18:46:03 -0000 1.70.2.1 --- core.rb 5 Feb 2005 12:09:11 -0000 1.70.2.2 *************** *** 86,90 **** if x < 0 raise ArgumentError, ! "x must be greater than 0, but was #{x}." end n = 0 --- 86,90 ---- if x < 0 raise ArgumentError, ! "x must be greater or equal to 0, but was #{x}." end n = 0 From neoneye at rubyforge.org Sat Feb 5 07:41:24 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 5 07:41:25 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES lexer.rb main_tui.rb Message-ID: <200502051241.j15CfOdS029567@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv29542 Modified Files: Tag: b04022005 CHANGES lexer.rb main_tui.rb Log Message: syntax coloring has become a little more faster.. because I disabled some debug statements in the lexer. Index: lexer.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/lexer.rb,v retrieving revision 1.1 retrieving revision 1.1.2.1 diff -C2 -d -r1.1 -r1.1.2.1 *** lexer.rb 3 Feb 2005 07:58:28 -0000 1.1 --- lexer.rb 5 Feb 2005 12:41:22 -0000 1.1.2.1 *************** *** 202,206 **** # check for normal code tokens.each do |bad, good| ! $logger.debug(2) { "processing bad=#{bad} good=#{good}" } if bad format(bad, :bad) --- 202,206 ---- # check for normal code tokens.each do |bad, good| ! #$logger.debug(2) { "processing bad=#{bad} good=#{good}" } if bad format(bad, :bad) *************** *** 475,479 **** escaped_letter = s1[1, 1] ok = chars.any?{|char| escaped_letter.include?(char)} ! $logger.debug(2) { "filter s1=#{s1.inspect} chars=#{chars.inspect} ok=#{ok.inspect}" } s0, s1 = s1, nil unless ok end --- 475,479 ---- escaped_letter = s1[1, 1] ok = chars.any?{|char| escaped_letter.include?(char)} ! #$logger.debug(2) { "filter s1=#{s1.inspect} chars=#{chars.inspect} ok=#{ok.inspect}" } s0, s1 = s1, nil unless ok end *************** *** 567,571 **** tokens = tokenize(text) tokens.each do |bad, good| ! $logger.debug(2) { "processing bad=#{bad} good=#{good}" } if bad format(bad, :bad) --- 567,571 ---- tokens = tokenize(text) tokens.each do |bad, good| ! #$logger.debug(2) { "processing bad=#{bad} good=#{good}" } if bad format(bad, :bad) *************** *** 609,613 **** if is_modulo ! $logger.debug(2) { "this is modulo" } format(good.slice!(0, 1), :punct) lex_line_normal(good) --- 609,613 ---- if is_modulo ! #$logger.debug(2) { "this is modulo" } format(good.slice!(0, 1), :punct) lex_line_normal(good) *************** *** 661,665 **** #p "before good=#{good.inspect}" if is_division ! $logger.debug(2) { "this is division" } format(good.slice!(0, 1), :punct) lex_line_normal(good) --- 661,665 ---- #p "before good=#{good.inspect}" if is_division ! #$logger.debug(2) { "this is division" } format(good.slice!(0, 1), :punct) lex_line_normal(good) Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.1 retrieving revision 1.72.2.2 diff -C2 -d -r1.72.2.1 -r1.72.2.2 *** main_tui.rb 4 Feb 2005 18:46:03 -0000 1.72.2.1 --- main_tui.rb 5 Feb 2005 12:41:22 -0000 1.72.2.2 *************** *** 43,47 **** @colors.default = 1 tokens.each_with_index do |tok, i| ! $logger.info states.inspect @pens += [ @colors[states[i]] ] * tok.size end --- 43,47 ---- @colors.default = 1 tokens.each_with_index do |tok, i| ! #$logger.info states.inspect @pens += [ @colors[states[i]] ] * tok.size end Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.44 retrieving revision 1.44.2.1 diff -C2 -d -r1.44 -r1.44.2.1 *** CHANGES 4 Feb 2005 15:27:03 -0000 1.44 --- CHANGES 5 Feb 2005 12:41:22 -0000 1.44.2.1 *************** *** 1,3 **** --- 1,4 ---- 04-02-2005 Neoneye + * got early syntax coloring working. * integrated LRU cache with the linestate cache and named it Lexer::Simple. A lexer must derive from this class and just From neoneye at rubyforge.org Sat Feb 5 10:48:58 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 5 10:49:00 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb main_tui.rb Message-ID: <200502051548.j15FmwdS005060@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv5017 Modified Files: Tag: b04022005 core.rb main_tui.rb Log Message: I had forgotten to attach the Lexer::Simple cache to the model. I had forgotten to resize the lexer cache to the right size. I have investigated how to probe for if an incoming event is present, so we don't update.. which is not enabled right now. Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.2 retrieving revision 1.72.2.3 diff -C2 -d -r1.72.2.2 -r1.72.2.3 *** main_tui.rb 5 Feb 2005 12:41:22 -0000 1.72.2.2 --- main_tui.rb 5 Feb 2005 15:48:56 -0000 1.72.2.3 *************** *** 110,113 **** --- 110,114 ---- @lexer = LexRuby.new(@model) @view.lexer = @lexer + @model.attach(@lexer) #@lexer = MockLexer.new #@view.lexer = @lexer *************** *** 147,180 **** dump_statistics dump_memory_info loop do #GC.disable ! event = @canvas.getch ! break if event == 24 ! begin ! if @dispatch2 ! $logger.debug "dispatch2 with " + ! "#{@dispatch2.to_s} key-code=#{event}" ! send(@dispatch2, event) ! @dispatch2 = nil ! else ! $logger.debug "dispatch key-code=#{event}" ! dispatch(event) end - rescue => e - bt = e.backtrace.map{|s| - a, b, c = s.split(':', 3) - bn = File.basename(a) - "%15s | %5s | %s" % [bn, b, c] - }.join("\n") - $logger.error "exception:\n" + - "#{e.class} #{e.message}\n" + bt end @view.scroll_to_cursor ! #dump_memory_info("before update") ! @view.update ! #dump_memory_info("after update, before GC") ! #GC.enable ! GC.start ! dump_memory_info("after GC") end @canvas.clear --- 148,203 ---- dump_statistics dump_memory_info + timeout = true loop do #GC.disable ! ! event = nil ! should_update = true ! r = (timeout) ? select([$stdin], nil, nil, 0.05) : [1] ! if r and r.size > 0 ! event = @canvas.getch ! timeout = true ! should_update = false ! ! else ! timeout = false ! should_update = true ! end ! ! #event = @canvas.getch ! if event ! break if event == 24 ! begin ! if @dispatch2 ! $logger.debug "dispatch2 with " + ! "#{@dispatch2.to_s} key-code=#{event}" ! send(@dispatch2, event) ! @dispatch2 = nil ! else ! $logger.debug "dispatch key-code=#{event}" ! dispatch(event) ! end ! rescue => e ! bt = e.backtrace.map{|s| ! a, b, c = s.split(':', 3) ! bn = File.basename(a) ! "%15s | %5s | %s" % [bn, b, c] ! }.join("\n") ! $logger.error "exception:\n" + ! "#{e.class} #{e.message}\n" + bt end end @view.scroll_to_cursor ! should_update = true # TODO: remove me ! if should_update ! #dump_memory_info("before update") ! @view.update ! #dump_memory_info("after update, before GC") ! #GC.enable ! GC.start ! dump_memory_info("after GC") ! else ! @view.update_cursor ! end end @canvas.clear Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.2 retrieving revision 1.70.2.3 diff -C2 -d -r1.70.2.2 -r1.70.2.3 *** core.rb 5 Feb 2005 12:09:11 -0000 1.70.2.2 --- core.rb 5 Feb 2005 15:48:56 -0000 1.70.2.3 *************** *** 342,345 **** --- 342,347 ---- "cursor=#{@cursor_x},#{@cursor_y}" + @lexer.resize(@height*5) if @lexer + vis = visible found_i = nil *************** *** 382,385 **** --- 384,415 ---- @canvas.refresh end + def update_cursor + return unless @canvas + vis = visible + found_i = nil + if @scroll_y >= 0 + vis.each_with_index do |y, i| + if y >= @scroll_y + found_i = i + break + end + end + else + found_i = @scroll_y + end + @canvas.scroll_x = @scroll_x + cy = nil + 0.upto(@height-1) do |y| + ay = nil + if found_i and (found_i + y).between?(0, vis.size-1) + ay = vis[found_i + y] + end + if @cursor_y == ay + cy = y + end + end + @canvas.cursor_show(@cursor_x, cy) + @canvas.refresh + end # NOTE: there is intentionally no check for if y is # inside the buffer.. because we want to be able to From neoneye at rubyforge.org Sat Feb 5 12:45:35 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 5 12:45:36 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES main_tui.rb Message-ID: <200502051745.j15HjZdS010816@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv10799 Modified Files: Tag: b04022005 CHANGES main_tui.rb Log Message: fixed bug in #render_row Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.3 retrieving revision 1.72.2.4 diff -C2 -d -r1.72.2.3 -r1.72.2.4 *** main_tui.rb 5 Feb 2005 15:48:56 -0000 1.72.2.3 --- main_tui.rb 5 Feb 2005 17:45:33 -0000 1.72.2.4 *************** *** 165,169 **** end - #event = @canvas.getch if event break if event == 24 --- 165,168 ---- *************** *** 189,193 **** end @view.scroll_to_cursor - should_update = true # TODO: remove me if should_update #dump_memory_info("before update") --- 188,191 ---- *************** *** 196,200 **** #GC.enable GC.start ! dump_memory_info("after GC") else @view.update_cursor --- 194,198 ---- #GC.enable GC.start ! #dump_memory_info("after GC") else @view.update_cursor *************** *** 343,350 **** def render_row(vy, text, ay, pens, options) ! ! sel1 = 0 ! sel2 = -1 ! if @view.sel_mode and ay if (@view.sel_y == ay and @view.cursor_y == ay) sel1, sel2 = [@view.sel_x, @view.cursor_x].sort --- 341,350 ---- def render_row(vy, text, ay, pens, options) ! ! sy1, sy2 = [@view.sel_y, @view.cursor_y].sort ! is_selected = (ay and @view.sel_mode and sy1 <= ay and ay <= sy2) ! ! sel1, sel2 = 0, -1 ! if is_selected if (@view.sel_y == ay and @view.cursor_y == ay) sel1, sel2 = [@view.sel_x, @view.cursor_x].sort *************** *** 366,374 **** info = RenderInfo.new( text, ay, options, ! sel1, sel2, @view.sel_mode, @scroll_x) if info.equal?(@render_info[vy]) return # nothing to render end @render_info[vy] = info @n = 6 # reserve some space for line-numbers --- 366,376 ---- info = RenderInfo.new( text, ay, options, ! sel1, sel2, is_selected, @scroll_x) if info.equal?(@render_info[vy]) + #$logger.debug "row ##{vy} - ignore: #{info.inspect}" return # nothing to render end @render_info[vy] = info + #$logger.debug "row ##{vy} - store: #{info.inspect}" @n = 6 # reserve some space for line-numbers Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.44.2.1 retrieving revision 1.44.2.2 diff -C2 -d -r1.44.2.1 -r1.44.2.2 *** CHANGES 5 Feb 2005 12:41:22 -0000 1.44.2.1 --- CHANGES 5 Feb 2005 17:45:33 -0000 1.44.2.2 *************** *** 1,2 **** --- 1,8 ---- + 05-02-2005 Neoneye + * enabled all those things which I had forgotten when I wrote + the Lexer::Simple. Now it renders very fast. + * Flush the input queue, so that keystrokes doesn't lags. + * Fixed bug in main_tui.rb's render_row caching. + 04-02-2005 Neoneye * got early syntax coloring working. From neoneye at rubyforge.org Sat Feb 5 12:58:22 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 5 12:58:23 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source TODO main_tui.rb Message-ID: <200502051758.j15HwMdS011096@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv11082 Modified Files: Tag: b04022005 TODO main_tui.rb Log Message: on last line.. there are no tokens.. this is to prevent from crashing. Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.4 retrieving revision 1.72.2.5 diff -C2 -d -r1.72.2.4 -r1.72.2.5 *** main_tui.rb 5 Feb 2005 17:45:33 -0000 1.72.2.4 --- main_tui.rb 5 Feb 2005 17:58:20 -0000 1.72.2.5 *************** *** 42,45 **** --- 42,49 ---- } @colors.default = 1 + unless tokens + $logger.error "no tokens" + return + end tokens.each_with_index do |tok, i| #$logger.info states.inspect Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.41 retrieving revision 1.41.2.1 diff -C2 -d -r1.41 -r1.41.2.1 *** TODO 2 Feb 2005 22:08:15 -0000 1.41 --- TODO 5 Feb 2005 17:58:20 -0000 1.41.2.1 *************** *** 1,5 **** render with colors. ! A: syntax coloring, just import the old lexer. ! B: faster via caching. --- 1,9 ---- render with colors. ! * propagate state to the following lines. ! * rubylexer should deal with unicode glyphs. ! * choose a lexer depending on the file suffix. ! ! misc: ! * all operations must write themselves to the logfile. From neoneye at rubyforge.org Sun Feb 6 04:19:29 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 6 04:19:31 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502060919.j169JTdS014375@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv14370 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: now all tests passes ok again. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67 retrieving revision 1.67.2.1 diff -C2 -d -r1.67 -r1.67.2.1 *** test_core.rb 4 Feb 2005 15:27:03 -0000 1.67 --- test_core.rb 6 Feb 2005 09:19:27 -0000 1.67.2.1 *************** *** 280,284 **** @sx << x end ! def render_row(y, utf8_string, ay, options) @data << utf8_string end --- 280,284 ---- @sx << x end ! def render_row(y, utf8_string, ay, pens, options) @data << utf8_string end *************** *** 311,315 **** end ! class MockLexer < AEditor::Lexer::Base end --- 311,328 ---- end ! class MockLexer < AEditor::Lexer::Simple ! def initialize(model) ! super(model) ! @state_counter = 1 ! end ! def lex_line(text) ! #puts "lex #{text.inspect}" ! pen = text[0, 1].to_i ! glyphs = text.unpack('U*') ! @pens = glyphs.map{|g| pen} ! @right = @state_counter ! @state_counter += 1 ! nil ! end end Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.3 retrieving revision 1.70.2.4 diff -C2 -d -r1.70.2.3 -r1.70.2.4 *** core.rb 5 Feb 2005 15:48:56 -0000 1.70.2.3 --- core.rb 6 Feb 2005 09:19:27 -0000 1.70.2.4 *************** *** 901,905 **** @view = v end ! def render_row(y, utf8_string, options) raise NoMethodError, "derived class should implement this method" end --- 901,905 ---- @view = v end ! def render_row(y, utf8_string, render_ay, pens, options) raise NoMethodError, "derived class should implement this method" end *************** *** 1032,1041 **** end def lex_line(text) - #puts "lex #{text.inspect}" - pen = text[0, 1].to_i - glyphs = text.unpack('U*') - @pens = glyphs.map{|g| pen} - @right = @state_counter - @state_counter += 1 nil end --- 1032,1035 ---- From neoneye at rubyforge.org Sun Feb 6 04:59:32 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 6 04:59:32 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source main_tui.rb Message-ID: <200502060959.j169xWdS026433@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv26418 Modified Files: Tag: b04022005 main_tui.rb Log Message: the lexer can now propagate its state to the following lines. Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.5 retrieving revision 1.72.2.6 diff -C2 -d -r1.72.2.5 -r1.72.2.6 *** main_tui.rb 5 Feb 2005 17:58:20 -0000 1.72.2.5 --- main_tui.rb 6 Feb 2005 09:59:30 -0000 1.72.2.6 *************** *** 28,36 **** super(model) @lexer = LexerRuby::Lexer.new end def lex_line(text) ! @lexer.set_states([]) @lexer.set_result([]) @lexer.lex_line(text) tokens, states = @lexer.result.transpose @pens = [] --- 28,40 ---- super(model) @lexer = LexerRuby::Lexer.new + @left = [] + @right = nil end def lex_line(text) ! states = (@left == 0) ? [] : @left.map{|i| i.clone} ! @lexer.set_states(states) @lexer.set_result([]) @lexer.lex_line(text) + @right = @lexer.states tokens, states = @lexer.result.transpose @pens = [] *************** *** 59,63 **** class RenderInfo def initialize( ! text, absolute_y, options, sel1, sel2, sel_mode, scroll_x) @text = text @absolute_y = absolute_y --- 63,69 ---- class RenderInfo def initialize( ! text, absolute_y, options, ! sel1, sel2, sel_mode, ! scroll_x, pens) @text = text @absolute_y = absolute_y *************** *** 67,73 **** --- 73,81 ---- @sel_mode = sel_mode @scroll_x = scroll_x + @pens = pens end attr_reader :text, :absolute_y, :options attr_reader :sel1, :sel2, :sel_mode, :scroll_x + attr_reader :pens def equal?(other) return false unless other.kind_of?(RenderInfo) *************** *** 79,82 **** --- 87,91 ---- return false if @sel_mode != other.sel_mode return false if @scroll_x != other.scroll_x + return false if @pens != other.pens true end *************** *** 370,374 **** info = RenderInfo.new( text, ay, options, ! sel1, sel2, is_selected, @scroll_x) if info.equal?(@render_info[vy]) #$logger.debug "row ##{vy} - ignore: #{info.inspect}" --- 379,384 ---- info = RenderInfo.new( text, ay, options, ! sel1, sel2, is_selected, ! @scroll_x, pens) if info.equal?(@render_info[vy]) #$logger.debug "row ##{vy} - ignore: #{info.inspect}" From neoneye at rubyforge.org Sun Feb 6 06:06:59 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 6 06:07:00 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES TODO core.rb main_tui.rb Message-ID: <200502061106.j16B6xdS002691@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv2678 Modified Files: Tag: b04022005 CHANGES TODO core.rb main_tui.rb Log Message: added cache statistics Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.6 retrieving revision 1.72.2.7 diff -C2 -d -r1.72.2.6 -r1.72.2.7 *** main_tui.rb 6 Feb 2005 09:59:30 -0000 1.72.2.6 --- main_tui.rb 6 Feb 2005 11:06:57 -0000 1.72.2.7 *************** *** 136,140 **** --- 136,142 ---- @render_info = {} + reset_counters end + attr_reader :count_hit, :count_miss def self.run(filename) require 'ncursesw' *************** *** 151,154 **** --- 153,160 ---- end end + def reset_counters + @count_hit = 0 + @count_miss = 0 + end def render_cache_clear @render_info = {} *************** *** 383,390 **** --- 389,398 ---- if info.equal?(@render_info[vy]) #$logger.debug "row ##{vy} - ignore: #{info.inspect}" + @count_hit += 1 return # nothing to render end @render_info[vy] = info #$logger.debug "row ##{vy} - store: #{info.inspect}" + @count_miss += 1 @n = 6 # reserve some space for line-numbers Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.44.2.2 retrieving revision 1.44.2.3 diff -C2 -d -r1.44.2.2 -r1.44.2.3 *** CHANGES 5 Feb 2005 17:45:33 -0000 1.44.2.2 --- CHANGES 6 Feb 2005 11:06:57 -0000 1.44.2.3 *************** *** 1,2 **** --- 1,6 ---- + 06-02-2005 Neoneye + * We now count number of hits+misses per update. + * propagate the right-state to the next line. + 05-02-2005 Neoneye * enabled all those things which I had forgotten when I wrote Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.41.2.1 retrieving revision 1.41.2.2 diff -C2 -d -r1.41.2.1 -r1.41.2.2 *** TODO 5 Feb 2005 17:58:20 -0000 1.41.2.1 --- TODO 6 Feb 2005 11:06:57 -0000 1.41.2.2 *************** *** 1,4 **** render with colors. ! * propagate state to the following lines. * rubylexer should deal with unicode glyphs. * choose a lexer depending on the file suffix. --- 1,7 ---- render with colors. ! * fix bug in caching.. so it will invalidate the right lines. ! I suspects its the model_update when removing lines. ! * propagation occurs.. but is rendered wrong. ! * delayed rendering looks ugly, please render it immediately. * rubylexer should deal with unicode glyphs. * choose a lexer depending on the file suffix. Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.4 retrieving revision 1.70.2.5 diff -C2 -d -r1.70.2.4 -r1.70.2.5 *** core.rb 6 Feb 2005 09:19:27 -0000 1.70.2.4 --- core.rb 6 Feb 2005 11:06:57 -0000 1.70.2.5 *************** *** 337,346 **** end def update return unless @canvas - $logger.info "view update, " + - "scroll=#{@scroll_x},#{@scroll_y} " + - "cursor=#{@cursor_x},#{@cursor_y}" ! @lexer.resize(@height*5) if @lexer vis = visible --- 337,353 ---- end def update + #$logger.info "view update, " + + # "scroll=#{@scroll_x},#{@scroll_y} " + + # "cursor=#{@cursor_x},#{@cursor_y} " + + # "size=#{@width},#{@height}" + return unless @canvas ! @canvas.reset_counters ! ! if @lexer ! @lexer.reset_counters ! @lexer.resize(@height*5) ! end vis = visible *************** *** 383,386 **** --- 390,403 ---- @canvas.cursor_show(@cursor_x, cy) if cy @canvas.refresh + + msg = "" + if @lexer + msg = " lexer=#{@lexer.count_hit},#{@lexer.count_miss}" + end + $logger.info "update: " + + "scroll=#{@scroll_x},#{@scroll_y} " + + "cursor=#{@cursor_x},#{@cursor_y} " + + "size=#{@width},#{@height} " + + "canvas=#{@canvas.count_hit},#{@canvas.count_miss}" + msg end def update_cursor *************** *** 1004,1007 **** --- 1021,1025 ---- class Simple < Base def initialize(model) + reset_counters @right_states = [] @topmost_dirty_line = 0 *************** *** 1012,1016 **** super(model) end ! attr_reader :lru def resize(n) @lru.resize(n) --- 1030,1038 ---- super(model) end ! attr_reader :lru, :count_hit, :count_miss ! def reset_counters ! @count_hit = 0 ! @count_miss = 0 ! end def resize(n) @lru.resize(n) *************** *** 1057,1060 **** --- 1079,1083 ---- lex_line(@model.line(y)) set_right_state(y, @right) + @count_miss += 1 end *************** *** 1065,1073 **** lex_line(@model.line(y)) set_right_state(y, @right) end if ay < @right_states.size and @right_states[ay] res = @lru[ay] ! return res if res end --- 1088,1100 ---- lex_line(@model.line(y)) set_right_state(y, @right) + @count_miss += 1 end if ay < @right_states.size and @right_states[ay] res = @lru[ay] ! if res ! @count_hit += 1 ! return res ! end end *************** *** 1077,1080 **** --- 1104,1108 ---- @topmost_dirty_line = [@topmost_dirty_line, ay + 1].max set_right_state(ay, @right) + @count_miss += 1 @lru[ay] = @pens From neoneye at rubyforge.org Sun Feb 6 09:26:44 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 6 09:26:45 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb main_tui.rb Message-ID: <200502061426.j16EQidS010326@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv10276 Modified Files: Tag: b04022005 core.rb main_tui.rb Log Message: I just tried open a UTF-8 document.. containing weird glyphs. LibC::wcwidth sometimes return 0.. which I cannot use. In this case we output a red questionmark. Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.7 retrieving revision 1.72.2.8 diff -C2 -d -r1.72.2.7 -r1.72.2.8 *** main_tui.rb 6 Feb 2005 11:06:57 -0000 1.72.2.7 --- main_tui.rb 6 Feb 2005 14:26:42 -0000 1.72.2.8 *************** *** 423,428 **** push_fullwidth(glyph, pen || 1) else ! $logger.error "unknown glyph #{glyph.inspect}" ! raise "glyph problem" end end --- 423,428 ---- push_fullwidth(glyph, pen || 1) else ! $logger.error "unknown glyph code=#{glyph.inspect} w=#{w}" ! push_halfwidth('?'[0], 9) end end Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.5 retrieving revision 1.70.2.6 diff -C2 -d -r1.70.2.5 -r1.70.2.6 *** core.rb 6 Feb 2005 11:06:57 -0000 1.70.2.5 --- core.rb 6 Feb 2005 14:26:42 -0000 1.70.2.6 *************** *** 291,295 **** if info.event == :before @old_p = xy2p(@cursor_x, @cursor_y) ! $logger.info "view old_p=#{@old_p}" return end --- 291,295 ---- if info.event == :before @old_p = xy2p(@cursor_x, @cursor_y) ! #$logger.info "view old_p=#{@old_p}" return end *************** *** 499,503 **** return 1 unless @canvas return 1 unless @canvas.respond_to?(:measure_width) ! @canvas.measure_width(x, glyph) end # translate from canvas coordinates to buffer coordinates --- 499,506 ---- return 1 unless @canvas return 1 unless @canvas.respond_to?(:measure_width) ! w = @canvas.measure_width(x, glyph) ! return w if glyph == 9 ! return 1 if w != 1 and w != 2 ! w end # translate from canvas coordinates to buffer coordinates From neoneye at rubyforge.org Sun Feb 6 09:59:45 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 6 09:59:46 2005 Subject: [Aeditor-commit] projects/documents/homepage/aeditor_shots 057.png Message-ID: <200502061459.j16ExjdS011019@rubyforge.org> Update of /var/cvs/aeditor/projects/documents/homepage/aeditor_shots In directory rubyforge.org:/tmp/cvs-serv10955 Added Files: 057.png Log Message: experiments with utf8 glyphs --- NEW FILE: 057.png --- (This appears to be a binary file; contents omitted.) From neoneye at rubyforge.org Sun Feb 6 11:31:21 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 6 11:31:22 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb main_tui.rb Message-ID: <200502061631.j16GVLdS016873@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv16866 Modified Files: Tag: b04022005 core.rb main_tui.rb Log Message: cleaned up output to logfile. made all tests pass ok again. Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.8 retrieving revision 1.72.2.9 diff -C2 -d -r1.72.2.8 -r1.72.2.9 *** main_tui.rb 6 Feb 2005 14:26:42 -0000 1.72.2.8 --- main_tui.rb 6 Feb 2005 16:31:19 -0000 1.72.2.9 *************** *** 136,145 **** @render_info = {} - reset_counters end - attr_reader :count_hit, :count_miss def self.run(filename) require 'ncursesw' ! dump_memory_info CursesCanvas.open do |c| oldtitle = c.get_title || "AEditor has exited" --- 136,143 ---- @render_info = {} end def self.run(filename) require 'ncursesw' ! #dump_memory_info CursesCanvas.open do |c| oldtitle = c.get_title || "AEditor has exited" *************** *** 153,160 **** end end - def reset_counters - @count_hit = 0 - @count_miss = 0 - end def render_cache_clear @render_info = {} --- 151,154 ---- *************** *** 162,169 **** def event_loop @view.resize(width, height) ! dump_memory_info("before update") @view.update ! dump_memory_info("after update") ! dump_statistics dump_memory_info timeout = true --- 156,163 ---- def event_loop @view.resize(width, height) ! #dump_memory_info("before update") @view.update ! #dump_memory_info("after update") ! #dump_statistics dump_memory_info timeout = true *************** *** 300,303 **** --- 294,298 ---- when 266 dump_statistics + dump_memory_info when 330 case @selection_mode *************** *** 540,544 **** begin $logger.info "program begin." ! dump_memory_info MainTUI.run(ARGV.empty? ? nil : ARGV[0]) rescue Exception => e --- 535,539 ---- begin $logger.info "program begin." ! #dump_memory_info MainTUI.run(ARGV.empty? ? nil : ARGV[0]) rescue Exception => e Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.6 retrieving revision 1.70.2.7 diff -C2 -d -r1.70.2.6 -r1.70.2.7 *** core.rb 6 Feb 2005 14:26:42 -0000 1.70.2.6 --- core.rb 6 Feb 2005 16:31:19 -0000 1.70.2.7 *************** *** 124,129 **** # replace a region with something else def replace(x1, y1, x2, y2, utf8_str) ! $logger.debug "model replace x1=#{x1.inspect} y1=#{y1.inspect} " + ! "x2=#{x2.inspect} y2=#{y2.inspect} text=#{utf8_str.inspect}" check_integer(x1) check_integer(y1) --- 124,129 ---- # replace a region with something else def replace(x1, y1, x2, y2, utf8_str) ! $logger.debug "model replace xy1=#{x1.inspect},#{y1.inspect} " + ! "xy2=#{x2.inspect},#{y2.inspect} text.size=#{utf8_str.size}" check_integer(x1) check_integer(y1) *************** *** 912,915 **** --- 912,916 ---- class Base def initialize + reset_counters @view = nil @scroll_x = 0 *************** *** 917,920 **** --- 918,922 ---- attr_reader :view attr_accessor :scroll_x + attr_reader :count_hit, :count_miss def view=(v) raise TypeError unless v == nil or v.kind_of?(View::Caretaker) *************** *** 933,936 **** --- 935,942 ---- raise NoMethodError, "derived class should implement this method" end + def reset_counters + @count_hit = 0 + @count_miss = 0 + end end From neoneye at rubyforge.org Sun Feb 6 11:48:56 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 6 11:48:56 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502061648.j16GmudS017357@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv17328 Modified Files: Tag: b04022005 test_core.rb Log Message: I cannot seem to reproduce the problem im having when I run the editor interactively. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.1 retrieving revision 1.67.2.2 diff -C2 -d -r1.67.2.1 -r1.67.2.2 *** test_core.rb 6 Feb 2005 09:19:27 -0000 1.67.2.1 --- test_core.rb 6 Feb 2005 16:48:53 -0000 1.67.2.2 *************** *** 1951,1955 **** 5.times {|y| @lexer.colorize(y) } assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) ! @model.replace(0, 2, 0, 3, "") assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') end --- 1951,1966 ---- 5.times {|y| @lexer.colorize(y) } assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) ! @model.replace(0, 2, 0, 3, "") # delete the whole line ! # line #2 is erased, line #3 is dirtified, these lines are not in the LRU ! assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') ! end ! def test_caching7 ! @model.load((1..9).to_a.join("\n")) ! @lexer.resize(5) ! 5.times {|y| @lexer.colorize(y) } ! assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) ! @model.replace(1, 2, 0, 3, "") # simulate joinline ! assert_equal("1\n2\n34\n5\n6\n7\n8\n9", @model.text) ! # line #2 is erased, line #3 is dirtified, these lines are not in the LRU assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') end From neoneye at rubyforge.org Sun Feb 6 13:48:28 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 6 13:48:31 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502061848.j16ImSdS023785@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv23777 Modified Files: Tag: b04022005 test_core.rb Log Message: added an extra test of the lexer.. this is tricky stuff. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.2 retrieving revision 1.67.2.3 diff -C2 -d -r1.67.2.2 -r1.67.2.3 *** test_core.rb 6 Feb 2005 16:48:53 -0000 1.67.2.2 --- test_core.rb 6 Feb 2005 18:48:26 -0000 1.67.2.3 *************** *** 1940,1944 **** assert_equal([4, 3, 1, 0], @lexer.lru.used, 'dirtification') end ! def test_caching5 @lexer.resize(5) 5.times {|y| @lexer.colorize(y) } --- 1940,1944 ---- assert_equal([4, 3, 1, 0], @lexer.lru.used, 'dirtification') end ! def test_caching_insert1 @lexer.resize(5) 5.times {|y| @lexer.colorize(y) } *************** *** 1947,1951 **** assert_equal([5, 4, 3, 1, 0], @lexer.lru.used, 'positive displacement') end ! def test_caching6 @lexer.resize(5) 5.times {|y| @lexer.colorize(y) } --- 1947,1964 ---- assert_equal([5, 4, 3, 1, 0], @lexer.lru.used, 'positive displacement') end ! # TODO: exercise the @lexer.set_right_state when its dirtifying the following line ! # TODO: figure out how this should work ! def xtest_caching_insert2 ! @model.load("aaaa\nbbbb\ncccc\ndddd\neeee\nffff") ! @lexer.resize(5) ! 5.times {|y| @lexer.colorize(y) } ! assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) ! @model.replace(2, 2, 2, 2, "\n") ! assert_equal("aaaa\nbbbb\ncc\ncc\ndddd\neeee\nffff", @model.text) ! # line #2 is splitted into 2 parts.. which becomes line #2 and #3 ! # line #3 and #4 is displaced.. and becomes line #4 and #5 ! assert_equal([5, 4, 1, 0], @lexer.lru.used, 'positive displacement') ! end ! def test_caching_remove1 @lexer.resize(5) 5.times {|y| @lexer.colorize(y) } *************** *** 1955,1959 **** assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') end ! def test_caching7 @model.load((1..9).to_a.join("\n")) @lexer.resize(5) --- 1968,1972 ---- assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') end ! def test_caching_remove2 @model.load((1..9).to_a.join("\n")) @lexer.resize(5) From neoneye at rubyforge.org Sun Feb 6 13:52:33 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 6 13:52:35 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source TODO Message-ID: <200502061852.j16IqXdS023905@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv23898 Modified Files: Tag: b04022005 TODO Log Message: big problems with caching Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.41.2.2 retrieving revision 1.41.2.3 diff -C2 -d -r1.41.2.2 -r1.41.2.3 *** TODO 6 Feb 2005 11:06:57 -0000 1.41.2.2 --- TODO 6 Feb 2005 18:52:31 -0000 1.41.2.3 *************** *** 3,6 **** --- 3,8 ---- I suspects its the model_update when removing lines. * propagation occurs.. but is rendered wrong. + @lexer.set_right_state should compare the state + of the current line.. rather than the following line. * delayed rendering looks ugly, please render it immediately. * rubylexer should deal with unicode glyphs. From neoneye at rubyforge.org Mon Feb 7 12:38:00 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 7 12:38:00 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source main_tui.rb Message-ID: <200502071738.j17Hc0dS018173@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv18167 Modified Files: Tag: b04022005 main_tui.rb Log Message: still lexing is slow Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.9 retrieving revision 1.72.2.10 diff -C2 -d -r1.72.2.9 -r1.72.2.10 *** main_tui.rb 6 Feb 2005 16:31:19 -0000 1.72.2.9 --- main_tui.rb 7 Feb 2005 17:37:57 -0000 1.72.2.10 *************** *** 177,181 **** should_update = true end ! if event break if event == 24 --- 177,182 ---- should_update = true end ! ! t1 = Time.now if event break if event == 24 *************** *** 211,214 **** --- 212,218 ---- @view.update_cursor end + t2 = Time.now + $logger.info "this operation took #{t2 - t1} seconds" + #end end @canvas.clear From neoneye at rubyforge.org Mon Feb 14 08:06:39 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 08:06:40 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502141306.j1ED6ddS025120@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv25112 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: preparing for a new caching system Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.3 retrieving revision 1.67.2.4 diff -C2 -d -r1.67.2.3 -r1.67.2.4 *** test_core.rb 6 Feb 2005 18:48:26 -0000 1.67.2.3 --- test_core.rb 14 Feb 2005 13:06:37 -0000 1.67.2.4 *************** *** 1678,1682 **** end def test_init ! assert_equal(1, @lru.size) end def test_store1 --- 1678,1682 ---- end def test_init ! assert_equal(1, @lru.capacity) end def test_store1 *************** *** 1775,1779 **** end ! class TestLexerSimple < Test::Unit::TestCase def setup super --- 1775,1779 ---- end ! class TestLexerSimple #< Test::Unit::TestCase def setup super *************** *** 1979,1980 **** --- 1979,2072 ---- end end + + class TestNewCache < Test::Unit::TestCase + class MockLexer < AEditor::Lexer::NewCache + def initialize(model) + super(model) + @count = 0 + end + attr_accessor :count + def lex_line(text) + @pens = [@count, @count, @count] + @right = @count + @count += 1 + nil + end + end + def setup + @model = AEditor::Model::Caretaker.new + @model.load(('a'..'z').to_a.map{|i| i * 2}.join("\n")) + @lexer = MockLexer.new(@model) + @model.attach(@lexer) + @lexer.resize(10) + end + def a_size(count) + assert_equal(count, @lexer.lru.size) + end + def lex(line_number) + @lexer.colorize(line_number) + end + def reset + @lexer.reset_counters + end + def a_stats(hit, miss) + assert_equal(hit, @lexer.count_sync_hit, 'wrong number of hits') + assert_equal(miss, @lexer.count_sync_miss, 'wrong number of misses') + @lexer.reset_counters + end + def test_incremental_access1 + a_size(0) + a_stats(0, 0) + lex(0) + a_size(1) + a_stats(0, 1) + lex(1) + a_size(2) + a_stats(1, 1) + lex(2) + a_size(3) + a_stats(2, 1) + lex(3) + a_size(4) + a_stats(3, 1) + end + def test_random_access1 + lex(2) + a_size(1) + a_stats(0, 3) + lex(5) + a_size(2) + a_stats(3, 3) + lex(3) + a_size(3) + a_stats(4, 0) + end + end + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.7 retrieving revision 1.70.2.8 diff -C2 -d -r1.70.2.7 -r1.70.2.8 *** core.rb 6 Feb 2005 16:31:19 -0000 1.70.2.7 --- core.rb 14 Feb 2005 13:06:37 -0000 1.70.2.8 *************** *** 950,969 **** class LRU def initialize ! @size = 1 @pens = {} @used = [] end ! attr_reader :size, :used, :pens def resize(n) raise ArgumentError if n < 0 ! @size = n wipe end def wipe ! while @used.size > @size @pens.delete(@used.pop) end end private :wipe def store(key, value) @used.delete(key) --- 950,972 ---- class LRU def initialize ! @capacity = 1 @pens = {} @used = [] end ! attr_reader :capacity, :used, :pens def resize(n) raise ArgumentError if n < 0 ! @capacity = n wipe end def wipe ! while @used.size > @capacity @pens.delete(@used.pop) end end private :wipe + def size + @used.size + end def store(key, value) @used.delete(key) *************** *** 1018,1025 **** end def resize(n) ! # do nothing end def model_update(model, info) ! # do nothing end def colorize(ay) --- 1021,1028 ---- end def resize(n) ! raise "derived class must overload" end def model_update(model, info) ! raise "derived class must overload" end def colorize(ay) *************** *** 1127,1130 **** --- 1130,1189 ---- end + class NewCache < Base + def initialize(model) + reset_counters + @right_states = [] + @left = 0 + @right = 0 + @pens = [] + @lru = LRU.new + super(model) + end + attr_reader :lru, :count_sync_hit, :count_sync_miss + attr_reader :count_color_hit, :count_color_miss + def reset_counters + @count_sync_hit = 0 + @count_sync_miss = 0 + @count_color_hit = 0 + @count_color_miss = 0 + end + def resize(n) + @lru.resize(n) + end + def sync_states(number_of_states) + 0.upto(number_of_states) do |i| + if i > @right_states.size + raise "should not happen" + end + if @right_states[i] + @count_sync_hit += 1 + next + end + @count_sync_miss += 1 + + @left = (i == 0) ? 0 : @right_states[i - 1] + lex_line(i) + + if @right != @right_states[i] + @right_states[i] = @right + @right_states[i+1] = nil + end + end + end + def colorize(line_number) + sync_states(line_number) + + @lru.store(line_number, @pens) + end + end + + + + + + + + + end # module Lexer From neoneye at rubyforge.org Mon Feb 14 09:41:17 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 09:41:19 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502141441.j1EEfHdS029714@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv29688 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: Argh.. I didn't realize that I had to delete the cached data from the LRU cache when I made the old cache. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.4 retrieving revision 1.67.2.5 diff -C2 -d -r1.67.2.4 -r1.67.2.5 *** test_core.rb 14 Feb 2005 13:06:37 -0000 1.67.2.4 --- test_core.rb 14 Feb 2005 14:41:15 -0000 1.67.2.5 *************** *** 1986,1992 **** @count = 0 end ! attr_accessor :count def lex_line(text) ! @pens = [@count, @count, @count] @right = @count @count += 1 --- 1986,1992 ---- @count = 0 end ! attr_accessor :count, :right_states def lex_line(text) ! @pens = "s#{@count}" @right = @count @count += 1 *************** *** 2010,2044 **** @lexer.reset_counters end ! def a_stats(hit, miss) ! assert_equal(hit, @lexer.count_sync_hit, 'wrong number of hits') ! assert_equal(miss, @lexer.count_sync_miss, 'wrong number of misses') @lexer.reset_counters end ! def test_incremental_access1 a_size(0) ! a_stats(0, 0) lex(0) ! a_size(1) ! a_stats(0, 1) lex(1) ! a_size(2) ! a_stats(1, 1) lex(2) ! a_size(3) ! a_stats(2, 1) lex(3) a_size(4) - a_stats(3, 1) end ! def test_random_access1 lex(2) ! a_size(1) ! a_stats(0, 3) lex(5) ! a_size(2) ! a_stats(3, 3) lex(3) a_size(3) ! a_stats(4, 0) end end --- 2010,2079 ---- @lexer.reset_counters end ! def a_color(expected, line_number) ! res = @lexer.colorize(line_number) ! e = [expected, expected, expected] ! assert_equal(e, res) ! end ! def a_stats(sync_hit, sync_miss, color_hit, color_miss) ! exp = [sync_hit, sync_miss, color_hit, color_miss] ! res = [@lexer.count_sync_hit, @lexer.count_sync_miss, ! @lexer.count_color_hit, @lexer.count_color_miss] ! assert_equal(exp, res) @lexer.reset_counters end ! def a_color_stats(color_hit, color_miss) ! exp = [color_hit, color_miss] ! res = [@lexer.count_color_hit, @lexer.count_color_miss] ! assert_equal(exp, res) ! @lexer.reset_counters ! end ! def a_right(*expected_right_states) ! assert_equal(expected_right_states, @lexer.right_states) ! end ! def test_accumulate_by_incremental_access1 a_size(0) ! a_stats(0, 0, 0, 0) ! a_right() lex(0) ! a_stats(0, 0, 0, 1) ! a_right(0) lex(1) ! a_stats(1, 0, 0, 1) ! a_right(0, 1) lex(2) ! a_stats(2, 0, 0, 1) ! a_right(0, 1, 2) lex(3) + a_stats(3, 0, 0, 1) + a_right(0, 1, 2, 3) a_size(4) end ! def test_accumulate_by_random_access1 lex(2) ! a_stats(0, 2, 0, 1) ! a_right(0, 1, 2) lex(5) ! a_stats(3, 2, 0, 1) ! a_right(0, 1, 2, 3, 4, 5) lex(3) + a_stats(3, 0, 0, 1) + a_right(0, 1, 2, 6, nil, 5) + lex(2) + a_stats(2, 0, 1, 0) + a_right(0, 1, 2, 6, nil, 5) + lex(5) + a_stats(4, 1, 0, 1) + a_right(0, 1, 2, 6, 7, 8) a_size(3) ! end ! def test_typical1 ! assert_equal("s0", @lexer.colorize(0)) ! assert_equal("s1", @lexer.colorize(1)) ! a_color_stats(0, 2) ! assert_equal("s0", @lexer.colorize(0)) ! assert_equal("s1", @lexer.colorize(1)) ! a_color_stats(2, 0) ! assert_equal("s2", @lexer.colorize(2)) ! a_color_stats(0, 1) end end Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.8 retrieving revision 1.70.2.9 diff -C2 -d -r1.70.2.8 -r1.70.2.9 *** core.rb 14 Feb 2005 13:06:37 -0000 1.70.2.8 --- core.rb 14 Feb 2005 14:41:15 -0000 1.70.2.9 *************** *** 1151,1154 **** --- 1151,1166 ---- @lru.resize(n) end + def dirty(y) + @right_states[y] = nil if y < @right_states.size + @lru.delete(y) + end + def set_right_state(y, state) + return if state == @right_states[y] + #puts "clearing #{y}, because #{state.inspect} is distinct " + + # "from #{@right_states[y].inspect}" + dirty(y) + dirty(y+1) + @right_states[y] = state + end def sync_states(number_of_states) 0.upto(number_of_states) do |i| *************** *** 1164,1178 **** @left = (i == 0) ? 0 : @right_states[i - 1] lex_line(i) ! ! if @right != @right_states[i] ! @right_states[i] = @right ! @right_states[i+1] = nil ! end end end def colorize(line_number) ! sync_states(line_number) ! @lru.store(line_number, @pens) end end --- 1176,1198 ---- @left = (i == 0) ? 0 : @right_states[i - 1] lex_line(i) ! set_right_state(i, @right) end end def colorize(line_number) ! #puts "line #{line_number}" ! sync_states(line_number-1) ! if @lru.has_key?(line_number) ! @count_color_hit += 1 ! return @lru[line_number] ! end ! @count_color_miss += 1 ! ! i = line_number ! @left = (i == 0) ? 0 : @right_states[i - 1] ! lex_line(i) ! set_right_state(i, @right) ! @lru[i] = @pens ! @pens end end From neoneye at rubyforge.org Mon Feb 14 11:10:46 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 11:10:47 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502141610.j1EGAkdS002615@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv2575 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: Today I built a lego model with postit notes attached so that I better could overview how things should work. I have now imported the testcases that exercises model_notify for the lexer cache.. I realized that I really need to dirtyfy the line which we are splitting. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.5 retrieving revision 1.67.2.6 diff -C2 -d -r1.67.2.5 -r1.67.2.6 *** test_core.rb 14 Feb 2005 14:41:15 -0000 1.67.2.5 --- test_core.rb 14 Feb 2005 16:10:44 -0000 1.67.2.6 *************** *** 1949,1963 **** # TODO: exercise the @lexer.set_right_state when its dirtifying the following line # TODO: figure out how this should work - def xtest_caching_insert2 - @model.load("aaaa\nbbbb\ncccc\ndddd\neeee\nffff") - @lexer.resize(5) - 5.times {|y| @lexer.colorize(y) } - assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) - @model.replace(2, 2, 2, 2, "\n") - assert_equal("aaaa\nbbbb\ncc\ncc\ndddd\neeee\nffff", @model.text) - # line #2 is splitted into 2 parts.. which becomes line #2 and #3 - # line #3 and #4 is displaced.. and becomes line #4 and #5 - assert_equal([5, 4, 1, 0], @lexer.lru.used, 'positive displacement') - end def test_caching_remove1 @lexer.resize(5) --- 1949,1952 ---- *************** *** 1996,2000 **** def setup @model = AEditor::Model::Caretaker.new ! @model.load(('a'..'z').to_a.map{|i| i * 2}.join("\n")) @lexer = MockLexer.new(@model) @model.attach(@lexer) --- 1985,1989 ---- def setup @model = AEditor::Model::Caretaker.new ! @model.load(('a'..'z').to_a.map{|i| i * 20}.join("\n")) @lexer = MockLexer.new(@model) @model.attach(@lexer) *************** *** 2077,2080 **** --- 2066,2142 ---- a_color_stats(0, 1) end + def test_modelnotify_same1 + lex(5) + @model.replace(0, 2, 1, 2, "0") + a_right(0, 1, nil, 3, 4, 5) + end + def test_modelnotify_same2 + lex(5) + @model.replace(0, 2, 1, 3, "0\n0") + a_right(0, 1, nil, nil, 4, 5) + end + def test_modelnotify_remove1 + lex(5) + @model.replace(0, 2, 0, 3, "") + a_right(0, 1, nil, 4, 5) + end + def test_modelnotify_remove2 + lex(5) + @model.replace(0, 1, 0, 4, "") + a_right(0, nil, 5) + end + def test_modelnotify_insert1 + lex(5) + @model.replace(0, 3, 0, 3, "0\n") + assert_equal( + "c0d", + @model.line(2)[0, 1] + + @model.line(3)[0, 1] + + @model.line(4)[0, 1]) + a_right(0, 1, 2, nil, nil, 4, 5) + end + def test_modelnotify_insert2 + lex(5) + @model.replace(0, 3, 0, 3, "0\n0\n0\n") + a_right(0, 1, 2, nil, nil, nil, nil, 4, 5) + end + def test_caching_insert1 + @lexer.resize(5) + 5.times {|y| @lexer.colorize(y) } + assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + @model.replace(0, 2, 0, 2, "0\n") + # line #2 is dirtified + # line #3 and #4 is displaced + assert_equal([5, 4, 1, 0], @lexer.lru.used, 'positive displacement') + end + def test_caching_insert2 + @model.load("aaaa\nbbbb\ncccc\ndddd\neeee\nffff") + @lexer.resize(5) + 5.times {|y| @lexer.colorize(y) } + assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + @model.replace(2, 2, 2, 2, "\n") + assert_equal("aaaa\nbbbb\ncc\ncc\ndddd\neeee\nffff", @model.text) + # line #2 is splitted into 2 parts.. which becomes line #2 and #3 + # line #3 and #4 is displaced.. and becomes line #4 and #5 + assert_equal([5, 4, 1, 0], @lexer.lru.used, 'positive displacement') + end + def test_caching_remove1 + @lexer.resize(5) + 5.times {|y| @lexer.colorize(y) } + assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + @model.replace(0, 2, 0, 3, "") # delete the whole line + # line #2 is erased, line #3 is dirtified, these lines are not in the LRU + assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') + end + def test_caching_remove2 + @model.load((1..9).to_a.join("\n")) + @lexer.resize(5) + 5.times {|y| @lexer.colorize(y) } + assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + @model.replace(1, 2, 0, 3, "") # simulate joinline + assert_equal("1\n2\n34\n5\n6\n7\n8\n9", @model.text) + # line #2 is erased, line #3 is dirtified, these lines are not in the LRU + assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') + end end Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.9 retrieving revision 1.70.2.10 diff -C2 -d -r1.70.2.9 -r1.70.2.10 *** core.rb 14 Feb 2005 14:41:15 -0000 1.70.2.9 --- core.rb 14 Feb 2005 16:10:44 -0000 1.70.2.10 *************** *** 1155,1158 **** --- 1155,1174 ---- @lru.delete(y) end + def model_update(model, info) + return if info.event == :before + return if info.event != :after + sy = info.source_y2 + dy = info.dest_y2 + n = dy - sy + if n > 0 + dirty(sy) # dirtify the line before splitting + n.times { @right_states.insert(sy, nil) } + @lru.insert(sy, n) # displace all cached pens + else + @right_states.slice!(dy, -n) + @lru.remove(dy+n, -n) # displace all cached pens + end + info.y1.upto([sy, dy].min) {|i| dirty(i) } + end def set_right_state(y, state) return if state == @right_states[y] From neoneye at rubyforge.org Mon Feb 14 11:15:59 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 11:16:00 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502141615.j1EGFwdS002719@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv2713 Modified Files: Tag: b04022005 test_core.rb Log Message: adapted the remaining testcases Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.6 retrieving revision 1.67.2.7 diff -C2 -d -r1.67.2.6 -r1.67.2.7 *** test_core.rb 14 Feb 2005 16:10:44 -0000 1.67.2.6 --- test_core.rb 14 Feb 2005 16:15:56 -0000 1.67.2.7 *************** *** 2139,2142 **** --- 2139,2198 ---- assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') end + # requesting a line which has already been computed + # must result in the exact same result as first time + # it was computed.. because its cached. + # except if it was too long ago.. + def test_caching1 + assert_equal([], @lexer.lru.pens.keys.sort) + pens1 = @lexer.colorize(1) + assert_equal('s1', pens1) + assert_equal([1], @lexer.lru.pens.keys.sort) + pens2 = @lexer.colorize(1) + assert_same(pens1, pens2, 'should be cached') + @lexer.dirty(1) + assert_equal([], @lexer.lru.used) + pens3 = @lexer.colorize(1) + assert_not_same(pens1, pens3, 'should not be cached') + end + def test_caching2 + @lexer.resize(2) + assert_equal([], @lexer.lru.pens.keys.sort) + pens1 = @lexer.colorize(1) + assert_equal('s1', pens1) + assert_equal([1], @lexer.lru.pens.keys.sort) + pens2 = @lexer.colorize(2) + assert_equal('s2', pens2) + assert_equal([2, 1], @lexer.lru.used) + pens3 = @lexer.colorize(1) + assert_same(pens1, pens3, 'should be cached') + assert_equal([1, 2], @lexer.lru.used) + pens4 = @lexer.colorize(3) + assert_equal('s3', pens4) + assert_equal([3, 1], @lexer.lru.used) + pens5 = @lexer.colorize(2) + assert_not_same(pens2, pens5, 'should not be cached') + end + def test_caching3 + @lexer.resize(1) + assert_equal([], @lexer.lru.pens.keys.sort) + pens1 = @lexer.colorize(1) + assert_equal('s1', pens1) + assert_equal([1], @lexer.lru.pens.keys.sort) + pens2 = @lexer.colorize(2) + assert_equal('s2', pens2) + assert_equal([2], @lexer.lru.pens.keys.sort) + assert_not_same(pens1, pens2, 'should not be cached') + pens3 = @lexer.colorize(1) # this is what we want to test + assert_equal('s3', pens3) + assert_equal([1], @lexer.lru.pens.keys.sort) + assert_not_same(pens1, pens3, 'should not be cached') + end + def test_caching4 + @lexer.resize(5) + 5.times {|y| @lexer.colorize(y) } + assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + @model.replace(0, 2, 1, 2, '0') + assert_equal([4, 3, 1, 0], @lexer.lru.used, 'dirtification') + end end From neoneye at rubyforge.org Mon Feb 14 11:35:10 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 11:35:11 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502141635.j1EGZAdS003171@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv3163 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: got rid of the old *buggy* lexer cache. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.7 retrieving revision 1.67.2.8 diff -C2 -d -r1.67.2.7 -r1.67.2.8 *** test_core.rb 14 Feb 2005 16:15:56 -0000 1.67.2.7 --- test_core.rb 14 Feb 2005 16:35:07 -0000 1.67.2.8 *************** *** 1759,1974 **** end ! class MockLexer2 < AEditor::Lexer::Simple ! def initialize(model) ! @state_counter = 1 ! super(model) ! end ! def lex_line(text) ! #puts "lex #{text.inspect}" ! pen = text[0, 1].to_i ! glyphs = text.unpack('U*') ! @pens = glyphs.map{|g| pen} ! @right = @state_counter ! @state_counter += 1 ! nil ! end ! end ! ! class TestLexerSimple #< Test::Unit::TestCase ! def setup ! super ! @model = AEditor::Model::Caretaker.new ! @model.load((1..9).to_a.map{|i| i.to_s * i}.join("\n")) ! @lexer = MockLexer2.new(@model) ! @model.attach(@lexer) ! end ! def teardown ! super ! @model.check_integrity ! end ! def test_typical1 ! assert_equal([], @lexer.states) ! assert_equal(0, @lexer.tdl) ! assert_equal([1, 1], @lexer.colorize(0)) ! assert_equal([1], @lexer.states) ! assert_equal(1, @lexer.tdl) ! assert_equal("22\n", @model.line(1)) ! assert_equal([2, 2, 2], @lexer.colorize(1)) ! assert_equal([1, 2], @lexer.states) ! assert_equal(2, @lexer.tdl) ! assert_equal("333\n", @model.line(2)) ! assert_equal([3, 3, 3, 3], @lexer.colorize(2)) ! assert_equal([1, 2, 3], @lexer.states) ! assert_equal(3, @lexer.tdl) ! assert_equal("55555\n", @model.line(4)) ! assert_equal([5, 5, 5, 5, 5, 5], @lexer.colorize(4)) ! assert_equal([1, 2, 3, 4, 5], @lexer.states) ! assert_equal(5, @lexer.tdl) ! end ! def test_dirty1 ! assert_equal("7777777\n", @model.line(6)) ! assert_equal([7, 7, 7, 7, 7, 7, 7, 7], @lexer.colorize(6)) ! assert_equal([1, 2, 3, 4, 5, 6, 7], @lexer.states) ! assert_equal(7, @lexer.tdl) ! @lexer.dirty(3) ! assert_equal([1, 2, 3, nil, 5, 6, 7], @lexer.states) ! assert_equal(3, @lexer.tdl) ! @lexer.dirty(5) ! assert_equal([1, 2, 3, nil, 5, nil, 7], @lexer.states) ! assert_equal(3, @lexer.tdl) ! @lexer.dirty(1) ! assert_equal([1, nil, 3, nil, 5, nil, 7], @lexer.states) ! assert_equal(1, @lexer.tdl) ! end ! def test_dirty2 ! assert_equal([], @lexer.states) ! assert_equal(0, @lexer.tdl) ! @lexer.dirty(3) ! assert_equal([], @lexer.states, 'nothing should happen') ! end ! def test_sync_dirty1 ! assert_equal([7, 7, 7, 7, 7, 7, 7, 7], @lexer.colorize(6)) ! @lexer.dirty(5) ! @lexer.dirty(3) ! @lexer.dirty(1) ! assert_equal(1, @lexer.tdl) ! assert_equal([1, nil, 3, nil, 5, nil, 7], @lexer.states) ! assert_equal([2, 2, 2], @lexer.colorize(1)) ! assert_equal([1, 8, nil, nil, 5, nil, 7], @lexer.states) ! assert_equal(2, @lexer.tdl) ! assert_equal([4, 4, 4, 4, 4], @lexer.colorize(3)) ! assert_equal([1, 8, 9, 10, nil, nil, 7], @lexer.states) ! assert_equal(4, @lexer.tdl) ! end ! def test_modelnotify_same1 ! assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) ! assert_equal(6, @lexer.tdl) ! @model.replace(0, 2, 1, 2, "0") ! assert_equal([1, 2, nil, 4, 5, 6], @lexer.states) ! assert_equal(2, @lexer.tdl) ! end ! def test_modelnotify_same2 ! assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) ! @model.replace(0, 2, 1, 3, "0\n0") ! assert_equal([1, 2, nil, nil, 5, 6], @lexer.states) ! assert_equal(2, @lexer.tdl) ! end ! def test_modelnotify_remove1 ! assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) ! @model.replace(0, 2, 0, 3, "") ! assert_equal([1, 2, nil, 5, 6], @lexer.states) ! assert_equal(2, @lexer.tdl) ! end ! def test_modelnotify_remove2 ! assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) ! @model.replace(0, 1, 0, 4, "") ! assert_equal([1, nil, 6], @lexer.states) ! assert_equal(1, @lexer.tdl) ! end ! def test_modelnotify_insert1 ! assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) ! @model.replace(0, 3, 0, 3, "0\n") ! assert_equal("333\n0\n4444\n", @model.line(2) + @model.line(3) + @model.line(4)) ! assert_equal([1, 2, 3, nil, 4, 5, 6], @lexer.states) ! assert_equal(3, @lexer.tdl) ! end ! def test_modelnotify_insert2 ! assert_equal([6, 6, 6, 6, 6, 6, 6], @lexer.colorize(5)) ! assert_equal([1, 2, 3, 4, 5, 6], @lexer.states) ! @model.replace(0, 3, 0, 3, "0\n0\n0\n") ! assert_equal([1, 2, 3, nil, nil, nil, 4, 5, 6], @lexer.states) ! assert_equal(3, @lexer.tdl) ! end ! # requesting a line which has already been computed ! # must result in the exact same result as first time ! # it was computed.. because its cached. ! # except if it was too long ago.. ! def test_caching1 ! assert_equal([], @lexer.lru.pens.keys.sort) ! pens1 = @lexer.colorize(1) ! assert_equal([2, 2, 2], pens1) ! assert_equal([1], @lexer.lru.pens.keys.sort) ! pens2 = @lexer.colorize(1) ! assert_same(pens1, pens2, 'should be cached') ! @lexer.dirty(1) ! assert_equal([], @lexer.lru.used) ! pens3 = @lexer.colorize(1) ! assert_not_same(pens1, pens3, 'should not be cached') ! end ! def test_caching2 ! @lexer.resize(2) ! assert_equal([], @lexer.lru.pens.keys.sort) ! pens1 = @lexer.colorize(1) ! assert_equal([2, 2, 2], pens1) ! assert_equal([1], @lexer.lru.pens.keys.sort) ! pens2 = @lexer.colorize(2) ! assert_equal([3, 3, 3, 3], pens2) ! assert_equal([2, 1], @lexer.lru.used) ! pens3 = @lexer.colorize(1) ! assert_same(pens1, pens3, 'should be cached') ! assert_equal([1, 2], @lexer.lru.used) ! pens4 = @lexer.colorize(3) ! assert_equal([4, 4, 4, 4, 4], pens4) ! assert_equal([3, 1], @lexer.lru.used) ! pens5 = @lexer.colorize(2) ! assert_not_same(pens2, pens5, 'should not be cached') ! end ! def test_caching3 ! assert_equal([], @lexer.lru.pens.keys.sort) ! pens1 = @lexer.colorize(1) ! assert_equal([2, 2, 2], pens1) ! assert_equal([1], @lexer.lru.pens.keys.sort) ! pens2 = @lexer.colorize(2) ! assert_equal([3, 3, 3, 3], pens2) ! assert_equal([2], @lexer.lru.pens.keys.sort) ! assert_not_same(pens1, pens2, 'should not be cached') ! pens3 = @lexer.colorize(1) # this is what we want to test ! assert_equal([2, 2, 2], pens3) ! assert_equal([1], @lexer.lru.pens.keys.sort) ! assert_not_same(pens1, pens3, 'should not be cached') ! end ! def test_caching4 ! @lexer.resize(5) ! 5.times {|y| @lexer.colorize(y) } ! assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) ! @model.replace(0, 2, 1, 2, '0') ! assert_equal([4, 3, 1, 0], @lexer.lru.used, 'dirtification') ! end ! def test_caching_insert1 ! @lexer.resize(5) ! 5.times {|y| @lexer.colorize(y) } ! assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) ! @model.replace(0, 2, 0, 2, "0\n") ! assert_equal([5, 4, 3, 1, 0], @lexer.lru.used, 'positive displacement') ! end ! # TODO: exercise the @lexer.set_right_state when its dirtifying the following line ! # TODO: figure out how this should work ! def test_caching_remove1 ! @lexer.resize(5) ! 5.times {|y| @lexer.colorize(y) } ! assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) ! @model.replace(0, 2, 0, 3, "") # delete the whole line ! # line #2 is erased, line #3 is dirtified, these lines are not in the LRU ! assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') ! end ! def test_caching_remove2 ! @model.load((1..9).to_a.join("\n")) ! @lexer.resize(5) ! 5.times {|y| @lexer.colorize(y) } ! assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) ! @model.replace(1, 2, 0, 3, "") # simulate joinline ! assert_equal("1\n2\n34\n5\n6\n7\n8\n9", @model.text) ! # line #2 is erased, line #3 is dirtified, these lines are not in the LRU ! assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') ! end ! end ! ! class TestNewCache < Test::Unit::TestCase ! class MockLexer < AEditor::Lexer::NewCache def initialize(model) super(model) --- 1759,1764 ---- end ! class TestLexerSimple < Test::Unit::TestCase ! class MockLexer < AEditor::Lexer::Simple def initialize(model) super(model) Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.10 retrieving revision 1.70.2.11 diff -C2 -d -r1.70.2.10 -r1.70.2.11 *** core.rb 14 Feb 2005 16:10:44 -0000 1.70.2.10 --- core.rb 14 Feb 2005 16:35:07 -0000 1.70.2.11 *************** *** 393,397 **** msg = "" if @lexer ! msg = " lexer=#{@lexer.count_hit},#{@lexer.count_miss}" end $logger.info "update: " + --- 393,397 ---- msg = "" if @lexer ! msg = " lexer=#{@lexer.status}" end $logger.info "update: " + *************** *** 1029,1134 **** raise "derived class must overload" end ! end ! ! class Simple < Base ! def initialize(model) ! reset_counters ! @right_states = [] ! @topmost_dirty_line = 0 ! @left = 0 ! @right = 0 ! @pens = [] ! @lru = LRU.new ! super(model) ! end ! attr_reader :lru, :count_hit, :count_miss ! def reset_counters ! @count_hit = 0 ! @count_miss = 0 ! end ! def resize(n) ! @lru.resize(n) ! end ! def model_update(model, info) ! return if info.event == :before ! return if info.event != :after ! sy = info.source_y2 ! dy = info.dest_y2 ! n = dy - sy ! if n > 0 ! n.times { @right_states.insert(sy, nil) } ! @lru.insert(sy, n) # displace all cached pens ! else ! @right_states.slice!(dy, -n) ! @lru.remove(dy+n, -n) # displace all cached pens ! end ! info.y1.upto([sy, dy].min) {|i| dirty(i) } ! end ! def lex_line(text) ! nil ! end ! def dirty(y) ! return unless y >= 0 and y < @right_states.size ! @right_states[y] = nil ! @topmost_dirty_line = [@topmost_dirty_line, y].min ! @lru.delete(y) # dirtify cached pens for this line ! end ! def set_right_state(y, state) ! dirty(y + 1) if y + 1 < @right_states.size and @right_states[y + 1] != state ! @right_states[y] = state ! end ! def get_left_state(y) ! raise "y (#{y}) must not be negative" if y < 0 ! raise "y (#{y}) was outside" if y-1 >= @right_states.size ! return 0 if y == 0 ! @right_states[y - 1] ! end ! def colorize(ay) ! # render dirty lines ! @topmost_dirty_line.upto([ay, @right_states.size].min-1) do |y| ! next if @right_states[y] ! @left = get_left_state(y) ! lex_line(@model.line(y)) ! set_right_state(y, @right) ! @count_miss += 1 ! end ! ! # render missing lines ! (@right_states.size).upto(ay-1) do |y| ! #puts "render #{y}" ! @left = get_left_state(y) ! lex_line(@model.line(y)) ! set_right_state(y, @right) ! @count_miss += 1 ! end ! ! if ay < @right_states.size and @right_states[ay] ! res = @lru[ay] ! if res ! @count_hit += 1 ! return res ! end ! end ! ! # compute the requested line ! @left = get_left_state(ay) ! lex_line(@model.line(ay)) ! @topmost_dirty_line = [@topmost_dirty_line, ay + 1].max ! set_right_state(ay, @right) ! @count_miss += 1 ! ! @lru[ay] = @pens ! ! @pens ! end ! def states ! @right_states ! end ! def tdl ! @topmost_dirty_line end end ! class NewCache < Base def initialize(model) reset_counters --- 1029,1038 ---- raise "derived class must overload" end ! def status ! "-none-" end end ! class Simple < Base def initialize(model) reset_counters *************** *** 1148,1151 **** --- 1052,1064 ---- @count_color_miss = 0 end + def count_hit + @count_sync_hit + @count_color_hit + end + def count_miss + @count_sync_miss + @count_color_miss + end + def status + "#{@count_sync_hit}+#{@count_color_hit}/#{@count_sync_miss}+#{@count_color_miss}" + end def resize(n) @lru.resize(n) *************** *** 1191,1195 **** @left = (i == 0) ? 0 : @right_states[i - 1] ! lex_line(i) set_right_state(i, @right) end --- 1104,1108 ---- @left = (i == 0) ? 0 : @right_states[i - 1] ! lex_line(@model.line(i)) set_right_state(i, @right) end *************** *** 1207,1211 **** i = line_number @left = (i == 0) ? 0 : @right_states[i - 1] ! lex_line(i) set_right_state(i, @right) @lru[i] = @pens --- 1120,1124 ---- i = line_number @left = (i == 0) ? 0 : @right_states[i - 1] ! lex_line(@model.line(i)) set_right_state(i, @right) @lru[i] = @pens From neoneye at rubyforge.org Mon Feb 14 11:35:31 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 11:35:33 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES TODO Message-ID: <200502141635.j1EGZVdS003199@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv3183 Modified Files: Tag: b04022005 CHANGES TODO Log Message: Got rid of the old *buggy* lexer cache Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.44.2.3 retrieving revision 1.44.2.4 diff -C2 -d -r1.44.2.3 -r1.44.2.4 *** CHANGES 6 Feb 2005 11:06:57 -0000 1.44.2.3 --- CHANGES 14 Feb 2005 16:35:29 -0000 1.44.2.4 *************** *** 1,2 **** --- 1,12 ---- + 12-02-2005 Neoneye + * after being sick for some days and a short 3 days ski vacation, + im now back again with a fresh mind. + I built a lego model with postit notes attached to it, + wrote the lexer cache from scratch again. Discovered a few + errors in my old lexer cache (such as not erasing keys from + the LRU cache when invoking #dirty). However even though its + rewritten, full-propagation still occurs. It were supposed + to be minimal. + 06-02-2005 Neoneye * We now count number of hits+misses per update. Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.41.2.3 retrieving revision 1.41.2.4 diff -C2 -d -r1.41.2.3 -r1.41.2.4 *** TODO 6 Feb 2005 18:52:31 -0000 1.41.2.3 --- TODO 14 Feb 2005 16:35:29 -0000 1.41.2.4 *************** *** 1,3 **** --- 1,6 ---- render with colors. + * Simple#model_notify should not dirtify the last line. + * for some reasone propagation occurs with my new caching scheme, + it should NOT happen. * fix bug in caching.. so it will invalidate the right lines. I suspects its the model_update when removing lines. From neoneye at rubyforge.org Mon Feb 14 11:53:22 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 11:53:23 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502141653.j1EGrMdS003553@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv3530 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: trying to figure out why Lexer::Simple cannot propagate/remove stuff correct. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.8 retrieving revision 1.67.2.9 diff -C2 -d -r1.67.2.8 -r1.67.2.9 *** test_core.rb 14 Feb 2005 16:35:07 -0000 1.67.2.8 --- test_core.rb 14 Feb 2005 16:53:20 -0000 1.67.2.9 *************** *** 1920,1932 **** end def test_caching_remove2 ! @model.load((1..9).to_a.join("\n")) @lexer.resize(5) 5.times {|y| @lexer.colorize(y) } assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) @model.replace(1, 2, 0, 3, "") # simulate joinline ! assert_equal("1\n2\n34\n5\n6\n7\n8\n9", @model.text) # line #2 is erased, line #3 is dirtified, these lines are not in the LRU assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') end # requesting a line which has already been computed # must result in the exact same result as first time --- 1920,1942 ---- end def test_caching_remove2 ! @model.load(('a'..'i').to_a.join("\n")) @lexer.resize(5) 5.times {|y| @lexer.colorize(y) } assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) @model.replace(1, 2, 0, 3, "") # simulate joinline ! assert_equal("a\nb\ncd\ne\nf\ng\nh\ni", @model.text) # line #2 is erased, line #3 is dirtified, these lines are not in the LRU assert_equal([3, 1, 0], @lexer.lru.used, 'negative displacement') end + def test_caching_remove3 + @model.load("a\nbcd\nefg\nh") + @lexer.resize(5) + 4.times {|y| @lexer.colorize(y) } + assert_equal([3, 2, 1, 0], @lexer.lru.used) + @model.replace(3, 1, 0, 2, '') # simulate joinline + assert_equal("a\nbcdefg\nh", @model.text) + # line #1 #2 is merged, line #2 is dirtified, these lines are not in the LRU + assert_equal([2, 0], @lexer.lru.used, 'negative displacement') + end # requesting a line which has already been computed # must result in the exact same result as first time Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.11 retrieving revision 1.70.2.12 diff -C2 -d -r1.70.2.11 -r1.70.2.12 *** core.rb 14 Feb 2005 16:35:07 -0000 1.70.2.11 --- core.rb 14 Feb 2005 16:53:20 -0000 1.70.2.12 *************** *** 1098,1101 **** --- 1098,1102 ---- end if @right_states[i] + $logger.debug 'none' @count_sync_hit += 1 next *************** *** 1110,1114 **** def colorize(line_number) #puts "line #{line_number}" ! sync_states(line_number-1) if @lru.has_key?(line_number) --- 1111,1115 ---- def colorize(line_number) #puts "line #{line_number}" ! sync_states(line_number-1) # TODO: move outside renderloop if @lru.has_key?(line_number) From neoneye at rubyforge.org Mon Feb 14 16:57:37 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 16:57:38 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502142157.j1ELvbdS020095@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv20078 Modified Files: Tag: b04022005 test_core.rb Log Message: I have managed to make up a testcase that exercises the problem im having where inserted lines propagates to the bottom. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.9 retrieving revision 1.67.2.10 diff -C2 -d -r1.67.2.9 -r1.67.2.10 *** test_core.rb 14 Feb 2005 16:53:20 -0000 1.67.2.9 --- test_core.rb 14 Feb 2005 21:57:35 -0000 1.67.2.10 *************** *** 1759,1783 **** end ! class TestLexerSimple < Test::Unit::TestCase ! class MockLexer < AEditor::Lexer::Simple ! def initialize(model) ! super(model) ! @count = 0 ! end ! attr_accessor :count, :right_states ! def lex_line(text) ! @pens = "s#{@count}" ! @right = @count ! @count += 1 ! nil ! end ! end ! def setup ! @model = AEditor::Model::Caretaker.new ! @model.load(('a'..'z').to_a.map{|i| i * 20}.join("\n")) ! @lexer = MockLexer.new(@model) ! @model.attach(@lexer) ! @lexer.resize(10) ! end def a_size(count) assert_equal(count, @lexer.lru.size) --- 1759,1763 ---- end ! module LexerHelpers def a_size(count) assert_equal(count, @lexer.lru.size) *************** *** 1810,1813 **** --- 1790,1818 ---- assert_equal(expected_right_states, @lexer.right_states) end + extend self + end + + class TestLexerSimple < Test::Unit::TestCase + class MockLexer < AEditor::Lexer::Simple + def initialize(model) + super(model) + @count = 0 + end + attr_accessor :count, :right_states + def lex_line(text) + @pens = "s#{@count}" + @right = @count + @count += 1 + nil + end + end + include LexerHelpers + def setup + @model = AEditor::Model::Caretaker.new + @model.load(('a'..'z').to_a.map{|i| i * 20}.join("\n")) + @lexer = MockLexer.new(@model) + @model.attach(@lexer) + @lexer.resize(10) + end def test_accumulate_by_incremental_access1 a_size(0) *************** *** 1997,2000 **** --- 2002,2052 ---- end + class TestLexerReal < Test::Unit::TestCase + class MockLexer < AEditor::Lexer::Simple + def initialize(model) + super(model) + @count = 0 + end + attr_accessor :count, :right_states + def lex_line(text) + @pens = "s#{@count}" + @right = @count + @count += 1 + nil + end + end + include LexerHelpers + def setup + @model = AEditor::Model::Caretaker.new + @model.load(('a'..'z').to_a.map{|i| i * 20}.join("\n")) + @lexer = MockLexer.new(@model) + @model.attach(@lexer) + @lexer.resize(10) + end + def test_typical_insert1 + @lexer.resize(5) + 5.times {|y| @lexer.colorize(y) } + assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + a_right(0, 1, 2, 3, 4) + a_color_stats(0, 5) + @model.replace(5, 1, 5, 1, "\n") + assert_equal([5, 4, 3, 0], @lexer.lru.used) + a_right(0, nil, nil, 2, 3, 4) + @lexer.colorize(0) + a_color_stats(1, 0) + @lexer.count = 1 + @lexer.colorize(1) + a_right(0, 1, nil, 2, 3, 4) + a_color_stats(0, 1) + @lexer.count = 1 + @lexer.colorize(2) + a_color_stats(0, 1) + #a_right(0, 1, 1, 2, 3, 4) + #@lexer.colorize(3) + #@lexer.colorize(4) + #a_color_stats(3, 2) + end + end + From neoneye at rubyforge.org Mon Feb 14 17:43:03 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 17:43:04 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source TODO Message-ID: <200502142243.j1EMh3dS022689@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv22683 Modified Files: Tag: b04022005 TODO Log Message: must introduce dirty flag Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.41.2.4 retrieving revision 1.41.2.5 diff -C2 -d -r1.41.2.4 -r1.41.2.5 *** TODO 14 Feb 2005 16:35:29 -0000 1.41.2.4 --- TODO 14 Feb 2005 22:43:01 -0000 1.41.2.5 *************** *** 1,3 **** --- 1,5 ---- render with colors. + * I must introduce a dirty flag array, I discovered that I had a + conceptual flaw in my lexercache. * Simple#model_notify should not dirtify the last line. * for some reasone propagation occurs with my new caching scheme, From neoneye at rubyforge.org Mon Feb 14 18:32:49 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Mon Feb 14 18:32:51 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES core.rb test_core.rb Message-ID: <200502142332.j1ENWndS025252@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv25246 Modified Files: Tag: b04022005 CHANGES core.rb test_core.rb Log Message: added a dirty flag array.. still needs more work Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.44.2.4 retrieving revision 1.44.2.5 diff -C2 -d -r1.44.2.4 -r1.44.2.5 *** CHANGES 14 Feb 2005 16:35:29 -0000 1.44.2.4 --- CHANGES 14 Feb 2005 23:32:47 -0000 1.44.2.5 *************** *** 8,11 **** --- 8,12 ---- rewritten, full-propagation still occurs. It were supposed to be minimal. + * realized that I needed a dirty flag array to the Lexer::Simple. 06-02-2005 Neoneye Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.10 retrieving revision 1.67.2.11 diff -C2 -d -r1.67.2.10 -r1.67.2.11 *** test_core.rb 14 Feb 2005 21:57:35 -0000 1.67.2.10 --- test_core.rb 14 Feb 2005 23:32:47 -0000 1.67.2.11 *************** *** 1790,1793 **** --- 1790,1796 ---- assert_equal(expected_right_states, @lexer.right_states) end + def a_dirty(*expected) + assert_equal(expected, @lexer.dirty_lines) + end extend self end *************** *** 1835,1838 **** --- 1838,1842 ---- def test_accumulate_by_random_access1 lex(2) + a_dirty(false, false, false, true) a_stats(0, 2, 0, 1) a_right(0, 1, 2) *************** *** 1842,1852 **** lex(3) a_stats(3, 0, 0, 1) ! a_right(0, 1, 2, 6, nil, 5) lex(2) a_stats(2, 0, 1, 0) ! a_right(0, 1, 2, 6, nil, 5) lex(5) - a_stats(4, 1, 0, 1) a_right(0, 1, 2, 6, 7, 8) a_size(3) end --- 1846,1858 ---- lex(3) a_stats(3, 0, 0, 1) ! a_right(0, 1, 2, 6, 4, 5) ! a_dirty(false, false, false, false, true, false, true) lex(2) a_stats(2, 0, 1, 0) ! a_right(0, 1, 2, 6, 4, 5) ! a_dirty(false, false, false, false, true, false, true) lex(5) a_right(0, 1, 2, 6, 7, 8) + a_stats(4, 1, 0, 1) a_size(3) end *************** *** 1864,1883 **** lex(5) @model.replace(0, 2, 1, 2, "0") ! a_right(0, 1, nil, 3, 4, 5) end def test_modelnotify_same2 lex(5) @model.replace(0, 2, 1, 3, "0\n0") ! a_right(0, 1, nil, nil, 4, 5) end def test_modelnotify_remove1 lex(5) @model.replace(0, 2, 0, 3, "") ! a_right(0, 1, nil, 4, 5) end def test_modelnotify_remove2 lex(5) @model.replace(0, 1, 0, 4, "") ! a_right(0, nil, 5) end def test_modelnotify_insert1 --- 1870,1893 ---- lex(5) @model.replace(0, 2, 1, 2, "0") ! a_right(0, 1, 2, 3, 4, 5) ! a_dirty(false, false, true, false, false, false, true) end def test_modelnotify_same2 lex(5) @model.replace(0, 2, 1, 3, "0\n0") ! a_right(0, 1, 2, 3, 4, 5) ! a_dirty(false, false, true, true, false, false, true) end def test_modelnotify_remove1 lex(5) @model.replace(0, 2, 0, 3, "") ! a_right(0, 1, 3, 4, 5) ! a_dirty(false, false, true, false, false, true) end def test_modelnotify_remove2 lex(5) @model.replace(0, 1, 0, 4, "") ! a_right(0, 4, 5) ! a_dirty(false, true, false, true) end def test_modelnotify_insert1 *************** *** 1889,1898 **** @model.line(3)[0, 1] + @model.line(4)[0, 1]) ! a_right(0, 1, 2, nil, nil, 4, 5) end def test_modelnotify_insert2 lex(5) @model.replace(0, 3, 0, 3, "0\n0\n0\n") ! a_right(0, 1, 2, nil, nil, nil, nil, 4, 5) end def test_caching_insert1 --- 1899,1910 ---- @model.line(3)[0, 1] + @model.line(4)[0, 1]) ! a_right(0, 1, 2, nil, 3, 4, 5) ! a_dirty(false, false, false, true, true, false, false, true) end def test_modelnotify_insert2 lex(5) @model.replace(0, 3, 0, 3, "0\n0\n0\n") ! a_right(0, 1, 2, nil, nil, nil, 3, 4, 5) ! a_dirty(false, false, false, true, true, true, true, false, false, true) end def test_caching_insert1 *************** *** 2032,2049 **** @model.replace(5, 1, 5, 1, "\n") assert_equal([5, 4, 3, 0], @lexer.lru.used) ! a_right(0, nil, nil, 2, 3, 4) @lexer.colorize(0) a_color_stats(1, 0) @lexer.count = 1 @lexer.colorize(1) ! a_right(0, 1, nil, 2, 3, 4) a_color_stats(0, 1) @lexer.count = 1 @lexer.colorize(2) a_color_stats(0, 1) ! #a_right(0, 1, 1, 2, 3, 4) ! #@lexer.colorize(3) ! #@lexer.colorize(4) ! #a_color_stats(3, 2) end end --- 2044,2067 ---- @model.replace(5, 1, 5, 1, "\n") assert_equal([5, 4, 3, 0], @lexer.lru.used) ! a_right(0, nil, 1, 2, 3, 4) ! a_dirty(false, true, true, false, false, false, true) @lexer.colorize(0) a_color_stats(1, 0) @lexer.count = 1 @lexer.colorize(1) ! a_right(0, 1, 1, 2, 3, 4) ! a_dirty(false, false, true, false, false, false, true) a_color_stats(0, 1) @lexer.count = 1 @lexer.colorize(2) a_color_stats(0, 1) ! a_right(0, 1, 1, 2, 3, 4) ! a_dirty(false, false, false, false, false, false, true) ! @lexer.colorize(3) ! a_right(0, 1, 1, 2, 3, 4) ! a_dirty(false, false, false, false, false, false, true) ! a_color_stats(1, 0) # TODO: should be a hits ! @lexer.colorize(4) ! a_color_stats(1, 0) # TODO: should be a hits end end Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.12 retrieving revision 1.70.2.13 diff -C2 -d -r1.70.2.12 -r1.70.2.13 *** core.rb 14 Feb 2005 16:53:20 -0000 1.70.2.12 --- core.rb 14 Feb 2005 23:32:47 -0000 1.70.2.13 *************** *** 1037,1040 **** --- 1037,1041 ---- def initialize(model) reset_counters + @dirty_lines = [] @right_states = [] @left = 0 *************** *** 1045,1049 **** end attr_reader :lru, :count_sync_hit, :count_sync_miss ! attr_reader :count_color_hit, :count_color_miss def reset_counters @count_sync_hit = 0 --- 1046,1050 ---- end attr_reader :lru, :count_sync_hit, :count_sync_miss ! attr_reader :count_color_hit, :count_color_miss, :dirty_lines def reset_counters @count_sync_hit = 0 *************** *** 1065,1069 **** end def dirty(y) ! @right_states[y] = nil if y < @right_states.size @lru.delete(y) end --- 1066,1072 ---- end def dirty(y) ! (y - @dirty_lines.size).times { @dirty_lines << true } ! (y - @right_states.size).times { @right_states << nil } ! @dirty_lines[y] = true @lru.delete(y) end *************** *** 1076,1083 **** if n > 0 dirty(sy) # dirtify the line before splitting ! n.times { @right_states.insert(sy, nil) } @lru.insert(sy, n) # displace all cached pens else @right_states.slice!(dy, -n) @lru.remove(dy+n, -n) # displace all cached pens end --- 1079,1090 ---- if n > 0 dirty(sy) # dirtify the line before splitting ! n.times do ! @right_states.insert(sy, nil) ! @dirty_lines.insert(sy, true) ! end @lru.insert(sy, n) # displace all cached pens else @right_states.slice!(dy, -n) + @dirty_lines.slice!(dy, -n) @lru.remove(dy+n, -n) # displace all cached pens end *************** *** 1085,1102 **** end def set_right_state(y, state) ! return if state == @right_states[y] ! #puts "clearing #{y}, because #{state.inspect} is distinct " + ! # "from #{@right_states[y].inspect}" dirty(y) - dirty(y+1) @right_states[y] = state end def sync_states(number_of_states) 0.upto(number_of_states) do |i| ! if i > @right_states.size ! raise "should not happen" end ! if @right_states[i] ! $logger.debug 'none' @count_sync_hit += 1 next --- 1092,1122 ---- end def set_right_state(y, state) ! propagate = false ! rs = @right_states ! if y < @right_states.size ! old = @right_states[y] ! if state != old ! propagate = true ! #puts "propagate #{y}->#{y+1}, because #{state.inspect} is " + ! # "distinct from #{old.inspect}" ! end ! elsif y >= @right_states.size ! propagate = true ! #puts "propagate #{y}->#{y+1}, because y >= size" ! end dirty(y) @right_states[y] = state + @dirty_lines[y] = false + #p @right_states, propagate + dirty(y+1) if propagate + #p @right_states end def sync_states(number_of_states) 0.upto(number_of_states) do |i| ! if i < @dirty_lines.size and i > @right_states.size ! raise "should not happen, i=#{i} " + ! "rs.size=#{@right_states.size} dl=#{@dirty_lines.size}" end ! if i < @dirty_lines.size and @dirty_lines[i] == false @count_sync_hit += 1 next From neoneye at rubyforge.org Tue Feb 15 02:08:20 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 15 02:08:22 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_core.rb Message-ID: <200502150708.j1F78KdS003363@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv3285 Modified Files: Tag: b04022005 test_core.rb Log Message: The propagation occurs because the bottom most lines has been pushed out of the lru window, and thus gotten deleted. This is because the rendering order.. rendering lines from top to bottom.. makes the bottom most lines be the most ranked line in the LRU. This were supposed to be the other way around.. so that the top-most line were the most ranked. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.11 retrieving revision 1.67.2.12 diff -C2 -d -r1.67.2.11 -r1.67.2.12 *** test_core.rb 14 Feb 2005 23:32:47 -0000 1.67.2.11 --- test_core.rb 15 Feb 2005 07:08:18 -0000 1.67.2.12 *************** *** 2046,2049 **** --- 2046,2050 ---- a_right(0, nil, 1, 2, 3, 4) a_dirty(false, true, true, false, false, false, true) + assert_equal([0, 3, 4, 5], @lexer.lru.pens.keys.sort) @lexer.colorize(0) a_color_stats(1, 0) *************** *** 2052,2055 **** --- 2053,2057 ---- a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, true, false, false, false, true) + assert_equal([0, 1, 3, 4, 5], @lexer.lru.pens.keys.sort) a_color_stats(0, 1) @lexer.count = 1 *************** *** 2058,2067 **** a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, false, false, false, false, true) @lexer.colorize(3) a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, false, false, false, false, true) ! a_color_stats(1, 0) # TODO: should be a hits @lexer.colorize(4) ! a_color_stats(1, 0) # TODO: should be a hits end end --- 2060,2072 ---- a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, false, false, false, false, true) + assert_equal([0, 1, 2, 4, 5], @lexer.lru.pens.keys.sort) @lexer.colorize(3) a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, false, false, false, false, true) ! assert_equal([0, 1, 2, 3, 5], @lexer.lru.pens.keys.sort) ! #a_color_stats(1, 0) # TODO: should be a hits @lexer.colorize(4) ! assert_equal([0, 1, 2, 3, 4], @lexer.lru.pens.keys.sort) ! #a_color_stats(1, 0) # TODO: should be a hits end end From neoneye at rubyforge.org Tue Feb 15 12:24:25 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 15 12:24:26 2005 Subject: [Aeditor-commit] projects/documents/homepage2 weblog.html Message-ID: <200502151724.j1FHOPdS013125@rubyforge.org> Update of /var/cvs/aeditor/projects/documents/homepage2 In directory rubyforge.org:/tmp/cvs-serv13121 Modified Files: weblog.html Log Message: status for last week Index: weblog.html =================================================================== RCS file: /var/cvs/aeditor/projects/documents/homepage2/weblog.html,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** weblog.html 2 Feb 2005 19:20:43 -0000 1.5 --- weblog.html 15 Feb 2005 17:24:23 -0000 1.6 *************** *** 40,43 **** --- 40,64 ---- I have a small appartment in Copenhagen, the capital of Denmark.

+

A new view on things - 15 feb 2005

+

I recieved the 19" tft display last week, its a Samsung + SyncMaster 910T. I must say its wonderful to do my programming on. + I went crazy and also ordered a mac mini, lets hope it arrives soon. + I have big expectations to this small piece of machinary. My current + mechanic beast is big, noisy, slow, stoneage cisc architecture and ready + to be thrown out.

+ +
'-NEON-EYE-'.unpack('C*').inject(0){|a,b|a+b} #-> 666
+ +

Last monday I felt sick, pain in my brain and my nose running + all the time. I had to goto my job and the next day to the university + and wensday to the job again, even though I was sick. Thrusday I was + still sick, and had to go on a small ski vacation for 3 days, where I + snowboarded the first 2 hours and afterwards switched to alpine ski + (because I got beaten up too badly and because I was a little sick). + Anyway my sickness disappeared on the ski vacation and im now ready + to do some more programming again. Its impossible to serious coding + when you are in great pain.

+ +

Things I did today - 01 feb 2005

I have had my first day free from job in long time, so I have From neoneye at rubyforge.org Tue Feb 15 13:37:30 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 15 13:37:31 2005 Subject: [Aeditor-commit] projects/regexp_engine STORIES Message-ID: <200502151837.j1FIbUdS016575@rubyforge.org> Update of /var/cvs/aeditor/projects/regexp_engine In directory rubyforge.org:/tmp/cvs-serv16562 Modified Files: STORIES Log Message: nullslack asked me on irc, how to match text after foo. Index: STORIES =================================================================== RCS file: /var/cvs/aeditor/projects/regexp_engine/STORIES,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** STORIES 2 Jan 2005 18:48:01 -0000 1.10 --- STORIES 15 Feb 2005 18:37:28 -0000 1.11 *************** *** 84,85 **** --- 84,90 ---- p, rest = 'abc'.unpack('aa*') + + + Q11: How do I extract the text after 'foo' until lineend? + + "sdfsfd foo abc\nlsdjf\nfood".scan(/foo(.*)/).flatten #-> [" abc", "d"] From neoneye at rubyforge.org Tue Feb 15 14:01:15 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 15 14:01:17 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502151901.j1FJ1FdS018640@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv18635 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: got rid of tailing 'true' element. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.12 retrieving revision 1.67.2.13 diff -C2 -d -r1.67.2.12 -r1.67.2.13 *** test_core.rb 15 Feb 2005 07:08:18 -0000 1.67.2.12 --- test_core.rb 15 Feb 2005 19:01:13 -0000 1.67.2.13 *************** *** 1838,1842 **** def test_accumulate_by_random_access1 lex(2) ! a_dirty(false, false, false, true) a_stats(0, 2, 0, 1) a_right(0, 1, 2) --- 1838,1842 ---- def test_accumulate_by_random_access1 lex(2) ! a_dirty(false, false, false) a_stats(0, 2, 0, 1) a_right(0, 1, 2) *************** *** 1847,1855 **** a_stats(3, 0, 0, 1) a_right(0, 1, 2, 6, 4, 5) ! a_dirty(false, false, false, false, true, false, true) lex(2) a_stats(2, 0, 1, 0) a_right(0, 1, 2, 6, 4, 5) ! a_dirty(false, false, false, false, true, false, true) lex(5) a_right(0, 1, 2, 6, 7, 8) --- 1847,1855 ---- a_stats(3, 0, 0, 1) a_right(0, 1, 2, 6, 4, 5) ! a_dirty(false, false, false, false, true, false) lex(2) a_stats(2, 0, 1, 0) a_right(0, 1, 2, 6, 4, 5) ! a_dirty(false, false, false, false, true, false) lex(5) a_right(0, 1, 2, 6, 7, 8) *************** *** 1871,1875 **** @model.replace(0, 2, 1, 2, "0") a_right(0, 1, 2, 3, 4, 5) ! a_dirty(false, false, true, false, false, false, true) end def test_modelnotify_same2 --- 1871,1875 ---- @model.replace(0, 2, 1, 2, "0") a_right(0, 1, 2, 3, 4, 5) ! a_dirty(false, false, true, false, false, false) end def test_modelnotify_same2 *************** *** 1877,1881 **** @model.replace(0, 2, 1, 3, "0\n0") a_right(0, 1, 2, 3, 4, 5) ! a_dirty(false, false, true, true, false, false, true) end def test_modelnotify_remove1 --- 1877,1881 ---- @model.replace(0, 2, 1, 3, "0\n0") a_right(0, 1, 2, 3, 4, 5) ! a_dirty(false, false, true, true, false, false) end def test_modelnotify_remove1 *************** *** 1883,1887 **** @model.replace(0, 2, 0, 3, "") a_right(0, 1, 3, 4, 5) ! a_dirty(false, false, true, false, false, true) end def test_modelnotify_remove2 --- 1883,1887 ---- @model.replace(0, 2, 0, 3, "") a_right(0, 1, 3, 4, 5) ! a_dirty(false, false, true, false, false) end def test_modelnotify_remove2 *************** *** 1889,1893 **** @model.replace(0, 1, 0, 4, "") a_right(0, 4, 5) ! a_dirty(false, true, false, true) end def test_modelnotify_insert1 --- 1889,1893 ---- @model.replace(0, 1, 0, 4, "") a_right(0, 4, 5) ! a_dirty(false, true, false) end def test_modelnotify_insert1 *************** *** 1900,1904 **** @model.line(4)[0, 1]) a_right(0, 1, 2, nil, 3, 4, 5) ! a_dirty(false, false, false, true, true, false, false, true) end def test_modelnotify_insert2 --- 1900,1904 ---- @model.line(4)[0, 1]) a_right(0, 1, 2, nil, 3, 4, 5) ! a_dirty(false, false, false, true, true, false, false) end def test_modelnotify_insert2 *************** *** 1906,1910 **** @model.replace(0, 3, 0, 3, "0\n0\n0\n") a_right(0, 1, 2, nil, nil, nil, 3, 4, 5) ! a_dirty(false, false, false, true, true, true, true, false, false, true) end def test_caching_insert1 --- 1906,1910 ---- @model.replace(0, 3, 0, 3, "0\n0\n0\n") a_right(0, 1, 2, nil, nil, nil, 3, 4, 5) ! a_dirty(false, false, false, true, true, true, true, false, false) end def test_caching_insert1 *************** *** 2045,2049 **** assert_equal([5, 4, 3, 0], @lexer.lru.used) a_right(0, nil, 1, 2, 3, 4) ! a_dirty(false, true, true, false, false, false, true) assert_equal([0, 3, 4, 5], @lexer.lru.pens.keys.sort) @lexer.colorize(0) --- 2045,2049 ---- assert_equal([5, 4, 3, 0], @lexer.lru.used) a_right(0, nil, 1, 2, 3, 4) ! a_dirty(false, true, true, false, false, false) assert_equal([0, 3, 4, 5], @lexer.lru.pens.keys.sort) @lexer.colorize(0) *************** *** 2052,2056 **** @lexer.colorize(1) a_right(0, 1, 1, 2, 3, 4) ! a_dirty(false, false, true, false, false, false, true) assert_equal([0, 1, 3, 4, 5], @lexer.lru.pens.keys.sort) a_color_stats(0, 1) --- 2052,2056 ---- @lexer.colorize(1) a_right(0, 1, 1, 2, 3, 4) ! a_dirty(false, false, true, false, false, false) assert_equal([0, 1, 3, 4, 5], @lexer.lru.pens.keys.sort) a_color_stats(0, 1) *************** *** 2059,2067 **** a_color_stats(0, 1) a_right(0, 1, 1, 2, 3, 4) ! a_dirty(false, false, false, false, false, false, true) assert_equal([0, 1, 2, 4, 5], @lexer.lru.pens.keys.sort) @lexer.colorize(3) a_right(0, 1, 1, 2, 3, 4) ! a_dirty(false, false, false, false, false, false, true) assert_equal([0, 1, 2, 3, 5], @lexer.lru.pens.keys.sort) #a_color_stats(1, 0) # TODO: should be a hits --- 2059,2067 ---- a_color_stats(0, 1) a_right(0, 1, 1, 2, 3, 4) ! a_dirty(false, false, false, false, false, false) assert_equal([0, 1, 2, 4, 5], @lexer.lru.pens.keys.sort) @lexer.colorize(3) a_right(0, 1, 1, 2, 3, 4) ! a_dirty(false, false, false, false, false, false) assert_equal([0, 1, 2, 3, 5], @lexer.lru.pens.keys.sort) #a_color_stats(1, 0) # TODO: should be a hits Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.13 retrieving revision 1.70.2.14 diff -C2 -d -r1.70.2.13 -r1.70.2.14 *** core.rb 14 Feb 2005 23:32:47 -0000 1.70.2.13 --- core.rb 15 Feb 2005 19:01:13 -0000 1.70.2.14 *************** *** 1066,1072 **** end def dirty(y) ! (y - @dirty_lines.size).times { @dirty_lines << true } ! (y - @right_states.size).times { @right_states << nil } ! @dirty_lines[y] = true @lru.delete(y) end --- 1066,1070 ---- end def dirty(y) ! @dirty_lines[y] = true if y < @dirty_lines.size @lru.delete(y) end *************** *** 1106,1109 **** --- 1104,1109 ---- end dirty(y) + (1+y-@right_states.size).times { @right_states << nil } + (1+y-@dirty_lines.size).times { @dirty_lines << true } @right_states[y] = state @dirty_lines[y] = false From neoneye at rubyforge.org Tue Feb 15 17:25:45 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 15 17:25:47 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES TODO test_core.rb Message-ID: <200502152225.j1FMPjdS028354@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv28345 Modified Files: Tag: b04022005 CHANGES TODO test_core.rb Log Message: now #test_typical_insert1 works Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.41.2.5 retrieving revision 1.41.2.6 diff -C2 -d -r1.41.2.5 -r1.41.2.6 *** TODO 14 Feb 2005 22:43:01 -0000 1.41.2.5 --- TODO 15 Feb 2005 22:25:43 -0000 1.41.2.6 *************** *** 1,8 **** render with colors. - * I must introduce a dirty flag array, I discovered that I had a - conceptual flaw in my lexercache. - * Simple#model_notify should not dirtify the last line. - * for some reasone propagation occurs with my new caching scheme, - it should NOT happen. * fix bug in caching.. so it will invalidate the right lines. I suspects its the model_update when removing lines. --- 1,3 ---- Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.44.2.5 retrieving revision 1.44.2.6 diff -C2 -d -r1.44.2.5 -r1.44.2.6 *** CHANGES 14 Feb 2005 23:32:47 -0000 1.44.2.5 --- CHANGES 15 Feb 2005 22:25:43 -0000 1.44.2.6 *************** *** 1,3 **** ! 12-02-2005 Neoneye * after being sick for some days and a short 3 days ski vacation, im now back again with a fresh mind. --- 1,7 ---- ! 16-02-2005 Neoneye ! * finally got the #test_typical_insert1 testcase working, so that ! I can be sure that insert works relatively ok. ! ! 15-02-2005 Neoneye * after being sick for some days and a short 3 days ski vacation, im now back again with a fresh mind. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.13 retrieving revision 1.67.2.14 diff -C2 -d -r1.67.2.13 -r1.67.2.14 *** test_core.rb 15 Feb 2005 19:01:13 -0000 1.67.2.13 --- test_core.rb 15 Feb 2005 22:25:43 -0000 1.67.2.14 *************** *** 2037,2041 **** end def test_typical_insert1 ! @lexer.resize(5) 5.times {|y| @lexer.colorize(y) } assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) --- 2037,2046 ---- end def test_typical_insert1 ! # the number of visible lines is only 5, but due to the LRU ! # and the propagation.. when inserting a new line and in case ! # the view is too narrow then full propagation will occur. ! # in order to avoid it the LRU's capacity must be 5 + number of ! # newlines that we want to insert ! @lexer.resize(6) # NOTE: LRU capacity=6, but view height=5. 5.times {|y| @lexer.colorize(y) } assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) *************** *** 2046,2050 **** a_right(0, nil, 1, 2, 3, 4) a_dirty(false, true, true, false, false, false) - assert_equal([0, 3, 4, 5], @lexer.lru.pens.keys.sort) @lexer.colorize(0) a_color_stats(1, 0) --- 2051,2054 ---- *************** *** 2053,2057 **** a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, true, false, false, false) ! assert_equal([0, 1, 3, 4, 5], @lexer.lru.pens.keys.sort) a_color_stats(0, 1) @lexer.count = 1 --- 2057,2061 ---- a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, true, false, false, false) ! assert_equal([1, 0, 5, 4, 3], @lexer.lru.used) a_color_stats(0, 1) @lexer.count = 1 *************** *** 2060,2072 **** a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, false, false, false, false) ! assert_equal([0, 1, 2, 4, 5], @lexer.lru.pens.keys.sort) @lexer.colorize(3) a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, false, false, false, false) ! assert_equal([0, 1, 2, 3, 5], @lexer.lru.pens.keys.sort) ! #a_color_stats(1, 0) # TODO: should be a hits @lexer.colorize(4) ! assert_equal([0, 1, 2, 3, 4], @lexer.lru.pens.keys.sort) ! #a_color_stats(1, 0) # TODO: should be a hits end end --- 2064,2076 ---- a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, false, false, false, false) ! assert_equal([2, 1, 0, 5, 4, 3], @lexer.lru.used) @lexer.colorize(3) a_right(0, 1, 1, 2, 3, 4) a_dirty(false, false, false, false, false, false) ! assert_equal([3, 2, 1, 0, 5, 4], @lexer.lru.used) ! a_color_stats(1, 0) @lexer.colorize(4) ! assert_equal([4, 3, 2, 1, 0, 5], @lexer.lru.used) ! a_color_stats(1, 0) end end From neoneye at rubyforge.org Tue Feb 15 17:56:10 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Tue Feb 15 17:56:11 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source TODO test_core.rb Message-ID: <200502152256.j1FMuAdS029162@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv29137 Modified Files: Tag: b04022005 TODO test_core.rb Log Message: time to goto bed. I layouted a test for notify on remove, which provokes some issues with caching that needs to be investigated. Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.41.2.6 retrieving revision 1.41.2.7 diff -C2 -d -r1.41.2.6 -r1.41.2.7 *** TODO 15 Feb 2005 22:25:43 -0000 1.41.2.6 --- TODO 15 Feb 2005 22:56:08 -0000 1.41.2.7 *************** *** 9,12 **** --- 9,20 ---- * choose a lexer depending on the file suffix. + + optimize: + * when scrolling to the bottom of the buffer, then rendering + becomes slower than in the top. I guess primarily it happens + because of View#visual that must built its array every time. + maybe introduce some caching here. + + misc: * all operations must write themselves to the logfile. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.14 retrieving revision 1.67.2.15 diff -C2 -d -r1.67.2.14 -r1.67.2.15 *** test_core.rb 15 Feb 2005 22:25:43 -0000 1.67.2.14 --- test_core.rb 15 Feb 2005 22:56:08 -0000 1.67.2.15 *************** *** 2074,2077 **** --- 2074,2090 ---- a_color_stats(1, 0) end + def test_typical_remove1 + @model.load("aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii") + @lexer.resize(7) + 7.times {|y| @lexer.colorize(y) } + assert_equal([6, 5, 4, 3, 2, 1, 0], @lexer.lru.used) + #a_right(0, 1, 2, 3, 4, 5, 6) + a_color_stats(0, 7) + @model.replace(1, 1, 1, 3, '') + assert_equal("aa\nbd\nee\nff\ngg\nhh\nii", @model.text) + #assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) + #a_dirty(false, true, false, false, false) + #a_right(0, nil, 1, 2, 3, 4) + end end From neoneye at rubyforge.org Wed Feb 16 02:19:53 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 16 02:19:55 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502160719.j1G7JrdS009004@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv8974 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: figured out why #test_typical_remove1 couldn't start up the way that it was supposed to.. it was because that the lexer already was attached to the model.. and thus got a notify when we loaded the model with new text. I had to add a Lexer#erase method that can wipe the leftovers from earlier times. Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.15 retrieving revision 1.67.2.16 diff -C2 -d -r1.67.2.15 -r1.67.2.16 *** test_core.rb 15 Feb 2005 22:56:08 -0000 1.67.2.15 --- test_core.rb 16 Feb 2005 07:19:51 -0000 1.67.2.16 *************** *** 2076,2083 **** def test_typical_remove1 @model.load("aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii") @lexer.resize(7) 7.times {|y| @lexer.colorize(y) } assert_equal([6, 5, 4, 3, 2, 1, 0], @lexer.lru.used) ! #a_right(0, 1, 2, 3, 4, 5, 6) a_color_stats(0, 7) @model.replace(1, 1, 1, 3, '') --- 2076,2085 ---- def test_typical_remove1 @model.load("aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii") + @lexer.erase @lexer.resize(7) 7.times {|y| @lexer.colorize(y) } assert_equal([6, 5, 4, 3, 2, 1, 0], @lexer.lru.used) ! a_dirty(false, false, false, false, false, false, false) ! a_right(0, 1, 2, 3, 4, 5, 6) a_color_stats(0, 7) @model.replace(1, 1, 1, 3, '') Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.14 retrieving revision 1.70.2.15 diff -C2 -d -r1.70.2.14 -r1.70.2.15 *** core.rb 15 Feb 2005 19:01:13 -0000 1.70.2.14 --- core.rb 16 Feb 2005 07:19:51 -0000 1.70.2.15 *************** *** 1036,1046 **** class Simple < Base def initialize(model) ! reset_counters ! @dirty_lines = [] ! @right_states = [] ! @left = 0 ! @right = 0 ! @pens = [] ! @lru = LRU.new super(model) end --- 1036,1040 ---- class Simple < Base def initialize(model) ! erase super(model) end *************** *** 1059,1062 **** --- 1053,1065 ---- @count_sync_miss + @count_color_miss end + def erase + reset_counters + @dirty_lines = [] + @right_states = [] + @left = 0 + @right = 0 + @pens = [] + @lru = LRU.new + end def status "#{@count_sync_hit}+#{@count_color_hit}/#{@count_sync_miss}+#{@count_color_miss}" *************** *** 1104,1109 **** end dirty(y) ! (1+y-@right_states.size).times { @right_states << nil } ! (1+y-@dirty_lines.size).times { @dirty_lines << true } @right_states[y] = state @dirty_lines[y] = false --- 1107,1112 ---- end dirty(y) ! (y-@right_states.size).times { @right_states << nil } ! (y-@dirty_lines.size).times { @dirty_lines << true } @right_states[y] = state @dirty_lines[y] = false From neoneye at rubyforge.org Wed Feb 16 15:50:41 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 16 15:50:42 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502162050.j1GKofdS021182@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv21171 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: improvements to the remove operation Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.16 retrieving revision 1.67.2.17 diff -C2 -d -r1.67.2.16 -r1.67.2.17 *** test_core.rb 16 Feb 2005 07:19:51 -0000 1.67.2.16 --- test_core.rb 16 Feb 2005 20:50:39 -0000 1.67.2.17 *************** *** 2083,2091 **** a_right(0, 1, 2, 3, 4, 5, 6) a_color_stats(0, 7) @model.replace(1, 1, 1, 3, '') assert_equal("aa\nbd\nee\nff\ngg\nhh\nii", @model.text) ! #assert_equal([4, 3, 2, 1, 0], @lexer.lru.used) ! #a_dirty(false, true, false, false, false) ! #a_right(0, nil, 1, 2, 3, 4) end end --- 2083,2105 ---- a_right(0, 1, 2, 3, 4, 5, 6) a_color_stats(0, 7) + assert_equal([6, 5, 4, 3, 2, 1, 0], @lexer.lru.used) + #p 'begin' @model.replace(1, 1, 1, 3, '') + #p 'end' assert_equal("aa\nbd\nee\nff\ngg\nhh\nii", @model.text) ! a_dirty(false, true, false, false, false) ! a_right(0, 3, 4, 5, 6) ! # line #1 and merges with #3 into line #1.. which becomes dirty ! # line #4..#6 gets displaced to #2..#4 ! assert_equal([4, 3, 2, 0], @lexer.lru.used) ! @lexer.colorize(0) ! a_color_stats(1, 0) ! assert_equal([0, 4, 3, 2], @lexer.lru.used) ! @lexer.colorize(1) ! a_color_stats(0, 1) ! a_dirty(false, false, true, false, false) ! #assert_equal([1, 0, 4, 3, 2], @lexer.lru.used) ! @lexer.colorize(2) ! #a_color_stats(1, 0) end end Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.15 retrieving revision 1.70.2.16 diff -C2 -d -r1.70.2.15 -r1.70.2.16 *** core.rb 16 Feb 2005 07:19:51 -0000 1.70.2.15 --- core.rb 16 Feb 2005 20:50:39 -0000 1.70.2.16 *************** *** 1086,1092 **** @lru.insert(sy, n) # displace all cached pens else @right_states.slice!(dy, -n) @dirty_lines.slice!(dy, -n) ! @lru.remove(dy+n, -n) # displace all cached pens end info.y1.upto([sy, dy].min) {|i| dirty(i) } --- 1086,1093 ---- @lru.insert(sy, n) # displace all cached pens else + #p n, dy @right_states.slice!(dy, -n) @dirty_lines.slice!(dy, -n) ! @lru.remove(dy, -n) # displace all cached pens end info.y1.upto([sy, dy].min) {|i| dirty(i) } From neoneye at rubyforge.org Wed Feb 16 16:23:17 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 16 16:23:18 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source core.rb test_core.rb Message-ID: <200502162123.j1GLNHdS023596@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv23544 Modified Files: Tag: b04022005 core.rb test_core.rb Log Message: now remove works Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.17 retrieving revision 1.67.2.18 diff -C2 -d -r1.67.2.17 -r1.67.2.18 *** test_core.rb 16 Feb 2005 20:50:39 -0000 1.67.2.17 --- test_core.rb 16 Feb 2005 21:23:15 -0000 1.67.2.18 *************** *** 2096,2105 **** a_color_stats(1, 0) assert_equal([0, 4, 3, 2], @lexer.lru.used) @lexer.colorize(1) a_color_stats(0, 1) ! a_dirty(false, false, true, false, false) ! #assert_equal([1, 0, 4, 3, 2], @lexer.lru.used) ! @lexer.colorize(2) ! #a_color_stats(1, 0) end end --- 2096,2107 ---- a_color_stats(1, 0) assert_equal([0, 4, 3, 2], @lexer.lru.used) + @lexer.count = 3 @lexer.colorize(1) a_color_stats(0, 1) ! a_right(0, 3, 4, 5, 6) ! a_dirty(false, false, false, false, false) ! assert_equal([1, 0, 4, 3, 2], @lexer.lru.used) ! 5.times {|y| @lexer.colorize(2+y) } ! a_color_stats(3, 2) end end Index: core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/core.rb,v retrieving revision 1.70.2.16 retrieving revision 1.70.2.17 diff -C2 -d -r1.70.2.16 -r1.70.2.17 *** core.rb 16 Feb 2005 20:50:39 -0000 1.70.2.16 --- core.rb 16 Feb 2005 21:23:15 -0000 1.70.2.17 *************** *** 1069,1072 **** --- 1069,1073 ---- end def dirty(y) + #puts "dirty #{y}" if $dbg @dirty_lines[y] = true if y < @dirty_lines.size @lru.delete(y) *************** *** 1079,1082 **** --- 1080,1084 ---- n = dy - sy if n > 0 + #puts "model_update: insert n=#{n}, dy=#{dy}" if $dbg dirty(sy) # dirtify the line before splitting n.times do *************** *** 1086,1090 **** @lru.insert(sy, n) # displace all cached pens else ! #p n, dy @right_states.slice!(dy, -n) @dirty_lines.slice!(dy, -n) --- 1088,1092 ---- @lru.insert(sy, n) # displace all cached pens else ! #puts "model_update: removing n=#{n}, dy=#{dy}" if $dbg @right_states.slice!(dy, -n) @dirty_lines.slice!(dy, -n) *************** *** 1100,1109 **** if state != old propagate = true ! #puts "propagate #{y}->#{y+1}, because #{state.inspect} is " + ! # "distinct from #{old.inspect}" end elsif y >= @right_states.size propagate = true ! #puts "propagate #{y}->#{y+1}, because y >= size" end dirty(y) --- 1102,1113 ---- if state != old propagate = true ! #if $dbg ! # puts "propagate #{y}->#{y+1}, because #{state.inspect} is " + ! # "distinct from #{old.inspect}" ! #end end elsif y >= @right_states.size propagate = true ! #puts "propagate #{y}->#{y+1}, because y >= size" if $dbg end dirty(y) *************** *** 1112,1118 **** @right_states[y] = state @dirty_lines[y] = false ! #p @right_states, propagate dirty(y+1) if propagate ! #p @right_states end def sync_states(number_of_states) --- 1116,1122 ---- @right_states[y] = state @dirty_lines[y] = false ! #puts "rs=#{@right_states.inspect} prop=#{propagate}" if $dbg dirty(y+1) if propagate ! #puts "rs=#{@right_states.inspect}" if $dbg end def sync_states(number_of_states) From neoneye at rubyforge.org Wed Feb 16 17:08:22 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 16 17:08:23 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source main_tui.rb test_core.rb tui.c Message-ID: <200502162208.j1GM8MdS026178@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv26173 Modified Files: Tag: b04022005 main_tui.rb test_core.rb tui.c Log Message: added more colors Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.72.2.10 retrieving revision 1.72.2.11 diff -C2 -d -r1.72.2.10 -r1.72.2.11 *** main_tui.rb 7 Feb 2005 17:37:57 -0000 1.72.2.10 --- main_tui.rb 16 Feb 2005 22:08:20 -0000 1.72.2.11 *************** *** 40,47 **** @pens = [] @colors = { ! :tab => 6, ! :keyword => 2, ! :punct => 2, ! :string => 4 } @colors.default = 1 --- 40,50 ---- @pens = [] @colors = { ! :keyword => 2, :punct => 2, :number => 2, :symbol => 2, ! :string => 4, :string1 => 3, ! :regexp => 4, :regexp1 => 3, ! :literal => 4, :literal1 => 3, ! :heredoc => 4, :heredoc1 => 3, ! :tab => 6, :comment => 6, :mcomment => 6, ! :gvar => 10 } @colors.default = 1 Index: test_core.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_core.rb,v retrieving revision 1.67.2.18 retrieving revision 1.67.2.19 diff -C2 -d -r1.67.2.18 -r1.67.2.19 *** test_core.rb 16 Feb 2005 21:23:15 -0000 1.67.2.18 --- test_core.rb 16 Feb 2005 22:08:20 -0000 1.67.2.19 *************** *** 2084,2090 **** a_color_stats(0, 7) assert_equal([6, 5, 4, 3, 2, 1, 0], @lexer.lru.used) - #p 'begin' @model.replace(1, 1, 1, 3, '') - #p 'end' assert_equal("aa\nbd\nee\nff\ngg\nhh\nii", @model.text) a_dirty(false, true, false, false, false) --- 2084,2088 ---- Index: tui.c =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/tui.c,v retrieving revision 1.3 retrieving revision 1.3.2.1 diff -C2 -d -r1.3 -r1.3.2.1 *** tui.c 2 Feb 2005 22:08:15 -0000 1.3 --- tui.c 16 Feb 2005 22:08:20 -0000 1.3.2.1 *************** *** 48,51 **** --- 48,52 ---- init_pair(8, COLOR_BLUE, COLOR_BLUE); /* tabs */ init_pair(9, COLOR_BLACK, COLOR_RED); /* error */ + init_pair(10, COLOR_RED, COLOR_BLUE); /* error */ color_set(1, 0); From neoneye at rubyforge.org Wed Feb 16 17:18:30 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 16 17:18:31 2005 Subject: [Aeditor-commit] projects/documents/homepage/aeditor_shots 058.png Message-ID: <200502162218.j1GMIUdS026328@rubyforge.org> Update of /var/cvs/aeditor/projects/documents/homepage/aeditor_shots In directory rubyforge.org:/tmp/cvs-serv26322 Added Files: 058.png Log Message: shot of today --- NEW FILE: 058.png --- (This appears to be a binary file; contents omitted.) From neoneye at rubyforge.org Wed Feb 16 17:23:19 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 16 17:23:20 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES TODO Message-ID: <200502162223.j1GMNJdS026423@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv26405 Modified Files: Tag: b04022005 CHANGES TODO Log Message: im ready to merge this branch. Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.44.2.6 retrieving revision 1.44.2.7 diff -C2 -d -r1.44.2.6 -r1.44.2.7 *** CHANGES 15 Feb 2005 22:25:43 -0000 1.44.2.6 --- CHANGES 16 Feb 2005 22:23:17 -0000 1.44.2.7 *************** *** 2,5 **** --- 2,7 ---- * finally got the #test_typical_insert1 testcase working, so that I can be sure that insert works relatively ok. + * now #test_typical_remove1 is working. + * added nicer colors. 15-02-2005 Neoneye Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.41.2.7 retrieving revision 1.41.2.8 diff -C2 -d -r1.41.2.7 -r1.41.2.8 *** TODO 15 Feb 2005 22:56:08 -0000 1.41.2.7 --- TODO 16 Feb 2005 22:23:17 -0000 1.41.2.8 *************** *** 1,8 **** render with colors. - * fix bug in caching.. so it will invalidate the right lines. - I suspects its the model_update when removing lines. - * propagation occurs.. but is rendered wrong. - @lexer.set_right_state should compare the state - of the current line.. rather than the following line. * delayed rendering looks ugly, please render it immediately. * rubylexer should deal with unicode glyphs. --- 1,3 ---- *************** *** 25,28 **** --- 20,25 ---- * search dialog (ala editpad). * mouse support. + * scrolling to the bottom of core.rb', I can see that the line-number + has been rendered wrong (maybe xterm/ncurses issue?). From neoneye at rubyforge.org Wed Feb 16 17:30:05 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 16 17:30:06 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES README Message-ID: <200502162230.j1GMU5dS026667@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv26617 Modified Files: CHANGES README Log Message: lets release version 2.4 Index: README =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/README,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** README 2 Feb 2005 22:23:37 -0000 1.14 --- README 16 Feb 2005 22:30:02 -0000 1.15 *************** *** 1,11 **** ! AEDITOR 2.3 =========== ! This is a new incarnation of AEditor, still barebones, ! slow, still very rough. No syntax coloring, no multibuffer, ! no advanced edit strategies (it has a new datastructure that rocks). ! No undo/redo. If we don't consider the code for wrapping libncursesw, ! then the core of the editor only takes up 1500 lines of ruby code. ! This README is written with this editor. homepage: --- 1,10 ---- ! AEDITOR 2.4 =========== ! This is a new incarnation of AEditor, still barebones, slow, still ! very rough, no multibuffer, no undo/redo, no advanced edit strategies ! (it has a new datastructure that rocks). If we don't consider the ! code for wrapping libncursesw, then the core of the editor only takes ! up 1500 lines of ruby code. This README is written with this editor. homepage: *************** *** 14,18 **** screenshot: ! http://aeditor.rubyforge.org/aeditor_shots/055.png --- 13,17 ---- screenshot: ! http://aeditor.rubyforge.org/aeditor_shots/058.png *************** *** 28,31 **** --- 27,31 ---- selections unicode glyphs + syntax coloring Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.45 retrieving revision 1.46 diff -C2 -d -r1.45 -r1.46 *** CHANGES 16 Feb 2005 22:26:11 -0000 1.45 --- CHANGES 16 Feb 2005 22:30:02 -0000 1.46 *************** *** 1,3 **** --- 1,4 ---- 16-02-2005 Neoneye + * released version 2.4 (turbo release). * finally got the #test_typical_insert1 testcase working, so that I can be sure that insert works relatively ok. From neoneye at rubyforge.org Wed Feb 16 18:16:05 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 16 18:16:07 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source lexer.rb Message-ID: <200502162316.j1GNG5dS030234@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv30224 Modified Files: lexer.rb Log Message: jpedrosa pointed out that it didn't work at his place.. because of old require statement. Index: lexer.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/lexer.rb,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** lexer.rb 16 Feb 2005 22:26:11 -0000 1.2 --- lexer.rb 16 Feb 2005 23:16:03 -0000 1.3 *************** *** 304,309 **** end # module LexerCplusplus - require 'aeditor/string' - module LexerRuby --- 304,307 ---- From neoneye at rubyforge.org Wed Feb 16 18:29:16 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Wed Feb 16 18:29:17 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source README Message-ID: <200502162329.j1GNTGdS030574@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv30546 Modified Files: README Log Message: improved installation procedure Index: README =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/README,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** README 16 Feb 2005 22:30:02 -0000 1.15 --- README 16 Feb 2005 23:29:13 -0000 1.16 *************** *** 105,114 **** prompt> make - now you can run aeditor ! prompt> ruby main_tui.rb --- 105,123 ---- prompt> make ! maybe you need to set the LANG envvar + prompt> setenv LANG en_DK.UTF-8 + maybe you need to install a unicode font too + you can find a unicode font here: + http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html + + + now you can run aeditor + + prompt> ruby main_tui.rb + From neoneye at rubyforge.org Sat Feb 19 08:06:11 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 19 08:06:12 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source TODO Message-ID: <200502191306.j1JD6BdS003587@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv3576 Modified Files: TODO Log Message: rescheduled my todos Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.42 retrieving revision 1.43 diff -C2 -d -r1.42 -r1.43 *** TODO 16 Feb 2005 22:26:11 -0000 1.42 --- TODO 19 Feb 2005 13:06:09 -0000 1.43 *************** *** 1,6 **** render with colors. * delayed rendering looks ugly, please render it immediately. ! * rubylexer should deal with unicode glyphs. ! * choose a lexer depending on the file suffix. --- 1,28 ---- + multibuffer support. + + + integrate with ruby's debug.rb. + + + dotfile. + + + choose a lexer depending on file suffix. + + + the imported lexer must be adapted to use unicode. + right now it only deals with ascii. Lets ensure it outputs the + same number of pens as the number of glyps it got as input. + + + user-interface for search dialog (ala editpad). + + + user-interface for replace dialog (ala editpad). + + render with colors. * delayed rendering looks ugly, please render it immediately. ! * lex ahead.. so that scroll up and down goes faster. *************** *** 17,22 **** user-interface: * F1 should provide help. - * search dialog (ala editpad). * mouse support. * scrolling to the bottom of core.rb', I can see that the line-number --- 39,45 ---- user-interface: + * file requester. + * pulldown menu. * F1 should provide help. * mouse support. * scrolling to the bottom of core.rb', I can see that the line-number *************** *** 26,30 **** more edit-operations: * smart end (toggles between lineend and endspace). - * multibuffer. * search, replace. * match parenthesis. --- 49,52 ---- *************** *** 39,42 **** --- 61,66 ---- * prefix all edit operations with edit_. * prefix all move operations with move_. + * the lexer internally builds pairs of text and pen, this is + inefficient, instead it should use an array of integers. From neoneye at rubyforge.org Sat Feb 19 08:24:47 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 19 08:24:48 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source TODO main_tui.rb Message-ID: <200502191324.j1JDOldS003926@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv3913 Modified Files: TODO main_tui.rb Log Message: added placeholder for buffer-cycle. recalled that there was a problem with selectionmode sync. Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.73 retrieving revision 1.74 diff -C2 -d -r1.73 -r1.74 *** main_tui.rb 16 Feb 2005 22:26:11 -0000 1.73 --- main_tui.rb 19 Feb 2005 13:24:45 -0000 1.74 *************** *** 154,157 **** --- 154,160 ---- end end + def cycle_buffer + $logger.info "cycle buffer" + end def render_cache_clear @render_info = {} *************** *** 289,296 **** when 265 @view.insert([0x301c].pack("U*")) ! when 270 @view.move_to_lineend ! when 271 @view.move_to_linebegin when 21 # ctrl-u use clipboard as find pattern @view.search_init(@selection_text) --- 292,301 ---- when 265 @view.insert([0x301c].pack("U*")) ! when 270 # End @view.move_to_lineend ! when 271 # Home @view.move_to_linebegin + when 276 # F12 + cycle_buffer when 21 # ctrl-u use clipboard as find pattern @view.search_init(@selection_text) Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** TODO 19 Feb 2005 13:06:09 -0000 1.43 --- TODO 19 Feb 2005 13:24:45 -0000 1.44 *************** *** 22,25 **** --- 22,30 ---- + [bug] sync selection mode between view and main. Some operations + causes main's selection mode to get out of sync with View. This + behavior is weird. + + render with colors. * delayed rendering looks ugly, please render it immediately. From neoneye at rubyforge.org Sat Feb 19 09:10:33 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 19 09:10:34 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source main_tui.rb Message-ID: <200502191410.j1JEAXdS006595@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv6579 Modified Files: main_tui.rb Log Message: early code for switching buffers Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** main_tui.rb 19 Feb 2005 13:24:45 -0000 1.74 --- main_tui.rb 19 Feb 2005 14:10:31 -0000 1.75 *************** *** 60,67 **** end ! class MainTUI < AEditor::Canvas::Base ! NEONEYE = [0xff2e, 0xff25, 0xff2f, ! 0xff2e, 0xff25, 0xff39, 0xff25].pack("U*") class RenderInfo def initialize( --- 60,125 ---- end ! class Buffer ! def initialize(text, filename) ! @filename = filename + @model = AEditor::Model::Caretaker.new + @model.load(text) + + @view = AEditor::View::Caretaker.new(@model) + #@view.canvas, self.view = self, @view + @model.attach(@view) + + lexer = LexRuby.new(@model) + @view.lexer = lexer + @model.attach(lexer) + end + attr_reader :view, :model, :filename + + def save_file + $logger.info "outputting to file, filename=#{@filename.inspect}" + File.open(@filename, "w+") do |f| + f.write(@model.text) + end + end + end + + class Buffers + def initialize + @buffers = [] + end + def open_file(filename) + raise TypeError unless filename.kind_of?(String) + buf = Buffer.new(IO.read(filename), filename) + @buffers << buf + buf + rescue Errno::EACCES, Errno::ENOENT => e + $logger.info "cannot access file, filename=#{filename.inspect}" + raise ArgumentError, 'cannot access file' + end + def open_dummy + neoneye = [0xff2e, 0xff25, 0xff2f, + 0xff2e, 0xff25, 0xff39, 0xff25].pack("U*") + str = "Welcome to AEditor-2.0\n" + str += "written by: " + neoneye + "\n" + str += "homepage: http://aeditor.rubyforge.org/\n\n\n" + str += "features:\n" + str += " * unicode (UTF-8 encoding).\n" + str += " * renders halfwidth, fullwidth and tabs.\n" + str += " * basic editing.\n" + str += " * written in less than 1000 lines." + buf = Buffer.new(str, 'noname00.txt') + @buffers << buf + buf + end + def size + @buffers.size + end + def [](index) + @buffers[index] + end + end + + class MainTUI < AEditor::Canvas::Base class RenderInfo def initialize( *************** *** 94,132 **** end end ! def initialize(canvas, filename) super() @dispatch2 = nil @canvas = canvas ! @model = AEditor::Model::Caretaker.new ! if filename.kind_of?(String) ! begin ! @model.load(IO.read(filename)) ! @filename = filename ! rescue Errno::EACCES, Errno::ENOENT => e ! $logger.info "cannot access file, filename=#{filename.inspect}" ! end ! end ! unless @filename ! str = "Welcome to AEditor-2.0\n" ! str += "written by: " + NEONEYE + "\n" ! str += "homepage: http://aeditor.rubyforge.org/\n\n\n" ! str += "features:\n" ! str += " * unicode (UTF-8 encoding).\n" ! str += " * renders halfwidth, fullwidth and tabs.\n" ! str += " * basic editing.\n" ! str += " * written in less than 1000 lines." ! @filename = 'noname00.txt' ! @model.load(str) end ! @view = AEditor::View::Caretaker.new(@model) ! @view.canvas, self.view = self, @view ! @model.attach(@view) - @lexer = LexRuby.new(@model) - @view.lexer = @lexer - @model.attach(@lexer) - #@lexer = MockLexer.new - #@view.lexer = @lexer @tabsize = 4 @red_column = 70 --- 152,171 ---- end end ! def initialize(canvas, filename) super() @dispatch2 = nil @canvas = canvas ! ! @buffers = Buffers.new ! if filename ! @buffers.open_file(filename) ! else ! @buffers.open_dummy end ! @buffer_index = -1 ! @buffer = nil ! switch_to_buffer(0) @tabsize = 4 @red_column = 70 *************** *** 154,159 **** --- 193,209 ---- end end + def switch_to_buffer(index) + $logger.info "switch to buffer ##{index} from buffer ##{@buffer_index}" + return if index == @buffer_index + return if index >= @buffers.size + @buffer_index = index + @buffer = @buffers[index] + @view = @buffer.view + @model = @buffer.model + @view.canvas, self.view = self, @view + end def cycle_buffer $logger.info "cycle buffer" + switch_to_buffer(@buffer_index + 1 % @buffers.size) end def render_cache_clear *************** *** 251,258 **** case event when 15 ! $logger.info "outputting to file, filename=#{@filename.inspect}" ! File.open(@filename, "w+") do |f| ! f.write(@model.text) ! end when 6 install(:dispatch_fold) --- 301,305 ---- case event when 15 ! @buffer.save_file when 6 install(:dispatch_fold) From neoneye at rubyforge.org Sat Feb 19 10:01:35 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 19 10:01:36 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source CHANGES TODO main_tui.rb Message-ID: <200502191501.j1JF1ZdS009279@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv9272 Modified Files: CHANGES TODO main_tui.rb Log Message: now multibuffer is working Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.75 retrieving revision 1.76 diff -C2 -d -r1.75 -r1.76 *** main_tui.rb 19 Feb 2005 14:10:31 -0000 1.75 --- main_tui.rb 19 Feb 2005 15:01:32 -0000 1.76 *************** *** 153,157 **** end ! def initialize(canvas, filename) super() @dispatch2 = nil --- 153,157 ---- end ! def initialize(canvas, filenames) super() @dispatch2 = nil *************** *** 159,170 **** @buffers = Buffers.new ! if filename ! @buffers.open_file(filename) ! else @buffers.open_dummy end @buffer_index = -1 @buffer = nil - switch_to_buffer(0) @tabsize = 4 --- 159,171 ---- @buffers = Buffers.new ! if filenames.empty? @buffers.open_dummy + else + filenames.each do |filename| + @buffers.open_file(filename) + end end @buffer_index = -1 @buffer = nil @tabsize = 4 *************** *** 179,191 **** @render_info = {} end ! def self.run(filename) require 'ncursesw' #dump_memory_info CursesCanvas.open do |c| oldtitle = c.get_title || "AEditor has exited" - name = File.basename(filename || '') - c.set_title("#{name} - AEditor") begin ! self.new(c, filename).event_loop ensure c.set_title(oldtitle) --- 180,190 ---- @render_info = {} end ! def self.run(filenames) require 'ncursesw' #dump_memory_info CursesCanvas.open do |c| oldtitle = c.get_title || "AEditor has exited" begin ! self.new(c, filenames).event_loop ensure c.set_title(oldtitle) *************** *** 202,209 **** @model = @buffer.model @view.canvas, self.view = self, @view end def cycle_buffer $logger.info "cycle buffer" ! switch_to_buffer(@buffer_index + 1 % @buffers.size) end def render_cache_clear --- 201,215 ---- @model = @buffer.model @view.canvas, self.view = self, @view + name = File.basename(@buffer.filename || '') + @canvas.set_title("[#{index}] #{name} - AEditor") + @view.resize(width, height) + @canvas.clear + @render_info = {} + #@view.update_cursor + @view.update end def cycle_buffer $logger.info "cycle buffer" ! switch_to_buffer((@buffer_index + 1) % @buffers.size) end def render_cache_clear *************** *** 211,217 **** end def event_loop ! @view.resize(width, height) #dump_memory_info("before update") ! @view.update #dump_memory_info("after update") #dump_statistics --- 217,224 ---- end def event_loop ! switch_to_buffer(0) ! #@view.resize(width, height) #dump_memory_info("before update") ! #@view.update #dump_memory_info("after update") #dump_statistics *************** *** 595,599 **** $logger.info "program begin." #dump_memory_info ! MainTUI.run(ARGV.empty? ? nil : ARGV[0]) rescue Exception => e bt = e.backtrace.map{|s| --- 602,606 ---- $logger.info "program begin." #dump_memory_info ! MainTUI.run(ARGV) rescue Exception => e bt = e.backtrace.map{|s| Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.46 retrieving revision 1.47 diff -C2 -d -r1.46 -r1.47 *** CHANGES 16 Feb 2005 22:30:02 -0000 1.46 --- CHANGES 19 Feb 2005 15:01:32 -0000 1.47 *************** *** 1,2 **** --- 1,5 ---- + 19-02-2005 Neoneye + * multibuffer is now working. + 16-02-2005 Neoneye * released version 2.4 (turbo release). Index: TODO =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/TODO,v retrieving revision 1.44 retrieving revision 1.45 diff -C2 -d -r1.44 -r1.45 *** TODO 19 Feb 2005 13:24:45 -0000 1.44 --- TODO 19 Feb 2005 15:01:32 -0000 1.45 *************** *** 1,5 **** - multibuffer support. - - integrate with ruby's debug.rb. --- 1,2 ---- From neoneye at rubyforge.org Sat Feb 19 10:04:59 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 19 10:05:01 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source README Message-ID: <200502191504.j1JF4xdS009365@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv9338 Modified Files: README Log Message: multibuffering now works Index: README =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/README,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** README 16 Feb 2005 23:29:13 -0000 1.16 --- README 19 Feb 2005 15:04:57 -0000 1.17 *************** *** 3,7 **** This is a new incarnation of AEditor, still barebones, slow, still ! very rough, no multibuffer, no undo/redo, no advanced edit strategies (it has a new datastructure that rocks). If we don't consider the code for wrapping libncursesw, then the core of the editor only takes --- 3,7 ---- This is a new incarnation of AEditor, still barebones, slow, still ! very rough, no undo/redo, no advanced edit strategies (it has a new datastructure that rocks). If we don't consider the code for wrapping libncursesw, then the core of the editor only takes *************** *** 28,31 **** --- 28,32 ---- unicode glyphs syntax coloring + multibuffer *************** *** 61,64 **** --- 62,66 ---- ctrl v ......... toggle selection mode ctrl p ......... paste from clipboard + F12 ............ cycle to next buffer From neoneye at rubyforge.org Sat Feb 19 13:32:27 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 19 13:32:27 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source main_tui.rb Message-ID: <200502191832.j1JIWRdS020098@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv20088 Modified Files: main_tui.rb Log Message: preparations for a search dialog Index: main_tui.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/main_tui.rb,v retrieving revision 1.76 retrieving revision 1.77 diff -C2 -d -r1.76 -r1.77 *** main_tui.rb 19 Feb 2005 15:01:32 -0000 1.76 --- main_tui.rb 19 Feb 2005 18:32:25 -0000 1.77 *************** *** 192,195 **** --- 192,198 ---- end end + def render_cache_clear + @render_info = {} + end def switch_to_buffer(index) $logger.info "switch to buffer ##{index} from buffer ##{@buffer_index}" *************** *** 205,209 **** @view.resize(width, height) @canvas.clear ! @render_info = {} #@view.update_cursor @view.update --- 208,212 ---- @view.resize(width, height) @canvas.clear ! render_cache_clear #@view.update_cursor @view.update *************** *** 213,218 **** switch_to_buffer((@buffer_index + 1) % @buffers.size) end ! def render_cache_clear ! @render_info = {} end def event_loop --- 216,257 ---- switch_to_buffer((@buffer_index + 1) % @buffers.size) end ! def dialog_search ! $logger.info "show search dialog" ! ! ary = [] ! ! g = [0x2500]*@canvas.width ! g[5] = 0x2534 ! g[6 + @red_column] = 0x2534 ! p = [6] * g.size ! ary << [g, p] ! ! g = " search [^\\s*def\\b________________________]".unpack('U*') ! p = [2] * g.size ! 9.times {|i| p[14+i] = 1} ! ary << [g, p] ! ! keys = ["F1 regex", "F2 case", "F3 cursor", "F4 word", "F5 down"] ! g = keys.join(' ').unpack('U*') ! p = [] ! keys.each_with_index do |txt, i| ! p += [2] if i != 0 ! p += [3] * txt.size ! end ! ary << [[32]*6 + g, [1]*6 + p] ! ! ary.each_with_index do |(glyphs, pens), i| ! while glyphs.size < @canvas.width ! glyphs << 32 ! pens << 1 ! end ! @canvas.render_row2( ! @canvas.height - ary.size + i, ! glyphs, ! pens, ! 0, ! glyphs.size ! ) ! end end def event_loop *************** *** 358,361 **** --- 397,402 ---- when 277 # Shift-F3 @view.search_up + when 268 # F4 search + dialog_search when 266 dump_statistics From neoneye at rubyforge.org Sat Feb 19 13:43:36 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 19 13:43:37 2005 Subject: [Aeditor-commit] projects/documents/homepage/aeditor_shots 059.png Message-ID: <200502191843.j1JIhadS020328@rubyforge.org> Update of /var/cvs/aeditor/projects/documents/homepage/aeditor_shots In directory rubyforge.org:/tmp/cvs-serv20319 Added Files: 059.png Log Message: I have made a prototype of how the UI for the search dialog could be like. --- NEW FILE: 059.png --- (This appears to be a binary file; contents omitted.) From neoneye at rubyforge.org Sun Feb 20 10:33:00 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 20 10:33:01 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source test_lineedit.rb Message-ID: <200502201533.j1KFX0dS009303@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv9294 Added Files: test_lineedit.rb Log Message: very primitive lineedit class added... so that I can begin coding some of the UI. --- NEW FILE: test_lineedit.rb --- require 'test/unit' class LineEdit def initialize @text_left = '' @text_right = '' end attr_reader :text_left, :text_right def text @text_left + @text_right end def insert(text) raise TypeError unless text.kind_of?(String) text.unpack('U*') # ensure its valid UTF-8 @text_left += text end def erase_left m = @text_left.match(/.\z/u) return nil unless m b1, b2 = m.begin(0), m.end(0) @text_left.slice!(b1, b2 - b1) end def move_left s = erase_left @text_right = s + @text_right if s end def move_home @text_right = @text_left + @text_right @text_left = '' end def move_end @text_left += @text_right @text_right = '' end def erase_right m = @text_right.match(/\A./u) return nil unless m b1, b2 = m.begin(0), m.end(0) @text_right.slice!(b1, b2 - b1) end def move_right s = erase_right @text_left += s if s end end class TestLineEdit < Test::Unit::TestCase def setup @edit = LineEdit.new end def test_insert_typical1 @edit.insert('a') assert_equal('a', @edit.text) @edit.insert('b') assert_equal('ab', @edit.text) end def test_insert_error1 assert_raise(TypeError) { @edit.insert(5) } end def test_insert_utf8_error1 assert_raise(ArgumentError) { @edit.insert("\xff") } end def test_erase_left_typical1 @edit.insert('abc') assert_equal('c', @edit.erase_left) assert_equal('ab', @edit.text) assert_equal('b', @edit.erase_left) assert_equal('a', @edit.text) assert_equal('a', @edit.erase_left) assert_equal('', @edit.text) assert_equal(nil, @edit.erase_left) assert_equal('', @edit.text) end def test_erase_left_typical2 @edit.insert("\341\210\264\342\215\205") assert_equal("\342\215\205", @edit.erase_left) assert_equal("\341\210\264", @edit.text) assert_equal("\341\210\264", @edit.erase_left) assert_equal('', @edit.text) end def lr [@edit.text_left, @edit.text_right] end def test_move_left_typical1 @edit.insert('abc') @edit.move_left assert_equal(%w(ab c), lr) @edit.move_left assert_equal(%w(a bc), lr) @edit.move_left assert_equal(['', 'abc'], lr) end def test_move_home_end1 @edit.insert('abc') @edit.move_home assert_equal(['', 'abc'], lr) @edit.move_end assert_equal(['abc', ''], lr) end def test_move_right_typical1 @edit.insert('abc') @edit.move_home @edit.move_right assert_equal(%w(a bc), lr) end end From neoneye at rubyforge.org Sun Feb 20 10:42:48 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sun Feb 20 10:42:49 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source lineedit.rb CHANGES test_lineedit.rb Message-ID: <200502201542.j1KFgmdS009423@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv9417 Modified Files: CHANGES test_lineedit.rb Added Files: lineedit.rb Log Message: splitted lineedit class out from testfile Index: test_lineedit.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/test_lineedit.rb,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_lineedit.rb 20 Feb 2005 15:32:58 -0000 1.1 --- test_lineedit.rb 20 Feb 2005 15:42:46 -0000 1.2 *************** *** 1,47 **** require 'test/unit' ! ! class LineEdit ! def initialize ! @text_left = '' ! @text_right = '' ! end ! attr_reader :text_left, :text_right ! def text ! @text_left + @text_right ! end ! def insert(text) ! raise TypeError unless text.kind_of?(String) ! text.unpack('U*') # ensure its valid UTF-8 ! @text_left += text ! end ! def erase_left ! m = @text_left.match(/.\z/u) ! return nil unless m ! b1, b2 = m.begin(0), m.end(0) ! @text_left.slice!(b1, b2 - b1) ! end ! def move_left ! s = erase_left ! @text_right = s + @text_right if s ! end ! def move_home ! @text_right = @text_left + @text_right ! @text_left = '' ! end ! def move_end ! @text_left += @text_right ! @text_right = '' ! end ! def erase_right ! m = @text_right.match(/\A./u) ! return nil unless m ! b1, b2 = m.begin(0), m.end(0) ! @text_right.slice!(b1, b2 - b1) ! end ! def move_right ! s = erase_right ! @text_left += s if s ! end ! end class TestLineEdit < Test::Unit::TestCase --- 1,4 ---- require 'test/unit' ! require 'lineedit' class TestLineEdit < Test::Unit::TestCase Index: CHANGES =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/CHANGES,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** CHANGES 19 Feb 2005 15:01:32 -0000 1.47 --- CHANGES 20 Feb 2005 15:42:46 -0000 1.48 *************** *** 1,2 **** --- 1,5 ---- + 20-02-2005 Neoneye + * LineEdit class added. + 19-02-2005 Neoneye * multibuffer is now working. --- NEW FILE: lineedit.rb --- class LineEdit def initialize @text_left = '' @text_right = '' end attr_reader :text_left, :text_right def text @text_left + @text_right end def insert(text) raise TypeError unless text.kind_of?(String) text.unpack('U*') # ensure its valid UTF-8 @text_left += text end def erase_left m = @text_left.match(/.\z/u) return nil unless m b1, b2 = m.begin(0), m.end(0) @text_left.slice!(b1, b2 - b1) end def move_left s = erase_left @text_right = s + @text_right if s end def move_home @text_right = @text_left + @text_right @text_left = '' end def move_end @text_left += @text_right @text_right = '' end def erase_right m = @text_right.match(/\A./u) return nil unless m b1, b2 = m.begin(0), m.end(0) @text_right.slice!(b1, b2 - b1) end def move_right s = erase_right @text_left += s if s end end From neoneye at rubyforge.org Fri Feb 25 13:21:45 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Fri Feb 25 13:21:46 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source ncursesw.rb Message-ID: <200502251821.j1PILjdS024137@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv24102 Modified Files: ncursesw.rb Log Message: I have just gotten a Mac Mini, and I wanted to try out aeditor. I realized that the LANG environmentvariable wasn't set, so that I got a nil exception. This prevents accessing the nil value. Index: ncursesw.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/ncursesw.rb,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** ncursesw.rb 2 Feb 2005 18:24:41 -0000 1.24 --- ncursesw.rb 25 Feb 2005 18:21:43 -0000 1.25 *************** *** 1,5 **** lang = ENV['LANG'] ! unless lang.match(/[a-z]{2}_[A-Z]{2}\.UTF-8/) ! puts "the LANG environment variable is not correct" exit end --- 1,5 ---- lang = ENV['LANG'] ! if lang == nil or lang.match(/[a-z]{2}_[A-Z]{2}\.UTF-8/) == nil ! $logger.error "the LANG environment variable is not correct" exit end *************** *** 174,176 **** c.getch end ! end \ No newline at end of file --- 174,176 ---- c.getch end ! end From neoneye at rubyforge.org Sat Feb 26 12:39:21 2005 From: neoneye at rubyforge.org (neoneye@rubyforge.org) Date: Sat Feb 26 12:39:22 2005 Subject: [Aeditor-commit] projects/experimental/buffer2/source ncursesw.rb README Message-ID: <200502261739.j1QHdLdS013536@rubyforge.org> Update of /var/cvs/aeditor/projects/experimental/buffer2/source In directory rubyforge.org:/tmp/cvs-serv13523 Modified Files: ncursesw.rb README Log Message: added check for if the TERM variable is set. Otherwise the Tui constructor returns false, and the log contains a message saying.. could not init. Its better to tell what the real problem is. Index: README =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/README,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** README 19 Feb 2005 15:04:57 -0000 1.17 --- README 26 Feb 2005 17:39:19 -0000 1.18 *************** *** 109,115 **** maybe you need to set the LANG envvar - prompt> setenv LANG en_DK.UTF-8 maybe you need to install a unicode font too --- 109,116 ---- maybe you need to set the LANG envvar prompt> setenv LANG en_DK.UTF-8 + maybe you need to set the TERM envvar + prompt> setenv TERM xterm-color maybe you need to install a unicode font too *************** *** 124,126 **** ! // END \ No newline at end of file --- 125,127 ---- ! // END Index: ncursesw.rb =================================================================== RCS file: /var/cvs/aeditor/projects/experimental/buffer2/source/ncursesw.rb,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** ncursesw.rb 25 Feb 2005 18:21:43 -0000 1.25 --- ncursesw.rb 26 Feb 2005 17:39:19 -0000 1.26 *************** *** 5,8 **** --- 5,14 ---- end + term = ENV['TERM'] + if term == nil or term.match(/xterm-color/) == nil + $logger.error "the TERM environment variable is not correct" + exit + end + require 'Tui.so'