@@ -708,14 +708,62 @@ def check_consume_key(self, key: str, character: str | None = None) -> bool:
708
708
# Otherwise we capture all printable keys
709
709
return character is not None and character .isprintable ()
710
710
711
- def _handle_syntax_tree_update (self ) -> None :
711
+ def _handle_syntax_tree_update (self , tree_ranges ) -> None :
712
712
"""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
+ )
715
722
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 )
719
767
720
768
def _handle_change_affecting_highlighting (
721
769
self ,
0 commit comments