CleanCocoa / CleanCocoa/DeclarativeTextKit

Command block that restores scroll offsets and selection like Emac Lisp save-excursion

Open
#4 1 comment 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
Swift
Stars
50
Forks
0
PR merge metrics
No merged PRs in 30d

Description

> Note: This may not be needed in practice at all. We have to test this.

-------------

One feature that Emacs Lisp provides is to jump around in a buffer and read and write text, then restore the context exactly as it was before so that the user doesn't perceive anything. This is called `save-excursion`.

```swift
// Imagine we're in the middle of a long document here, like
// line 500 of 1000.

SaveExcursion {
Select(LineRange(at: 0)) {
// ... do stuff on the first line ...
}
Select(LineRange(at: buffer.endLocation)) {
// ... do stuff on the last line line ...
}
}

// At this point, we're at line 500 again and the scroll offset is the same as before
```

Unlike our `Buffer.character(at:)`, Emacs buffers can't access substrings without moving them into view. There, the buffer is the model, and moving the reading head also moves the scrolled viewport.

`NSTextView` can show similar behavior when you change characters in one place and attributes in a larger place and the effective range is enlargened; then the `NSTextStorage.processEditing()` run will move the insertion point:

![example](https://github.com/CleanCocoa/DeclarativeTextKit/assets/59080/3f19b40b-c1dd-49c7-8276-a1ccb6a3c328)
Source and fix:

`UITextView` doesn't have this problem.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by testing whether this behavior is needed, then inspect Buffer.character(at:) and the NSTextStorage.processEditing() behavior described in the issue. Compare the NSTextView and UITextView cases before choosing an implementation approach. Done would mean a command can perform buffer mutations while restoring the prior selection and scroll offset when the behavior is required.

Written by the indexing model from the issue text.

Assessment

Tech stack
swift
Domain
desktop-dev
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.