我有一个名为foo.txt
.我想将我自己的程序与 mime 类型关联起来.txt
,以便我的程序打开一个终端并将 的内容显示foo.txt
为标准输出。我更喜欢 Ruby,但 BASH 脚本也可以。
一个有效的示例:我可以使用firefox
.我想txt
以同样的方式用我自己的可执行文件打开文件。
我不知道如何才能真正让它发挥作用?
示例 2:我可以.txt
使用 Geany/Mousepad/Atom/Code 等打开文件。假设我制作了一个像鼠标垫一样的工具。我的程序应该如何处理.txt
mimetype?
到目前为止,我已经用 Ruby 制作了一个小型 GUI 程序,并使其可执行,并尝试foo.txt
用我的程序打开(我使用 Nemo 文件管理器)。我已经在 Ruby 程序中捕获了参数和标准输入,因此它将显示参数和 STDIN(如果有)。但是,如果我用它打开文件,我的程序甚至不会显示窗口.txt
!
我该如何达到这个结果?
答案1
介绍
当使用应用程序打开文件时,该文件只是作为参数传递给应用程序。
所以当你打开火狐每晚located in/bin/
和p.html
located in /home/user/
,基本上和 run 类似/bin/firefox-nightly /home/user/p.html
。
创建可执行文件
正如问题中提到的:
到目前为止,我已经用 Ruby 制作了一个小型 GUI 程序,并使其可执行,并尝试用我的程序打开 foo.txt(我使用了 Nemo 文件管理器)。
让我们按照 OP 的要求创建一个 Ruby 程序,它将复制作为参数传递给/tmp/tempfile-#{n}
.请注意,任何可以接受命令行参数的编程语言都可以工作。
#!/usr/bin/env ruby
# Errors
ERR_NO_FILE = 2
FILE = $*[0]
begin
tempfile, counter = File.join(%W(/ tmp tempfile)), 0
tempfile.replace(File.join(%W(/ tmp tempfile-#{counter += 1}))) while File.exist?(tempfile)
IO.write(tempfile, IO.read(FILE))
rescue Errno::ENOENT
exit!(ERR_NO_FILE)
rescue Interrupt, SystemExit, SignalException
exit!(0)
rescue Exception
abort($!.backtrace.join(?\n))
end if FILE
让我们调用我们的程序山寨.rb,并将其移动到 /tmp/ 目录。
我们当然可以在终端上运行该程序,如下所示:
/tmp/copycat.rb /tmp/AFile
如果存在重复的临时文件,这会将所有内容复制/tmp/AFile
到/tmp/tempfile-#{n}
其中的计数。#{n}
创建应用程序条目
现在,要使用文件管理器中的程序打开它,我们需要创建一个应用程序条目。为此,我们有两个选择。这第一个选项是:
在 中创建一个名为 copycat.desktop 的文件$HOME/.local/share/applications
,其中包含以下内容:
[Desktop Entry]
Version=1.0
Type=Application
Name=CopyCat
Comment=Copy the contents of a file to /tmp/tempfile#{n}
Exec=/tmp/copycat.rb %u
Icon=edit-copy
Path=
Terminal=false
StartupNotify=false
Actions=
Categories=Copy;Utility
不要忘记将该%u
选项添加到以 Exec 开头的行中。
测试
好吧,为了测试,让我们创建一个名为“hello world”或任何您想要的内容的简单文件。打开文件管理器,然后在文件上单击辅助鼠标按钮,然后选择“打开方式”或类似选项。因为它与 GUI 相关,所以我将添加一些示例图片。
我在这里使用的文件管理器是 Nautilus,但这也应该适用于其他文件管理器,只是文本可能有所不同。
这第二个选项是使该应用程序可供所有用户使用。为此,您必须将文件从$HOME/.local/share/applications/copycat.desktop
移至/usr/share/applications
并将所有权更改为 root。
这就是在 Linux 中使用自定义可执行文件打开的方式。可以用相同的方式创建和打开类似的 GUI 应用程序。
答案2
case $1 in
*txt) applic=less ;;
*html) applic=vim ;;
esac
xterm -e $applic $1 &
简约,但经过测试。
您可以从第一个 xterm 调用此脚本。不要看case-esac
,而是注意xterm
和-e
& 符号。