如何将特殊逻辑与文件扩展名关联起来?

如何将特殊逻辑与文件扩展名关联起来?

有没有一种简单的方法可以让任意文本编辑器根据文件扩展名调用特殊逻辑?

例如,假设我有一个包含文件集合的 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.

https://github.com/Raku/ake


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

相关内容