diff options
author | Justin Bedo <cu@cua0.org> | 2024-11-01 08:18:16 +1100 |
---|---|---|
committer | Justin Bedo <cu@cua0.org> | 2024-11-01 08:18:35 +1100 |
commit | 3d2bc90a09614223414a1e036ff2822d92f256c9 (patch) | |
tree | 3e6e2a64a04d6dd5c9dee6a65961815925020d84 | |
parent | 4da12b53ddb999d6fa4200451a335a1cf1f42547 (diff) |
unify buffer editing through delins and fix ptycursor movement
-rw-r--r-- | jterm.hs | 50 |
1 files changed, 29 insertions, 21 deletions
@@ -344,13 +344,13 @@ handleEvent display win bgcolour fgcolour linecolour selcolour font event = do case (mod, keysym) of (4, 117) -> -- ctrl-u (delete content before cursor) - delins' 0 start "" + delins 0 start "" (4, 105) -> -- ctrl-i (delete content after cursor) - delins' end (R.length (content b)) "" + delins end (R.length (content b)) "" (4, 108) -> -- ctrl-l (restrip buffer of ansi codes) - delins' 0 (R.length (content b)) (content b & R.toText & stripAnsiEscapeCodes & R.fromText) + delins 0 (R.length (content b)) (content b & R.toText & stripAnsiEscapeCodes & R.fromText) (4, 99) -> lift $ do -- ctrl-c (copy) storeBuffer display (R.toText selstr & T.unpack) 0 @@ -359,7 +359,7 @@ handleEvent display win bgcolour fgcolour linecolour selcolour font event = do (4, 120) -> do -- ctrl-x (cut) lift $ storeBuffer display (R.toText selstr & T.unpack) 0 - delins' start end "" + delins start end "" (4, 118) -> lift $ do -- ctrl-v (paste) prop <- internAtom display "JTERM_CLIPBOARD" True @@ -401,23 +401,20 @@ handleEvent display win bgcolour fgcolour linecolour selcolour font event = do scrolldown ((681 * pageheight) `div` 1000) (_, 65288) -> do -- backspace - delins' (start - 1) end "" + delins (start - 1) end "" _ -> when (toAppend /= "") $ do - delins' start end toAppend - when (toAppend == "\n" && start >= ptycursor b) $ sendline + delins start end toAppend + when (toAppend == "\n" && start == R.length (content b)) $ sendline redraw T toAppend -> do - let c = content b <> R.fromText expandedTabs - pos = R.length c - noesc = stripAnsiEscapeCodes toAppend + let noesc = stripAnsiEscapeCodes toAppend expandedTabs = T.intercalate "\n" $ map expandTabs $ T.splitOn "\n" noesc - put $ b {content = c, ptycursor = pos} - when (start == R.length (content b)) $ modify $ \b -> b {cursor = (pos, pos)} + delins' True (ptycursor b) (ptycursor b) $ R.fromText expandedTabs redraw Notify -> do prop <- lift $ internAtom display "JTERM_CLIPBOARD" False Just (R.fromText . T.pack . map castCCharToChar -> str) <- lift $ getWindowProperty8 display prop win - delins' start end str + delins start end str redraw Expose -> redraw Selection e -> lift $ allocaXEvent $ \ev -> do @@ -437,6 +434,7 @@ handleEvent display win bgcolour fgcolour linecolour selcolour font event = do sendline = do b <- get let cmd = between (ptycursor b) (R.length $ content b) (content b) + put $ b {ptycursor = R.length (content b)} lift $ send b $ cmd sendCommand b c = do @@ -449,18 +447,28 @@ handleEvent display win bgcolour fgcolour linecolour selcolour font event = do between s e rp = R.splitAt e rp & fst & R.splitAt s & snd - delins' s e ins = do + delins = delins' False + + delins' movepty s e ins = do b <- get let l = R.length ins - delta = p + l + s - e p = ptycursor b - put $ b {content = delins s e (content b) ins, cursor = (s + l, s + l), ptycursor = if e < p then delta else if s < p then s else p} + p' = if e < p then p + l + s - e + else if s < p then s + else p + (cs, ce) = cursor b + c' = if cs <= e && ce > e then (s + l, ce) + else if cs < s && ce >= s then (cs, s) + else if cs >= s && ce <= e then (s + l, s + l) + else if ce < s then (cs, ce) + else (cs + l + s - e, ce + l + s - e) + put $ b {content = doedit s e (content b) ins, cursor = c', ptycursor = if movepty then s + l else p'} - delins :: Word -> Word -> Rope -> Rope -> Rope - delins s e rp ins = - let (before, _) = R.splitAt s rp - (_, after) = R.splitAt e rp - in before <> ins <> after + where + doedit s e rp ins = + let (before, _) = R.splitAt s rp + (_, after) = R.splitAt e rp + in before <> ins <> after xy2lc :: Word -> Word -> IO (Word, Word) xy2lc x y = do |