使用以下方式调用脚本entr

使用以下方式调用脚本entr

我正在写几个.gv文件(图形可视化) 位于同一目录中,我想在保存其中一个文件后立即创建一个 png 文件。neato我使用的是 macOS 10.12.6,使用zsh作为我的默认 shell,并且我已从entrhttps://github.com/eradman/entr监视文件更改。我尝试过以下命令,但没有成功

$ echo $0
-zsh
$ ls *.gv | entr 'F="/_";neato -Tpng "$F" -o"${F/%\.gv/.png}"'
entr: exec F="/_";neato -Tpng "$F" -o"${F/%\.gv/.png}": No such file or directory

后续作品

  1. 简单打印最后修改的文件

     $ ls *.gv | entr echo /_
     # Press <Space> to manually trigger event to see last changed file
     /Users/hotschke/complete.gv
    
  2. 对所有文件使用相同的输出名称:

     $ ls *.gv | entr neato -Tpng /_ -oConstantname.png
    
  3. 将 .gv 替换为 .png

     $ F="/Users/hotschke/complete.gv";neato -Tpng "$F" -o"${F/%\.gv/.png}"
    

注意/_entr

特殊/_参数(有点类似于$_Perl 中的)提供了一种快速引用第一个更改的文件的方法。当列出单个文件时,这是一种避免输入两次路径名的便捷方法:

如果有多个使用不同工具的答案就更好了(例如 watchman、watchdog、fswatch、entr、launchd(仅限 mac);另请参阅讨论https://stackoverflow.com/q/1515730/

答案1

使用以下方式调用脚本entr

总结/_作为参数传递给脚本来执行操作™

您不需要尝试摆弄特殊参数和变量,只需传递/_一个简单的脚本(它本身可以是一行程序)即可完成 png 生成:

$  ls *.gv | entr ./update.sh /_

大致update.sh如下:

neato -Tpng "$1" -o"${1/%\.gv/.png}"

我使用一个简单的脚本对上述方法进行了测试,将 imagemagick 用于convert图像,该方法无需引号即可工作,但如果文件名中有空格等,最好保留它们。

顺便提一下,我倾向于使用 更新脚本,entr因为它可以让事情变得更清晰。例如,我使用 来entr查看 LaTeX 源文件并生成更新的 PDF,在这种情况下,更新脚本会运行xelatexbiber并刷新 PDF 查看器 ( pkill -HUP mupdf)。

答案2

使用 Makefile

SOURCES:=$(shell find . -maxdepth 1 -name '*.gv')

ifndef OTYPE
    OTYPE:=png
endif
# use `make OTYPE=pdf` to generate pdfs

TARGETS:=$(SOURCES:.gv=.$(OTYPE))

.PHONY: all clean

all: $(TARGETS)

clean:
    rm $(TARGETS)

%.$(OTYPE) : %.gv
    neato -T$(OTYPE) $< -o$(basename $<).$(OTYPE)

现在您可以使用

$ ls *.gv | entr make

还有改进的空间:有两个命令列出扩展名为 .gv 的文件,这与单一事实来源(SSOT)。

Vim 注释

您还可以使用文本编辑器 vim 中的 Makefile

:mak[e]

您可以通过设置自动命令来自动调用 make 来保存

:au BufWritePost <buffer> make

您可能考虑使用插件来运行 make async:请参阅插件vim 调度(正常模式映射m<CR>),新制造, 或者异步运行

但是,命令 dot 和 neato 已经有了编译器定义:

这意味着您不需要编写 Makefile。您可以通过:comp[iler] neato或设置 makeprg :comp dot。请注意,您可以通过 看到所有编译器定义,并且:comp <C-d>您可以通过制表符完成:comp n<Tab>:comp neato和。:comp d<tab>:comp dot

现在您必须调用 make 并使用参数来指定您的输出格式:

:make png
:au BufWritePost <buffer> make png

如果你使用 vim-dispatch,这看起来像

:Make png
m<Space>png<CR>
:au BufWritePost <buffer> Make png

答案3

使用fswatch而不是entr

感谢@Attie的指出fswatch。以下方法对我有用:

 $ fswatch -e ".*" -i "$PWD/[^.]*\\.gv$" -0 $PWD |
     xargs -0 -n 1 -I {} sh -c 'F={}; neato -Tpng "$F" -o"${F/%\.gv/.png}"'

fswatch 默认考虑所有文件:您需要使用过滤器来限制特定的文件类型(请参阅https://stackoverflow.com/q/34713278/)。

https://emcrisostomo.github.io/fswatch/作者:Enrico M. Crisostomo(2013-2017)

答案4

Entr/_作为参数传递给 shell

ls *.gv | entr bash -c 'neato -Tpng "$0" -o"${0/%\.gv/.png}"' /_

此答案来自https://bitbucket.org/eradman/entr/issues/75/run-command-on-single-file-when-changed#comment-44183153

此命令将静默执行命令。如果您希望在检测到文件更改neato时在命令行上有反馈,请添加到 bash 以查看已执行的命令:entr-x

ls *.gv | entr bash -x -c 'neato -Tpng "$0" -o"${0/%\.gv/.png}"' /_

相关内容