CleanCocoa / CleanCocoa/DeclarativeTextKit
Command block that restores scroll offsets and selection like Emac Lisp save-excursion
- 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:

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