2012-11-18 75 views
0

如何访问Vim中修改缓冲区的内容?在Vim中读取修改缓冲区的内容

例如,如果我想的内容串联到一个临时文件,如:(?这是正确的)

:! cat % > /tmp/modified.txt 

但是,这给我的文件上次保存的内容。我希望避免之前保存文件,因为此交互是意味着允许进行一些分析而不先保存缓冲区。

看来,Python扩展为Vim允许你做这样的事情:

def buffer_contents(buffer=vim.current.buffer): 
    contents = buffer[:] 

但我不能找到相同的功能的任何VimL引用。

编辑:看来我可以这样做:

:let buffer_contents = join(getline(1, '$'), '$') 

在这一点上我只是不知道是否有一个内置的方法。

+0

为什么在最后一条命令中需要'join()'? 'getline(1,'$')'会给你一个缓冲区中的行列表,除此之外没有更多的内建函数。顺便说一下,不要使用'buffer = vim.current.buffer',在函数创建时,默认参数只计算一次,因此如果切换缓冲区,它将指向错误的参数。 – ZyX

+0

我只是想举一个例子,不正确的Python :)。我使用了连接,因为我不想要数组。没有人认为这应该是不方便改变。 – alfredodeza

回答

2

如果你想当前内容到临时文件追加可使用

:w! >> /tmp/modified.txt 

:w! > /tmp/modified.txt 

用于覆盖该文件(如在你的猫的例子)。将它传递给某些脚本的stdin

:w !some-script 

。想知道您的getline(1, '$')有什么问题?

+0

这个解决方案仍然保存到文件中,我在这之前询问*不*保存。我的方法没有任何问题,我只是想知道是否有一个我不知道的内建函数。 – alfredodeza

+0

@alfredodeza'w!some-script'不保存到文件中。顺便说一句,如果你可能有一个文件中的任何字符序列(包括零字节),你没有其他选择,那么使用列表或Python:VimL​​字符串不能包含这些字节,因此它们被表示为换行符保证不会出现在字符串中。 – ZyX

+0

我不知道':w!some-script'不会保存到文件中,让我试试! – alfredodeza

1

尽管您可以使用getline(1, $)检索缓冲区中的所有(已修改)行,但当您的目标将它们写入文件时,根据ZyX的答案,:w! > filename仍然是可行的方法。尽管Vimscript中有一个writefile()函数,但你必须自己处理编码,行尾等等,当内置的:write可以为你做时,这太麻烦了。