Skip to content

Commit 1b91b65

Browse files
committed
Just apply tags for highlighting in gtk, don't reprint the line.
1 parent 9a58db4 commit 1b91b65

File tree

1 file changed

+23
-11
lines changed

1 file changed

+23
-11
lines changed

bpython/gtk_.py

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)