Mercurial > vim
view runtime/indent/testdir/vim.ok @ 31406:627d4f236ac8 v9.0.1036
patch 9.0.1036: undo misbehaves when writing from an insert mode mapping
Commit: https://github.com/vim/vim/commit/3f8f82772313af9f2417b06651f30988b63e1c96
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Dec 8 21:49:35 2022 +0000
patch 9.0.1036: undo misbehaves when writing from an insert mode mapping
Problem: Undo misbehaves when writing from an insert mode mapping.
Solution: Sync undo when writing. (closes https://github.com/vim/vim/issues/11674)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 08 Dec 2022 23:00:03 +0100 |
parents | 3295247d97a5 |
children | cc751d944b7e |
line wrap: on
line source
" vim: set ft=vim sw=4 : " START_INDENT func Some() let x = 1 endfunc let cmd = \ 'some ' \ 'string' if 1 let x = [ \ ] endif for x in [ {key: 'value'}, ] eval 0 endfor let t = [ \ { \ 'k': 'val', \ }, \ ] def Func() var d = dd ->extend({ }) eval 0 enddef " END_INDENT " START_INDENT " INDENT_EXE let g:vim_indent_cont = 6 let cmd = \ 'some ' \ 'string' " END_INDENT " START_INDENT " INDENT_EXE let g:vim_indent_cont = 5 let list = [ \ 'one', \ 'two'] " END_INDENT " START_INDENT " INDENT_EXE unlet g:vim_indent_cont let list = [ 'one', 'two', ] echo " END_INDENT " START_INDENT " INDENT_AT this-line func Some() let f = x " this-line endfunc " END_INDENT " START_INDENT " INDENT_NEXT next-line func Some() " next-line let f = x endfunc " END_INDENT " START_INDENT " INDENT_PREV prev-line func Some() let f = x " prev-line endfunc " END_INDENT " START_INDENT let a =<< END nothing END " END_INDENT " START_INDENT let a =<< trim END nothing END " END_INDENT " START_INDENT " INDENT_AT this-line let a=<< trim END blah blah blah this-line END " END_INDENT " START_INDENT if v:true echo 0 end " END_INDENT " START_INDENT var result = Func( arg1, arg2 ) " END_INDENT " START_INDENT var result = Func(arg1, arg2) " END_INDENT " START_INDENT filter(list, (k, v) => v > 0) " END_INDENT " START_INDENT filter(list, (k, v) => { const x = get(list, k, 0) return x > 0 }) " END_INDENT " START_INDENT if x > 0 filter(list, (k, v) => { const x = get(list, k, 1) return x > 0 }) endif " END_INDENT " START_INDENT { var temp = 'temp' } " END_INDENT " START_INDENT var text = lead .. middle .. end " END_INDENT " START_INDENT var text = lead .. middle .. end " END_INDENT " START_INDENT var total = start + end - correction " END_INDENT " START_INDENT var result = start :+ print " END_INDENT " START_INDENT var result = positive ? PosFunc(arg) : NegFunc(arg) " END_INDENT " START_INDENT var result = GetBuilder() ->BuilderSetWidth(333) ->BuilderSetHeight(777) ->BuilderBuild() " END_INDENT " START_INDENT var result = MyDict .member " END_INDENT " START_INDENT autocmd BufNewFile *.match if condition | echo 'match' | endif " END_INDENT " START_INDENT set cpo+=C var lines =<< trim END | this works END set cpo-=C " END_INDENT " START_INDENT syn region Text \ start='foo' #\ comment \ end='bar' " END_INDENT " START_INDENT au CursorHold * echom 'BEFORE bar' #\ some comment | echom 'AFTER bar' " END_INDENT " START_INDENT def MyFunc(text: string, separator = '-' ): string enddef " END_INDENT " START_INDENT def MyFunc( text: string, separator = '-' ): string enddef " END_INDENT " START_INDENT [var1, var2] = Func() " END_INDENT " START_INDENT const list = ['one', 'two'] " END_INDENT " START_INDENT const list = [ 'one', 'two', ] " END_INDENT " START_INDENT const dict = {one: 1, two: 2 } " END_INDENT " START_INDENT const dict = { one: 1, two: 2 } " END_INDENT " START_INDENT if true const dict = { one: 1, two: 2 } endif " END_INDENT " START_INDENT def Func() return { one: 1 } enddef " END_INDENT " START_INDENT echo { a: 0, # b # c } " END_INDENT " START_INDENT echo search( # comment '1' .. '2' ) " END_INDENT " START_INDENT if true var v = ( # trailing "(" starts line continuation 3 + 4 # nothing special ) # end of expression indicates continued line var x: number # needs to align with previous "var" endif " END_INDENT " START_INDENT def Func() # {{{ # comment if true return endif enddef " END_INDENT " START_INDENT echo { key: 'value', } " END_INDENT " START_INDENT var id = time ->timer_start((_) => { n = 0 }) " END_INDENT " START_INDENT augroup Name autocmd! augroup END " END_INDENT " START_INDENT var n = # comment 1 + 2 var s = '' " END_INDENT " START_INDENT var keys = { J: 'j', "\<Home>": '1G', "\<End>": 'G', z: 'zz' } " END_INDENT " START_INDENT export def Func( n: number, s: string, ...l: list<bool> ) enddef " END_INDENT " START_INDENT var heredoc =<< trim ENDD var nested_heredoc =<< trim END END ENDD " END_INDENT " START_INDENT if true else " comment endif " END_INDENT " START_INDENT if true | echo 'one' | endif if true | echo 'two' | endif if true | echo 'three' | endif " END_INDENT " START_INDENT if true :'<-1 mark < else echo '' endif " END_INDENT " START_INDENT substitute/pat /rep / echo " END_INDENT " START_INDENT try echo 1 catch /pat / # comment echo 2 endtry " END_INDENT " START_INDENT def Func() Cmd % enddef " END_INDENT " START_INDENT if end == 'xxx' || end == 'yyy' echo endif " END_INDENT " START_INDENT if true popup_move(id, {col: 1, line: 2}) endif setwinvar(id, 'name', 3) " END_INDENT " START_INDENT var d = [ {a: 'x', b: 'y'}, FuncA(), FuncB(), ] " END_INDENT " START_INDENT var ll = [[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]] " END_INDENT " START_INDENT var ld = [{ a: 'xxx', b: 'yyy'}, { c: 'xxx', d: 'yyy'}, { e: 'xxx', f: 'yyy'}, { }] " END_INDENT " START_INDENT var d = { a: { b: { c: [{ d: 'e', f: 'g', h: 'i' }], j: 'k', }, }, } " END_INDENT " START_INDENT if true var end: any if true end = 0 elseif true echo endif endif " END_INDENT " START_INDENT nunmap <buffer> ( nunmap <buffer> ) inoremap [ { inoremap ] } silent! xunmap i{ silent! xunmap a{ " END_INDENT " START_INDENT def Func( s: string, n = 1, m = 2 ) enddef " END_INDENT " START_INDENT var h =<< END text END def Func() echo enddef " END_INDENT " START_INDENT def Func() var h =<< END text END echo 'test' enddef " END_INDENT " START_INDENT def Foo() lcd - enddef def Bar() echo enddef " END_INDENT " START_INDENT if true n = Func(1, 2, 3) endif " END_INDENT " START_INDENT def Func(s: string, n: number): bool if true return false endif enddef " END_INDENT " START_INDENT def Func( n: number) # echo enddef " END_INDENT " START_INDENT " INDENT_AT this-line def Func( n: number) # echo # this-line enddef " END_INDENT " START_INDENT if true if true normal! == endif endif " END_INDENT " START_INDENT var d = { a: () => true, b: () => true && true && Foo(), c: () => Bar(), e: () => Baz(), } " END_INDENT " START_INDENT def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any)) return (Emit: func(any)) => { Cont((t: any) => { if Pred(t) Emit(t) endif }) } enddef " END_INDENT " START_INDENT " INDENT_EXE let g:vim_indent = {'more_in_bracket_block': v:true} def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any)) return (Emit: func(any)) => { Cont((t: any) => { if Pred(t) Emit(t) endif }) } enddef " END_INDENT " START_INDENT " INDENT_EXE unlet! g:vim_indent " END_INDENT " START_INDENT g:lightline = { 'active': { 'left': [ [ 'mode', 'paste' ], [ 'readonly', 'relativepath', 'modified' ] ], }, 'inactive': { 'left': [ [ 'readonly', 'relativepath', 'modified' ] ], } } " END_INDENT " START_INDENT if getline(1, 10) ->map((_, v: string): number => strcharlen(v)) ->max() > 1'000 &l:breakindent = false &l:linebreak = false else &l:breakindent = true &l:linebreak = true endif " END_INDENT " START_INDENT var ext2cmd: dict<string> = { doc: $'antiword {fname}', docx: $'pandoc --from=docx --to=markdown {fname}', epub: $'pandoc --from=epub --to=markdown {fname}', odp: $'odt2txt {fname}', odt: $'odt2txt {fname}', pdf: $'pdftotext -nopgbrk -layout -q -eol unix {fname} -', rtf: 'unrtf --text', } " END_INDENT " START_INDENT const ptybuf: number = term_start(&shell, { hidden: true, exit_cb: (_, _) => { if true close else help endif } }) " END_INDENT " START_INDENT var d = { a: 0, # a ' quote {{{ #}}} b: 0, } " END_INDENT " START_INDENT echo printf('%s () %s', 1, 2 ) " END_INDENT " START_INDENT prop_add(1, col('.'), { length: 2, type: 'test' }) " END_INDENT " START_INDENT echo (() => " string starting with space")() echo " END_INDENT " START_INDENT var variables = deepcopy(g:) ->filter((k: string, _): bool => k =~ '\c\V' .. keyword->escape('\') && k !~ '\%(loaded\|did_plugin_\)') ->items() ->map((_, v): string => v[0] .. ' = ' .. string(v[1])) new " END_INDENT " START_INDENT var d = freq ->map((_, v) => v * ( 1 + 2 )) for item in d ->items() ->sort((a, b) => b[1] - a[1]) echo endfor " END_INDENT " START_INDENT make_job = job_start([&shell, &shellcmdflag, make_cmd], { callback: function(MakeProcessOutput, [qfid]), close_cb: function(MakeCloseCb, [qfid]), exit_cb: MakeCompleted, in_io: 'null' }) " END_INDENT " START_INDENT var matching_abbrev: list<dict<string>> = copy(ABBREV) ->filter((_, v: dict<string>): bool => stridx(v.lhs, word_to_complete) == 0) ->map((_, v: dict<string>) => ({ word: v.lhs, menu: AbbrevRhs(v.rhs)->stridx('expand_') >= 0 ? AbbrevRhs(v.rhs)->matchstr('.*,\s*''\zs.*\ze'')') : AbbrevRhs(v.rhs) })) " END_INDENT " START_INDENT def Func() if true vimgrep /^\C\s*\%(fu\%[nction]\|def\)\s\+/ file endif enddef " END_INDENT " START_INDENT setlocal iskeyword+=[ cword = expand('<cword>') " END_INDENT " START_INDENT silent if true echo endif " END_INDENT " START_INDENT def Func() sort :^.*[\/]: enddef " END_INDENT " START_INDENT def Func() d = { } hd =<< trim END [' ]' END enddef " END_INDENT " START_INDENT def Func() if true var hd =<< trim END if get(b:, 'current_syntax', '') endif END elseif true echo endif enddef " END_INDENT " START_INDENT # test for control-flow keyword followed by commented fold marker {{{ if true echo endif #}}} " END_INDENT " START_INDENT if winsz == 0|let winsz= ""|endif exe "noswapfile ".winsz."wincmd s" " END_INDENT " START_INDENT if true if true windo if true | echo | endif augroup Name autocmd WinLeave * if true | eval 1 + 2 | endif augroup END endif endif " END_INDENT " START_INDENT if true echo ' =<< trim END' ->len() endif " END_INDENT " START_INDENT function Func() if true if true if true | echo com | endif if true | echo com | endif endif else endif endfunction " END_INDENT " START_INDENT function Func() if v:true + echo - endif endfunction " END_INDENT " START_INDENT var matchpairs: string = &matchpairs var pairs: dict<list<string>> for [opening: string, closing: string] in matchpairs ->split(',') ->map((_, v: string): list<string> => split(v, ':')) pairs[opening] = [escape(opening, '[]'), escape(closing, '[]'), 'nW', 'w$'] pairs[closing] = [escape(opening, '[]'), escape(closing, '[]'), 'bnW', 'w0'] endfor " END_INDENT " START_INDENT { echo [] + [] + [{a: 1, b: 2}] } " END_INDENT " START_INDENT silent! argdel * edit file " END_INDENT " START_INDENT def Foo() Bar(1, []->filter((_, v) => { return true }), () => { echo }) enddef " END_INDENT " START_INDENT echo { k: () => { if true echo popup_setoptions(id, {title: 'title'}) endif } } " END_INDENT " START_INDENT if true elseif endif " END_INDENT