Files
neovim/test/functional/legacy/043_magic_settings_spec.lua
Justin M. Keyes 7e2e3f8c25 feat(editor): undo restores cursor position #41520
Problem:
Undo places the cursor wherever the cursor happened to sit at "save
time" (`uh_cursor` is sampled lazily on the first change).
Examples:
- `i` preserves, but `a` does not
- `diw`, `atest<Esc>`, `d^` abandon the original position
- `D`, `o` restore it (by accident).

Solution:
`composite` tracks the pending atom (and its `origin`) across frames.
A `stuffed` continuation frame inherits the `origin` + prepped redo.
Store `origin` info in the undo header, so undo can restore it.

- Not for a mid-command undo break (i_CTRL-G_u).
- Undoing a mapping restores where the mapping started (which
  technically may be different than where the "edit" started).
2026-08-27 16:12:11 -04:00

64 lines
1.5 KiB
Lua

-- Tests for regexp with various magic settings.
local n = require('test.functional.testnvim')()
local t = require('test.testutil')
local describe, it, setup = t.describe, t.it, t.setup
local clear, feed, insert = n.clear, n.feed, n.insert
local feed_command, expect = n.feed_command, n.expect
describe('regexp with magic settings', function()
setup(clear)
it('is working', function()
insert([[
1 a aa abb abbccc
2 d dd dee deefff
3 g gg ghh ghhiii
4 j jj jkk jkklll
5 m mm mnn mnnooo
6 x ^aa$ x
7 (a)(b) abbaa
8 axx [ab]xx
9 foobar
]])
feed_command('/^1')
feed_command([[/a*b\{2}c\+/e]])
feed([[x/\Md\*e\{2}f\+/e<cr>]])
feed('x:set nomagic<cr>')
feed_command([[/g\*h\{2}i\+/e]])
feed([[x/\mj*k\{2}l\+/e<cr>]])
feed([[x/\vm*n{2}o+/e<cr>]])
feed([[x/\V^aa$<cr>]])
feed('x:set magic<cr>')
feed_command([[/\v(a)(b)\2\1\1/e]])
feed([[x/\V[ab]\(\[xy]\)\1<cr>]])
feed('x:$<cr>')
feed_command('set undolevels=100')
feed('dv?bar?<cr>')
-- Nvim: "k" after "u": undo restores the cursor to where "dv?bar?" started (the last line).
feed('Yukp:<cr>')
feed_command('?^1?,$yank A')
-- Put @a and clean empty line
feed_command('%d')
feed_command('0put a')
feed_command('$d')
-- Assert buffer contents.
expect([[
1 a aa abb abbcc
2 d dd dee deeff
3 g gg ghh ghhii
4 j jj jkk jkkll
5 m mm mnn mnnoo
6 x aa$ x
7 (a)(b) abba
8 axx ab]xx
9 foobar
9 foo
]])
end)
end)