2016-07-30 44 views
1

这里就是我想要的bash做的,首先在伪,然后在bash,据我已经得到了,那么错误:猛砸替代自动命令

“我想要什么”伪

If a file is saved in the "Cover Letters" directory with a filename ending in "md": 

    run a Bash command like: 

    pandoc [FILENAME] -o [FILENAME].replace(".md",".pdf") -s -S 

我已经走到这一步,

:autocmd BufWritePost ~/Dropbox/Professional/Covers/*.md pandoc % -o ${%/md/pdf} -s -S 

此代码正确识别时,被保存在“MD”的文件在Dropbox文件夹中,然后运行一个包含文件名的命令。但是,命令出错:

"test.md" 1L, 6C written 
:!pandoc test.md -o ${test.md/md/pdf} -s -S 
/bin/bash: ${test.md/md/pdf}: bad substitution 

shell returned 1 

我的替换出了什么问题?我觉得像我这么近......

编辑:当前版本:

autocmd BufWritePost ~/Dropbox/Professional/Covers/*.md #!star='~/Dropbox/Professional/Covers/'% && fin=${star/md/pdf} && p andoc star -o fin -s -S 
+0

我已经回答了类似问题[\ [here \]](http://stackoverflow.com/a/38671667/1620779)。请参阅函数中的替代部分,这正是您所需要的。 – sjsam

+0

谢谢,是否替换只适用于变量而不是字符串?我不知道如何让Vim执行一个多行bash脚本(而不是一行代码)。 –

+0

$ {test.md/md/pdf}有什么问题? –

回答

0

这是你在找什么:

#!/bin/bash 
function pandocfn() 
{ 
pandoc "${1}" -o "${1/%\.md/.pdf}" 
} 
export -f pandocfn 
find ~/Dropbox/Professional/Covers -type f -iname "*.md" -exec \ 
    bash -c 'pandocfn "$1"' _ {} \; 

保存脚本作为脚本说script.sh~/Dropbox/Professional/Covers,做chmod +x script.sh并从内部vim

: ! ./script.sh 

如果保存比~/Dropbox/Professional/Covers其他一些位置的脚本,然后做

: ! full/path/to/script.sh 

请参阅shell参数[ expansion ]

+0

这是一个真正的noobie问题,但我在哪里可以保存该.sh文件被vim调用?我已经尝试编写我自己的.sh脚本,并让vim尝试执行它,但我无法弄清楚它保存在哪里。 –

+0

@Iroh:请参阅如何在vim中运行脚本的更新程序,它可以为您节省大量时间,并在其工作时接受答案:) – sjsam

1

最后得到了一个可行的版本:

autocmd BufWritePost ~/Dropbox/Professional/Covers/*.md !star='%' && fin=${star/md/pdf} && pandoc $star -o $fin -s -S 

非常基本的bash错误,看起来像。谢谢sjsam的帮助!

+0

'fin = $ {star/md/pdf}'=> 'fin = $ {star /%。md/.pdf}'因为你正在寻找扩展名'md'而不是'mdfile'。ext'和'pandoc $ star -o $ fin' =>'pandoc“$ star”-o“$ fin”'(这里,双引号的变量不会造成伤害,这也会帮助您适应非标准的文件名) – sjsam