有没有一种简单的方法可以让任意文本编辑器根据文件扩展名调用特殊逻辑?
例如,假设我有一个包含文件集合的 zip 文件。
text.txt
image.jpg
othercrap.crap
有没有办法让文本编辑器在通过vi myarchive.zip
基于文件扩展名的方式打开文件时自动运行命令?
答案1
我不明白你的很多描述,除了“如果我可以在上面使用 vi 并且文本部分会自动知道如何格式化自己,那就太好了”,但这可能就是你想要做的(未经测试):
#!/usr/bin/env bash
tmp=$(mktemp) || exit 1
trap 'rm -f "$tmp"; exit' 0
edit_zip() {
unzip "$1" > "$tmp" &&
vi "$tmp" &&
zip "$tmp" > "$1"
}
edit_pdf() {
pdf2text "$1" > "$tmp" &&
vi "$tmp" &&
text2pdf "$tmp" > "$1"
}
act_ext="${1}_${2##*.}"
if declare -F "$act_ext" > /dev/null; then
"$act_ext" "$3"
else
printf 'Operation "%s" not supported.\n' "$*"
fi
myprog
上面将是您要调用的内容,myprog edit myfile.zip
如您的问题所示。
unzip
上面zip
的内容可能不完全是这些参数,或者是您想要在 zip 文件上运行的命令,并且pdf2text
可能text2pdf
并不真正存在或真正执行您想要编辑 PDF 的操作,以上内容只是为了让您了解编写一个单独的函数来执行您想要支持的每个操作(操作+扩展),例如edit
和.zip
等,然后根据传递给脚本的参数自动调用适当的函数。
答案2
使用乐(以前称为 Perl_6)
答:您可以设计/运行自己的类Proc
对象,它们是外部命令调用的表示。将以下内容保存为脚本并运行:
my $proc = run 'echo', 'Hallo world', :out;
my $captured-output = $proc.out.slurp: :close;
say "Output was $captured-output.raku()";# OUTPUT: «Output was "Hallo world\n"»
B. 也许您不想让您的 shell 参与其中,因此您可以编写自己的 Raku 俏皮话并将它们指向特定dir()
目录中的文件。下面返回文件及其创建日期,每个文件.jpeg
一行:.jpeg
~$ raku -e 'for dir( test => /:i '.' jpe?g $/ ) -> $file {
say join "\t", $file, $file.IO.created.DateTime;
}
https://docs.raku.org/type/Proc
https://docs.raku.org/routine/dir
C. Raku 有 Ake 模块/脚本,对于设计/运行任务很有用:
~/Ake_Morning$ cat Akefile
task 'buy-food', {
say 'Bought a salad.'
}
task 'shower', {
say 'Showered.'
}
task 'morning' => <shower buy-food>;
task 'dinner' => <buy-food>, {
say 'Yummy!'
}
然后ake
在以下位置运行二进制文件Akefile
:
~/Ake_Morning$ ake
Task “default” does not exist
Did you mean one of these?
buy-food
dinner
help
morning
shower
~/Ake_Morning$ ake morning
Showered.
Bought a salad.
D. Raku 还拥有 Sparrow6 (DSL) 和 Tomtit(任务运行程序)生态系统,它们似乎都是yaml
基于 的。 Sparrow 可以用 6 种不同的语言为您运行任务:1. Raku、2. Perl、3. Bash、4. Python、5. Ruby 和 6. Powershell。
https://github.com/melezhik/Tomtit
https://github.com/melezhik/Sparrow6/blob/master/documentation/dsl.md
https://raku.org