refine(tui-v3): 行头/行尾跳转仅在首/末逻辑行触发

之前在任意逻辑行的视觉首/末行都会做"先跳行头/尾再跨行/进历史"的
两段式,中间行的两段式不直观。改成:中间逻辑行的视觉首/末行直接
做视觉上下移;只有第一逻辑行的视觉首行/最末逻辑行的视觉末行,才
触发"先跳到行头/尾,下次按键再进历史"。`_logical_visual_range`
因此变成死代码,顺手删掉。
This commit is contained in:
yanghang committed 2026-05-28 21:14:48 +08:00
1 parent b8b40880d7
commit d4777633ca
1 file changed
+10 -32
+10 -32
View File
@@ -2570,16 +2570,6 @@ class SB:
total = self.buf.count('\n') + 1
return line_no, total, ls, le
def _logical_visual_range(self, segs, line_no):
"""返回第 line_no 个逻辑行在 segs 中的 (first_vi, last_vi)"""
lines = self.buf.split('\n')
iw = max(1, _term()[0] - 6)
first = 0
for i in range(line_no):
first += max(1, len(_wrap_cells(lines[i], iw)))
cnt = max(1, len(_wrap_cells(lines[line_no], iw)))
return first, first + cnt - 1
def _cur_v(self, d: int) -> None:
"""↑/↓ roam by VISUAL row (a long single-line paste wraps to many rows
yet stays one logical line — must still roam). At the top/bottom visual
@@ -5151,20 +5141,14 @@ class SB:
self._palette_sel = max(0, self._palette_sel - 1)
else:
self._sel = None
line_no, total, ls, le = self._line_region()
segs = self._segs(max(1, _term()[0] - 6))
vi, _ = self._seg_at(segs)
first_vi, _ = self._logical_visual_range(segs, line_no)
if vi == first_vi: # 在视觉首行
if line_no == 0:
if self.pos == ls:
self._nav_hist(-1)
else:
self.pos = ls
elif self.pos == ls:
self._cur_v(-1) # 已在行首 → 正常上移
if vi == 0: # 视觉首行(必在第一逻辑行)
_, _, ls, _ = self._line_region()
if self.pos == ls:
self._nav_hist(-1)
else:
self.pos = ls # 跳到该行行首
self.pos = ls # 先跳行首,下次再进历史
else:
self._cur_v(-1)
elif o == 0x13: # Ctrl+S stash/restore draft
@@ -5175,20 +5159,14 @@ class SB:
self._palette_sel = min(n - 1, self._palette_sel + 1) if n else 0
else:
self._sel = None
line_no, total, ls, le = self._line_region()
segs = self._segs(max(1, _term()[0] - 6))
vi, _ = self._seg_at(segs)
first_vi, last_vi = self._logical_visual_range(segs, line_no)
if vi == last_vi: # 在视觉末行
if line_no == total - 1:
if self.pos == le:
self._nav_hist(1)
else:
self.pos = le
elif self.pos == le:
self._cur_v(1) # 已在行末 → 正常下移
if vi == len(segs) - 1: # 视觉末行(必在最末逻辑行)
_, _, _, le = self._line_region()
if self.pos == le:
self._nav_hist(1)
else:
self.pos = le # 跳到该行行末
self.pos = le # 先跳行尾,下次再进历史
else:
self._cur_v(1)
elif o == 0x02: # ← caret left