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