使用当前打开的文件作为参数在Vim中运行shell脚本

3

我刚开始使用Vim。

这是一个我经常在BBedit中使用的shell脚本。

#!/bin/sh

filename=$(basename "${BB_DOC_PATH##*/}" .ly)
directory=${BB_DOC_PATH%/*}/

cd "${directory}"

lilypondPDFoutput="${directory}"$filename".pdf"

/Applications/Lilypond.app/Contents/Resources/bin/  lilypond -dno-point-and-click -ddelete-intermediate-    files "$BB_DOC_PATH"

wait

open "${lilypondPDFoutput}"

BB_DOC_PATH是一个变量,代表当前打开文件的路径。(例如:/Users/me/Documents/file.ly)

我该如何将此脚本放置在我的.vimrc中,并使用简单的命令:typeset调用它?

注意:我正在排版Lilypond文件。

2个回答

5
您可以使用类似以下的方式:

您可以采用以下方法之一:

:!your_script %

如果您的脚本在PATH中,它应该可以正常工作。请参阅文档::!文件修改器。保留HTML标记。

1

原帖询问如何将脚本放置在 .vimrc 中。由于 Vim 导入文件采用行继续的奇怪方式,这有点棘手。应该是像这样的:

command Typeset call Typeset()
fun Typeset()
    let $TYPESET_PATH = expand("%:p")
    let $TYPESET_ROOT = expand("%:p:r")
    let $TYPESET_DIR = expand("%:p:h")
    !sh -icx '
    \ cd "${TYPESET_DIR}"
    \; lilypondPDFoutput="${TYPESET_ROOT}.pdf"
    \; /Applications/Lilypond.app/Contents/Resources/bin/lilypond -dno-point-and-click "$TYPESET_PATH"
    \; wait
    \; open "${lilypondPDFoutput}"
    \'
endfun

这是我在一个完全不同的环境中(Lilypond/Win32;Cygwin下的Vim)实际上正在使用的内容。

" Quick compile command for Lilypond.
command Typeset call Typeset()
fun Typeset()
  let $TS_NAME = expand("%:t")
  let $TS_DIR = expand("%:p:h")
  let $TS_PDF = expand("%:t:r") . ".pdf"
  !sh -icx ' cd "${TS_DIR}" && lilypond "${TS_NAME}" && cygstart "${TS_PDF}" '
endfun

注意:Lilypond/Win32 不支持正斜杠路径。因此,我在其参数中删除了路径。您也可以这样做。您已经使用 "cd" 设置了路径。对于我的环境,我去掉了点和点击选项,以及 "wait",并将 "open" 更改为 "cygstart"。此时,Shell 部分已经足够短,我不需要 Vim 要求的相当晦涩的行继续。同时,我添加了快捷操作符,以便在任何阶段出现错误时停止进程。


我将你的函数粘贴到了我的 .vimrc 文件中,但是运行 :Typeset 报错了 - 请看上面我修改后的问题。 - cg433n
我可以尝试帮助调试,所以我需要知道您遇到的错误具体信息。 - MetaEd
好的,这看起来像是我复制粘贴错误。删除分号,然后才输入 "cd"。由于我无法在我的系统上完全复制您的环境,所以在使其运行之前,我们可能会遇到其他错误。 - MetaEd
糟糕!看起来你在我编辑完上面的问题之前回复了我的评论。 - cg433n
应更改读取为“; /Applications/Lilypond.app...”的行,更改为“; /Applications/Lilypond.app/Contents/Resources/bin/lilypond -dno-point-and-click“$TYPESET_PATH””。 - cg433n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接