#!/usr/bin/env python # TODO: works great for moving within wrapped line, # not quite when moving from wrapped to normal and vice versa # 1. Detect line-wrap status of target line before deciding to do vertical jump or visual column shift # 2. Load the target line in addition # 3. Use the same wrap_width logic to compare visual row availability # on the target line # Basically, look at the target line, and figure out the logical column # number that corresponds to the visual column number we see right now. # ISSUE: does not work if the line has indentation # Also TODO: once this is ironed out, re-write it in Rust for le speed import sys import re session_id = sys.argv[1] line_n = int(sys.argv[2]) col = int(sys.argv[3]) width = int(sys.argv[4]) count = int(sys.argv[5]) path = sys.argv[6] direction = sys.argv[7] digits = len(str(count)) wrap_width = width - (digits + 3) line = "" with open(path, "r") as f: for n, l in enumerate(f, start=1): if n == line_n: line = l # match = re.match(r"^(\s*)", line) # if match: # indent = match.group(1) # indent_len = len(indent) # else: # indent_len = 0 # content = line[indent_len:] content = line indent_len = 0 chunks = [content[i : i + wrap_width] for i in range(0, len(content), wrap_width)] visual_row = col // wrap_width visual_col = col % wrap_width new_visual_row = visual_row + (-1 if direction == "up" else 1) if 0 <= new_visual_row < len(chunks): target_chunk = chunks[new_visual_row] new_col = min(visual_col, len(target_chunk) - 1) new_abs_col = indent_len + (new_visual_row * wrap_width + new_col) diff = abs(new_abs_col - col) key = "h" if direction == "up" else "l" print(f"{diff}{key}") else: print("j" if direction == "down" else "k")