2011-11-27 134 views
16

我正在编辑Vim中的XML文件,然后我想用xsltproc将其转换为纯文本文件,默认情况下会将其输出到stdout(如:!xsltproc TXTRULE.XSL%)。是否可以将xsltproc输出重定向到Vim中的新选项卡而不创建任何中间文件?如何将stdout输出重定向到新的Vim选项卡?

(我试图阅读:帮助再导向和some wiki notes,但还是不能让这将是greateful对于某种简单的例子。)

回答

22

您可以在以下使用read像:

:read !ls 

显然你应该改变你的命令ls。如果你想打开一个新的标签预先考虑tabnew与像条命令:

:tabnew|read !ls 
+0

非常感谢** lucapette **。 –

+1

不止欢迎;) – lucapette

+0

新|阅读!ls将打开一个新窗口,而不是一个标签 –

3

要扩大lucapette的answer,你可以创建一个映射是这样的:

:map ,x :tabnew<Bar>read !xsltproc TXTRULE.XSL # 

#扩展到之前打开的缓冲区,这是您正在编辑的文件,而%将扩展到由:tabnew打开的新缓冲区。

必须使用<Bar>而不是|,否则,:map命令将在|处结束。

+1

谢谢**丹尼尔**,我不知道#。但是,从我的角度来看,我可以补充一点,似乎可以用'\ |'代替'':)。 –

+0

很酷的答案我倾向于忘记'#' – lucapette

+1

这里有两个问题:1)[永远不要使用':map'](http://learnvimscriptthehardway.stevelosh.com/chapters/05.html)(另外,你不要在运行等待模式下不需要这个映射,所以不应该使用'nnoremap'或'nnoremap' +'xnoremap')2)'#'以及不能正确处理特殊(特殊的shell)这样的字符,':execute'和'shellescape(@#,1)'是你的朋友。你最后忘了''吗? – ZyX

0

我使用下面查看我的计划产出

它打开旁边只有一个没有之前已经为此开了当前一个新的选项卡(用于与make运行规则生成文件非常有用) :

fu! RedirStdoutNewTabSingle(cmd) 
    let a:newt= expand('%:p') . ".out.tmp" 
    tabnext 
    if expand('%:p') != a:newt 
    tabprevious 
    exec "tabnew" . a:newt 
    else 
    exec "%d" 
    endif 
    exec 'silent r !' . a:cmd 
    set nomodified 
endfunc 

au FileType xml noremap <buffer> <F6> :call RedirStdoutNewTabSingle("xsltproc")<CR>