Eu estou escrevendo vários .gv arquivos ( graphviz ) no mesmo diretório e deseja criar um arquivo png com neato
imediatamente quando salvei um deles. Eu estou no macOS 10.12.6, com zsh
como meu shell padrão e eu instalei entr
de http://entrproject.org/ para monitorar alterações de arquivos. Eu tentei seguir o comando sem qualquer sorte
$ 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
Trabalhos seguintes
Impressão simples do último arquivo modificado
$ ls *.gv | entr echo /_ # Press <Space> to manually trigger event to see last changed file /Users/hotschke/complete.gv
Usando o mesmo nome de saída para todos os arquivos:
$ ls *.gv | entr neato -Tpng /_ -oConstantname.png
Substitua .gv por .png
$ F="/Users/hotschke/complete.gv";neato -Tpng "$F" -o"${F/%\.gv/.png}"
Observe o argumento especial /_
do entr
O especial
/_
argumento (algo análogo a$_
em Perl) fornece uma maneira rápida de se referir ao primeiro arquivo que foi alterado. Quando um único arquivo é listado, essa é uma maneira prática de evitar digitar um nome de caminho duas vezes:
Seria ótimo ter várias respostas usando diferentes ferramentas (por exemplo, vigia, watchdog, fswatch, entr, launchd (somente para mac); veja também a discussão https://stackoverflow.com/q/1515730/ )
fonte
inotifywait -m
, que produz nós tocados, em vez deentr
que parece consumir uma lista de nós para monitorar. Você pode então usarsed
(ou similar) para produzir um comando para executar.inotify
tag ...Respostas:
Chame um script com
entr
tl; dr : passe
/_
como um argumento para um script para fazer a coisaAo invés de tentar futz com argumentos e variáveis especiais, passe
/_
para um script simples (que pode ser um liner) para fazer sua geração de PNG:com
update.sh
ao longo das linhas de:Eu testei a abordagem acima com um script simples para usar imagemagick para
convert
uma imagem, que funcionou sem aspas, mas é melhor deixá-las no caso de espaços, etc. em nomes de arquivos.Como uma nota lateral, eu costumo usar um script de atualização com
entr
de qualquer maneira, pois mantém as coisas mais claras para minha mente. Por exemplo, eu usoentr
Para assistir aos arquivos fonte LaTeX e gerar um PDF atualizado, o script de atualização nesse caso é executadoxelatex
,biber
e também atualiza o visualizador de PDF (pkill -HUP mupdf
).fonte
$ ls *.gv | entr make
. O Makefile funcionaria sem entr ou similar e os editores de texto geralmente suportam chamar um makefile (por exemplo, vim). Eu uso vim e poderia ativar um autocommand para o evento de salvar:au BufWritePost <buffer> make
. Se eu quiser que o make seja executado em segundo plano, posso usar vim-dispatch, asyncrun.vim, neomake, vim-accio ou um dos muitos outros plugins disponíveis.$ latexmk -pvc
que fazentr
redundante e é muito inteligente em relação a chamar os programas xelatex, biber e outros tão frequentemente quanto necessário e também atualiza o visualizador.$<
,$+
e similar. Eu não o uso com freqüência suficiente e também prefiro o latexmk para latex e cmake para c / c ++.Usando um Makefile
Agora você pode usar
Há espaço para melhorias: há dois comandos para listar arquivos com a extensão .gv que contradiz um única fonte de verdade (SSOT).
Notas Vim
Você também pode usar o Makefile dentro do editor de texto vim
Você pode ligar automaticamente para salvar, configurando um autocommand com
Você pode considerar usar um plugin para executar make async: veja os plugins despacho de vim (mapeamento de modo normal
m<CR>
) neomake ou asyncrun.vim .No entanto, já existem definições de compilador para os comandos dot e neato:
Isso significa que você não precisa escrever um Makefile. Você pode definir o makeprg
:comp[iler] neato
ou:comp dot
. Note que você vê todas as definições do compilador:comp <C-d>
e você pode tab-completar:comp n<Tab>
para:comp neato
e:comp d<tab>
para:comp dot
.Agora você precisa chamar make com um argumento para especificar seu formato de saída:
Se você usa o vim-dispatch, isso parece
fonte
Usando
fswatch
ao invés deentr
Graças a @Attie por apontar
fswatch
Fora. Seguintes obras para mim:O fswatch considera por padrão todos os arquivos: você precisa usar filtros para limitar a um determinado tipo de arquivo (Vejo https://stackoverflow.com/q/34713278/ ).
https://emcrisostomo.github.io/fswatch/ por Enrico M. Crisostomo (2013-2017)
fonte
Entr
- Passe/_
como um argumento para um shellEsta resposta é de https://bitbucket.org/eradman/entr/issues/75/run-command-on-single-file-when-changed#comment-44183153 .
Este comando executa silenciosamente o comando
neato
. Se você quiser ter feedback sobre a linha de comando quandoentr
detecta uma alteração de arquivo, adicione-x
para bater para ver o comando executado:fonte