1

在这种情况下,我必须使用哪些关键部分才能让foo()函数将缓冲区写入磁盘(默认行为)?尤其是 vim 部分,无论是 viavim.eval()还是vim.command()其他。

au  BufWriteCmd * exec :python foo()

foo()

def foo():
    abuf = vim.eval("expand('<abuf>')"
4

1 回答 1

3
au  BufWriteCmd * :python foo()

python << EOF
import vim, os
def foo():
    abuf=int(vim.eval('expand("<abuf>")'))-1
    amatch=vim.eval('expand("<amatch>")')
    abang=bool(int(vim.eval('v:cmdbang')))
    cmdarg=vim.eval('v:cmdarg')

    if os.path.isdir(amatch):
        raise ValueError('Cannot write to directory {0}'.format(amatch))
    if not os.path.isdir(os.path.dirname(amatch)):
        raise ValueError('Directory {0} does not exist'.format(amatch))

    encoding=vim.eval('&encoding')

    opts={l[0] : l[1] if len(l)>1 else True
          for l in [s[2:].split('=')
                    for s in cmdarg.split()]}
    if 'ff' not in opts:
        opts['ff']=vim.eval('getbufvar({0}, "&fileformat")'.format(abuf))
        if not opts['ff']:
            opts['ff']='unix'
    if 'enc' not in opts:
        opts['enc']=vim.eval('getbufvar({0}, "&fileencoding")'.format(abuf))
        if not opts['enc']:
            opts['enc']=encoding
    if 'nobin' in opts:
        opts['bin']=False
    elif 'bin' not in opts:
        opts['bin']=vim.eval('getbufvar({0}, "&binary")'.format(abuf))

    if opts['bin']:
        opts['ff']='unix'
        eol=bool(int(vim.eval('getbufvar({0}, "&endofline")'.format(abuf))))
    else:
        eol=True

    eolbytes={'unix': '\n', 'dos': '\r\n', 'mac': '\r'}[opts['ff']]

    buf=vim.buffers[abuf]
    f=open(amatch, 'wb')
    first=True
    for line in buf:
        if opts['enc']!=encoding:
            # Does not handle invalid bytes.
            line=line.decode(encoding).encode(opts['enc'])
        if not first:
            f.write(eolbytes)
        else:
            first=False
        f.write(line)
    if eol:
        f.write(eolbytes)
    f.close()
EOF

使用上面的代码,您将几乎完全模拟标准:w smth行为。

于 2012-09-08T12:12:14.947 回答