@@ -707,14 +707,62 @@ def check_consume_key(self, key: str, character: str | None = None) -> bool:
707707 # Otherwise we capture all printable keys
708708 return character is not None and character .isprintable ()
709709
710- def _handle_syntax_tree_update (self ) -> None :
710+ def _handle_syntax_tree_update (self , tree_ranges ) -> None :
711711 """Reflect changes to the syntax tree."""
712- if self ._highlight_query :
713- self ._highlights .reset ()
712+ if not self ._highlight_query :
713+ return
714+
715+ self ._highlights .reset ()
716+
717+ _ , first_line_index = self .scroll_offset
718+ visible_line_range = range (
719+ first_line_index , first_line_index + self .size .height
720+ )
714721
715- # TODO: This feels heavy handed.
716- _ , scroll_offset_y = self .scroll_offset
717- self .refresh (Region (0 , scroll_offset_y , self .size .width , self .size .height ))
722+ visible_region = self .window_region
723+ regions = []
724+ full_width = self .size .width
725+
726+ for tree_range in tree_ranges :
727+ start_row = tree_range .start_point .row
728+ end_row = tree_range .end_point .row
729+ if not (start_row in visible_line_range or end_row in visible_line_range ):
730+ continue
731+
732+ start_column = tree_range .start_point .column
733+ end_column = tree_range .end_point .column
734+
735+ if start_row == end_row :
736+ width = end_column = start_column
737+ tree_region = Region (start_column , start_row , width , 1 )
738+ region = tree_region .intersection (visible_region )
739+ if region .area > 0 :
740+ regions .append (region )
741+
742+ else :
743+ # Add region for the first changed line.
744+ width = full_width - start_column
745+ tree_region = Region (start_column , start_row , width , 1 )
746+ region = tree_region .intersection (visible_region )
747+ if region .area > 0 :
748+ regions .append (region )
749+
750+ # Add region for the last changed line.
751+ tree_region = Region (0 , end_row , end_column , 1 )
752+ region = tree_region .intersection (visible_region )
753+ if region .area > 0 :
754+ regions .append (region )
755+
756+ # Add region for the other lines.
757+ height = end_row - start_row - 1
758+ if height > 0 :
759+ tree_region = Region (0 , start_row + 1 , width , height )
760+ region = tree_region .intersection (visible_region )
761+ if region .area > 0 :
762+ regions .append (region )
763+
764+ if regions :
765+ self .refresh (* regions )
718766
719767 def _handle_change_affecting_highlighting (
720768 self ,
0 commit comments