On Tue, May 16, 2006 at 08:33:43AM +0200, Jiří Černý wrote:
> 
> 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)

     I have simplified the example somewhat.  I may look at it some more
later, or maybe someone else will take it from here.  Save the attached
files foo (unchanged) and format.vim (simplified) and start vim with

$ vim -u NONE +"source format.vim" foo

On the first (blank) line, start Insert mode and type

12345 
$67890 1234$ 5678
9012

letting vim do the line breaks.  Then <Esc> back to Normal mode and u to
undo:  the 9012 line is left and 'modified' is not set.

     Curiously, if I *do* add the line break myself after the first
line, the problem seems to go away.  The bug seems to surface only when
two lines have been changed by the function.

HTH                                     --Benji Fisher
==========================================
==========================================
set nocp tw=20
set laststatus=2        " so I can watch the 'modified' flag

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

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

        let numdollars = len(substitute(beforecursor, '[^$]', '', 'g'))
        let evendolars = numdollars % 2
        let dolarpos = matchend(beforecursor, '.*\$')

        if evendolars == 0 
                if dolarpos < &tw "vim can do the job
                        return 1
                endif
        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

Reply via email to