On Mon, May 15, 2006 at 06:26:55PM -0400, Benji Fisher wrote:
> 
> 
> Please do post the script you use, simplified as much as possible,
> so we can test it.  I tried
> 
> :call append(line("$"), "This line brought to you by append()")
> 
> and then (in Normal mode)
> 
> u
> 
> and it worked fine.  This is with vim 7.0.
> 

Here are the scripts and the test case. It is relatively complicated,
but I did not find a simpler one. It works in vim 7.0 (Included patches:
1-17)

1. First you need the script that I wrote and a small test file. They
attached to this email. Put it into files format.vim and foo

2. vim -U NONE -u NONE foo
:set nocompatible
:source format.vim
:set tw=20 "this is not necessary, it only saves some typing

3. now go to the first line of ============, type o (open line) and
start to type something like the text below between the two lines of
=====. Do not hit <Enter>, let the vim format the text.

lajsdf lkjfd lkasjfd
alskjdf aslkjfd
;laskdjf salkjfd               <---- one needs first to 
l;askjdf ;alskjdf                   write some normal lines
;lsajdf lsakjdf
aslkjfd
$laskjdf dfsaf$ lsdk           <---- (*)
fasldkfj asdlkjf
asdflj
$laksjdf asfldkj               <---- (**)

(*) this formula is important, it was started at the previous line but
was moved by the formatting mechanism to this line
(**) this formula was also started one line above 

4. Now hit <ESC> and 'u'. I do not get back two lines of ===========. 
The last three (or two, it depends what exactly did you type) lines of
the text remain (partially with different formatting). 
Moreover, when I hit 'u' again vim says 'Already at oldest change'
It is not possible to undo to the original state.

I hope the description is good enough and the bug is reproducible. 

Regards,

        Jiri


==========================================
==========================================
if exists("b:did_my_tex_format_pluggin")
        finish
endif

let b:did_my_tex_format_pluggin = 1

setlocal formatoptions=tcqr 
setlocal formatexpr=MyTeXFormat(v:lnum,v:count)


fun! MyTeXFormat(lnum,count)
        if &tw < 10 "let the vim do the job if tw is to small
                return 1
        endif
        if mode()=="i"
                return <SID>MyFormatInsert(a:lnum,a:count)
        elseif mode()=="R"
                return <SID>MyFormatReplace(a:lnum,a:count)
        else
                return <SID>MyFormatGQ(a:lnum,a:count)
        endif
endfun

fun! s:MyFormatInsert(lnum,count)       
        if a:count!=1
                echoerr "Assertion failed: count>1"
                return 1
        endif

        if col(".") < &tw
                return 0
        endif

        let line = getline(a:lnum)
        let curlineindent = indent(a:lnum)
        let aftercursor = line[col(".")-1:]
        let beforecursor = line[:col(".")-2]

        let dolarpos = <SID>FindDolar(beforecursor,0)
        if dolarpos == -1 "no dolars, vim do the job
                return 1
        endif

        let evendolars = 0
        let newpos = dolarpos
        while newpos != -1 "count dollars find the last one 
                let olddolarpos = dolarpos
                let dolarpos = newpos
                let evendolars =  1 -  evendolars   
                let newpos = <SID>FindDolar(beforecursor,dolarpos + 1)
        endwhile

        if evendolars == 0 
                if dolarpos < &tw "vim can do the job
                        return 1
                elseif olddolarpos > curlineindent      
                        let dolarpos = olddolarpos "break at the start of the 
formula
                else 
                        call append(a:lnum,"XX") 
                        let newline =   aftercursor
                        call setline(a:lnum+1,newline)
                        call cursor(a:lnum+1,1)
                        return 0
                endif
        endif

        if beforecursor[dolarpos-1]=='$' "double dollars
                let dolarpos = dolarpos - 1
        endif

        if beforecursor[dolarpos-1] != ' ' "no space before $
                let dolarpos = strridx(beforecursor,' ',dolarpos-1)
                let dolarpos = dolarpos + 1
        endif
        if dolarpos != curlineindent "formula does not start at first char
                call setline(a:lnum,strpart(beforecursor,0,dolarpos))
                call append(a:lnum,"XX")
                let newline =  strpart(beforecursor,dolarpos) . aftercursor
                call setline(a:lnum+1,newline)
                call cursor(a:lnum+1,strlen(beforecursor)-dolarpos+1)
                return 0
        endif
        return 0
endfun

fun! s:MyFormatReplace(lnum,count)
        "FIXME make something useful
        "I never use replace mode
        return 1
endfun

fun! s:MyFormatGQ(lnum,count)
        "probably useles, vim does not know about ''latex type paragraphs''
        return 1
endfun

fun! s:FindDolar(s, pos)
        let i = match(a:s,'\%(^\|[^\\]\)\$',a:pos)
        if i == -1 
                return -1
        endif
        if a:s[i] != '$'
                let i = i + 1
        endif
        if a:s[i+1] == '$'
                let i = i + 1
        endif
        return i
endfun

Reply via email to