Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7622f38c6 | ||
|
|
e474396790 | ||
|
|
e6a0353650 | ||
|
|
e0a59e3f9c | ||
|
|
787dc0d18f | ||
|
|
fd9393c8b1 | ||
|
|
eb26d93e03 | ||
|
|
055d738142 |
@@ -33,14 +33,17 @@ class ColorManager(NamedTuple):
|
||||
return self.raw_color_pair(fg_i, bg_i)
|
||||
|
||||
def raw_color_pair(self, fg: int, bg: int) -> int:
|
||||
try:
|
||||
return self.raw_pairs[(fg, bg)]
|
||||
except KeyError:
|
||||
pass
|
||||
if curses.COLORS > 0:
|
||||
try:
|
||||
return self.raw_pairs[(fg, bg)]
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
n = self.raw_pairs[(fg, bg)] = len(self.raw_pairs) + 1
|
||||
curses.init_pair(n, fg, bg)
|
||||
return n
|
||||
n = self.raw_pairs[(fg, bg)] = len(self.raw_pairs) + 1
|
||||
curses.init_pair(n, fg, bg)
|
||||
return n
|
||||
else:
|
||||
return 0
|
||||
|
||||
@classmethod
|
||||
def make(cls) -> 'ColorManager':
|
||||
|
||||
@@ -681,13 +681,18 @@ class File:
|
||||
rest_offset = ws_len + len(prefix)
|
||||
if line.startswith(prefix, ws_len):
|
||||
self.buf[lineno] = f'{ws_match[0]}{line[rest_offset:].lstrip()}'
|
||||
if self.buf.y == lineno and self.buf.x > ws_len:
|
||||
self.buf.x -= len(line) - len(self.buf[lineno])
|
||||
|
||||
def _comment_add(self, lineno: int, prefix: str) -> None:
|
||||
prefix = f'{prefix} '
|
||||
line = self.buf[lineno]
|
||||
ws_match = WS_RE.match(line)
|
||||
assert ws_match is not None
|
||||
ws_len = len(ws_match[0])
|
||||
self.buf[lineno] = f'{ws_match[0]}{prefix} {line[ws_len:]}'
|
||||
self.buf[lineno] = f'{ws_match[0]}{prefix}{line[ws_len:]}'
|
||||
if lineno == self.buf.y and self.buf.x > ws_len:
|
||||
self.buf.x += len(prefix)
|
||||
|
||||
@edit_action('comment', final=True)
|
||||
def toggle_comment(self, prefix: str) -> None:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[metadata]
|
||||
name = babi
|
||||
version = 0.0.14
|
||||
version = 0.0.16
|
||||
description = a text editor
|
||||
long_description = file: README.md
|
||||
long_description_content_type = text/markdown
|
||||
|
||||
@@ -73,3 +73,42 @@ def test_comment_with_trailing_whitespace(run, ten_lines):
|
||||
h.press_and_enter(':comment // ')
|
||||
|
||||
h.await_text('// line_0\nline_1\n')
|
||||
|
||||
|
||||
def test_comment_cursor_at_end_of_line(run, ten_lines):
|
||||
with run(str(ten_lines)) as h, and_exit(h):
|
||||
h.press('# ')
|
||||
h.press('End')
|
||||
h.await_cursor_position(x=8, y=1)
|
||||
|
||||
trigger_command_mode(h)
|
||||
h.press_and_enter(':comment')
|
||||
|
||||
h.await_cursor_position(x=6, y=1)
|
||||
|
||||
|
||||
def test_add_comment_moves_cursor(run, ten_lines):
|
||||
with run(str(ten_lines)) as h, and_exit(h):
|
||||
h.press('End')
|
||||
|
||||
h.await_cursor_position(x=6, y=1)
|
||||
|
||||
trigger_command_mode(h)
|
||||
h.press_and_enter(':comment')
|
||||
|
||||
h.await_cursor_position(x=8, y=1)
|
||||
|
||||
|
||||
def test_do_not_move_if_cursor_before_comment(run, tmpdir):
|
||||
f = tmpdir.join('f')
|
||||
f.write('\t\tfoo')
|
||||
|
||||
with run(str(f)) as h, and_exit(h):
|
||||
h.press('Right')
|
||||
|
||||
h.await_cursor_position(x=4, y=1)
|
||||
|
||||
trigger_command_mode(h)
|
||||
h.press_and_enter(':comment')
|
||||
|
||||
h.await_cursor_position(x=4, y=1)
|
||||
|
||||
@@ -303,6 +303,7 @@ class DeferredRunner:
|
||||
self.color_pairs = {0: (7, 0)}
|
||||
self.screen = Screen(width, height)
|
||||
self._n_colors, self._can_change_color = {
|
||||
'xterm-mono': (0, False),
|
||||
'screen': (8, False),
|
||||
'screen-256color': (256, False),
|
||||
'xterm-256color': (256, True),
|
||||
|
||||
@@ -153,3 +153,8 @@ def test_syntax_highlighting_tabs_after_line_creation(run, tmpdir):
|
||||
h.press('Enter')
|
||||
|
||||
h.await_text('foo\n x\nx\ny\n')
|
||||
|
||||
|
||||
def test_does_not_crash_with_no_color_support(run):
|
||||
with run(term='xterm-mono') as h, and_exit(h):
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user