packages feed

fix-imports-1.0.0: vimrc

" Example vimrc file to bind a key to fix-imports.

nm <silent> ,a :call FixImports()<cr>

" Run the contents of the current buffer through the fix-imports cmd.  Print
" any stderr output on the status line.
" Remove 'a' from cpoptions if you don't want this to mess up #.
function FixImports()
    let out = tempname()
    let err = tempname()
    let tmp = tempname()
    " Using a tmp file means I don't have to save the buffer, which the user
    " didn't ask for.
    execute 'write' tmp
    execute 'silent !fix-imports -v' expand('%') '<' tmp '>' out '2>' err
    let errs = readfile(err)
    if v:shell_error == 0
        " Don't replace the buffer if there's no change, this way I won't
        " mess up fold and undo state.
        call system('cmp -s ' . tmp . ' ' . out)
        if v:shell_error != 0
            " Is there an easier way to replace the buffer with a file?
            let old_line = line('.')
            let old_col = col('.')
            let old_total = line('$')
            %d
            execute 'silent :read' out
            0d
            let new_total = line('$')
            " If the import fix added or removed lines I need to take that
            " into account.  This will be wrong if the cursor was above the
            " import block.
            call cursor(old_line + (new_total - old_total), old_col)
            " The reload will forget fold state.  It was open, right?
            if foldclosed('.') != -1
                execute 'normal zO'
            endif
        endif
    endif
    call delete(out)
    call delete(err)
    call delete(tmp)
    redraw!
    if !empty(errs)
        echohl WarningMsg
        echo join(errs)
        echohl None
    endif
endfunction