如何在保存Vim后自动评估脚本并将结果放入现有窗口?

时间:2012-02-22 04:10:42

标签: vim

我理想的情况是将Vim拆分为两个窗口 - 首先包含我正在处理的脚本(python),另一个显示评估该脚本的结果。这就是我到目前为止所做的:

:autocmd BufWritePost *.py redir @p | execute 'silent w !python -' | redir END

保存脚本时,脚本的内容通过管道输出到python命令,该命令的输出存储在寄存器p中。将p放入另一个窗口中显示的新/空缓冲区的最佳方法是什么?

我尝试过的一些事情是blast | normal! "pp | bfirst(blast:new / empty buffer,bfirst:包含python脚本的缓冲区)但这似乎让我处于“输出”缓冲区中,无论出于什么原因我都会失去语法高亮显示需要在缓冲区之间来回切换以恢复它。我真的想这样做,并避免生成一个临时转储文件,我管道运行脚本的输出,并宁愿避免使用任何其他外部工具来“观察”python脚本文件,并在它更改时执行某些操作

1 个答案:

答案 0 :(得分:3)

我的方法是使用预览窗口。这使您可以随时移动到正确的窗口,无论您有多少窗口。它还允许您“忽略”当您想要退出vim时预览窗口打开的事实(例如,您可以:q而不是:qa。)

autocmd BufWritePost *.py call OutputWindow("python")
autocmd BufWritePost *.rb call OutputWindow("ruby")

function OutputWindow(executable)
    let filename=expand('%:p')

    " move to preview window and create one if it doesn't
    " yet exist
    silent! wincmd P
    if ! &previewwindow
        " use 'new' instead of 'vnew' for a horizontal split
        vnew
        set previewwindow
    endif

    execute "%d|silent 0r!" . a:executable . " " . filename
    wincmd p
endfunction

可能有一种不那么冗长的方式来实现这一目标,但它看起来效果很好。