在这种情况下,我必须使用哪些关键部分才能让foo()
函数将缓冲区写入磁盘(默认行为)?尤其是 vim 部分,无论是 viavim.eval()
还是vim.command()
其他。
au BufWriteCmd * exec :python foo()
foo()
:
def foo():
abuf = vim.eval("expand('<abuf>')"
在这种情况下,我必须使用哪些关键部分才能让foo()
函数将缓冲区写入磁盘(默认行为)?尤其是 vim 部分,无论是 viavim.eval()
还是vim.command()
其他。
au BufWriteCmd * exec :python foo()
foo()
:
def foo():
abuf = vim.eval("expand('<abuf>')"
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
行为。