refine(tui-v3): 行头/行尾跳转仅在首/末逻辑行触发
之前在任意逻辑行的视觉首/末行都会做"先跳行头/尾再跨行/进历史"的 两段式,中间行的两段式不直观。改成:中间逻辑行的视觉首/末行直接 做视觉上下移;只有第一逻辑行的视觉首行/最末逻辑行的视觉末行,才 触发"先跳到行头/尾,下次按键再进历史"。`_logical_visual_range` 因此变成死代码,顺手删掉。
This commit is contained in:
1 parent
b8b40880d7
commit
d4777633ca
1 file changed
+10
-32
+10
-32
@@ -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
|
||||
|
||||
Reference in new issue
Block a user