2016-03-04 46 views
1

让我跳进去吧。Vim在标准输出上打印缓冲区名称:q

我想要做的只是在退出vim时打印出任何打开的缓冲区的文件路径。这很有用,因为我经常在vim脚本中打开其他文件,并使用我编写的可以通过我的代码库搜索特定函数调用的vim脚本。

我想我可以设置一个自动命令,无论是当我打开一个文件或当我离开vim,并使用:ls的输出来列出当前打开的所有缓冲区。我遇到的问题是我无法获得任何输出以显示在终端中。我在我的功能尝试了各种组合:!echo,但无济于事。我一直在试图像下面这样在我的.vimrc

function! PrintFileName() 
    :!echo "hello" 
    :exec "!echo world" 
    "... etc 
endfunction 
au BufRead * call PrintFileName() 

两个:!echo foobar和我:call PrintFileName()工作,如果我在命令行中做到这一点。我也想我可能不得不使用某种形式的沉默/重绘!所以我不必打进去继续。

真的,这里的主要问题是,我看不到从我的函数内部获取输出到标准输出的方式,并且被自动命令调用。

感谢您的任何帮助。

+4

我不能真的想到一个很好的方法来做到这一点,除了用包装脚本等相当丑陋的黑客...除了Vim处理标准输出,你也有Vim的终端绘图代码干扰。你想要的是在代码完成清理之后'echo' * – Carpetsmoker

+1

最简单的方法是将该缓冲区列表保存到一个文件中,然后在你的vim会话终止后'cat'该文件。但我必须承认,我没有看到任何有用的应用程序。为什么要让vim在缓冲区列表上做些什么? –

+0

@LucHermitte我经常需要在我刚刚编辑的文件上运行实用程序,并且在终端中有一个列表将非常好。当然,我可以在vim中做到这一点,但是我真的在编辑这些文件,并且在那里运行并不有用。 – mrfred

回答

0

好的,所以我找到了这个解决方案,只要我从终端的最后一行输入vim就可以工作。否则,这会在当前行下面打印出一行,并在您按Enter键时被覆盖。如果有人知道如何解决,让我知道,否则我会用这个。

function! PrintBuffers() 
    redir => files 
    :ls 
    redir END 
    " Regex to strip out everything from :ls but the buffer filenames 
    let files = substitute(files, '^[^"]*"', '', 'g') 
    let files = substitute(files, '"[^"]*\n[^"]*"', '\n', 'g') 
    let files = substitute(files, '"[^"]*$','','g') 
    " This is the magic line 
    exe '!echo; echo ' . shellescape(&t_te . files) 
endfunction 
au VimLeave * call PrintBuffers() 

*注 - 我写这篇文章,我意识到,如果你在某些时候做了:cd这不会显示在正确的道路。所以我认为它非常脆弱,但是它完成了这项工作。