@@ -416,7 +416,21 @@ def do_realize(self):
416416 gtk .TextView .do_realize (self )
417417 self .prompt (False )
418418
419- def highlight (self ):
419+ def highlight (self , start_iter , tokens ):
420+ """
421+ Highlight the text starting at `start_iter` using `tokens`.
422+ """
423+ token_start_iter = start_iter .copy ()
424+ token_end_iter = start_iter .copy ()
425+ for (token , value ) in tokens :
426+ while token not in theme_map :
427+ token = token .parent
428+ token_end_iter .forward_chars (len (value ))
429+ self .text_buffer .apply_tag_by_name (theme_map [token ],
430+ token_start_iter , token_end_iter )
431+ token_start_iter .forward_chars (len (value ))
432+
433+ def highlight_current_line (self ):
420434 """
421435 Highlight the current line.
422436 """
@@ -425,9 +439,9 @@ def highlight(self):
425439 self .reprint_line (* self .highlighted_paren )
426440 self .highlighted_paren = None
427441
428- offset = self .get_cursor_iter (). get_offset ()
429- self .change_line ( self .current_line ())
430- self .place_cursor ( self .text_buffer . get_iter_at_offset ( offset ))
442+ start = self .get_line_start_iter ()
443+ self .text_buffer . remove_all_tags ( start , self .get_line_end_iter ())
444+ self .highlight ( start , self .tokenize ( self . current_line () ))
431445
432446 def insert_highlighted (self , iter_ , string ):
433447 offset = iter_ .get_offset ()
@@ -471,7 +485,7 @@ def on_buf_delete_range(self, buffer, start, end):
471485 start = line_start
472486 with self .editing :
473487 buffer .delete (start , end )
474- self .highlight ()
488+ self .highlight_current_line ()
475489 self .complete ()
476490
477491 def on_buf_insert_text (self , buffer , iter_ , text , length ):
@@ -486,7 +500,7 @@ def on_buf_insert_text(self, buffer, iter_, text, length):
486500 with self .editing :
487501 buffer .insert (iter_ , line )
488502 iter_ = self .move_cursor (len (line ))
489- self .highlight ()
503+ self .highlight_current_line ()
490504 self .complete ()
491505
492506 def on_buf_mark_set (self , buffer , iter_ , textmark ):
@@ -537,7 +551,7 @@ def push_line(self):
537551 with self .editing :
538552 self .text_buffer .insert (iter_ , '\n ' )
539553 self .move_cursor (1 )
540- self .highlight ()
554+ self .highlight_current_line ()
541555 return self .push (line + '\n ' )
542556
543557 def reprint_line (self , lineno , tokens ):
@@ -552,10 +566,8 @@ def reprint_line(self, lineno, tokens):
552566 start = self .text_buffer .get_iter_at_mark (mark )
553567 end = start .copy ()
554568 end .forward_to_line_end ()
555- with self .editing :
556- self .text_buffer .delete (start , end )
557- start = self .text_buffer .get_iter_at_mark (mark )
558- self .insert_highlighted_tokens (start , tokens )
569+ self .text_buffer .remove_all_tags (start , end )
570+ self .highlight (start , tokens )
559571
560572 def writetb (self , lines ):
561573 string = '' .join (lines )
0 commit comments