我正在写几个.gv文件(图形可视化) 位于同一目录中,我想在保存其中一个文件后立即创建一个 png 文件。neato
我使用的是 macOS 10.12.6,使用zsh
作为我的默认 shell,并且我已从entr
https://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
后续作品
简单打印最后修改的文件
$ ls *.gv | entr echo /_ # Press <Space> to manually trigger event to see last changed file /Users/hotschke/complete.gv
对所有文件使用相同的输出名称:
$ ls *.gv | entr neato -Tpng /_ -oConstantname.png
将 .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,在这种情况下,更新脚本会运行xelatex
,biber
并刷新 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 已经有了编译器定义:
- https://github.com/vim/vim/blob/master/runtime/compiler/dot.vim
- https://github.com/vim/vim/blob/master/runtime/compiler/neato.vim
这意味着您不需要编写 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}"' /_
此命令将静默执行命令。如果您希望在检测到文件更改neato
时在命令行上有反馈,请添加到 bash 以查看已执行的命令:entr
-x
ls *.gv | entr bash -x -c 'neato -Tpng "$0" -o"${0/%\.gv/.png}"' /_