除了 XDG 规范 (mimeapps.list) 之外,如何通过文件扩展名确定文件类型

除了 XDG 规范 (mimeapps.list) 之外,如何通过文件扩展名确定文件类型

我正在尝试为 R noweb 文件设置默认应用程序,但找不到指定它的位置。原因是我的文件管理器似乎通过文件扩展名 (.Rnw) 而不是或除了指定的方案之外来确定文件类型自由桌面网站(即:mimeapps.list、mimeinfo.cache、defaults.list...)

我尝试使用 pcmanfm 和 thunar 作为文件管理器。它们在文件类型的确定上达成一致,但在xdg-mime query filetype实用程序上有所不同。请参阅下面的最小示例和配置文件。

此外,该xdg-mime实用程序似乎忽略了 local mimeapps.list,但文件管理器却尊重它。

问题是:我的假设是否正确,即文件类型是由这些文件管理器中的名称扩展名决定的,我在哪里可以找到相关的配置?

我使用 Awesome WM 作为窗口管理器和pcmanfm桌面管理器。

更新:我发现本教程介绍 pcmanfm 中的文件扩展名,但我的问题仍然是 mime 类型和推断类型pcmanfm不匹配(rnoweb.Rnw是 MIME 类型text/plainrnoweb0.Rnwinode/x-empty,但将pcmanfm两者都列为R Sweave file

更新2[已解决]: @mji 建议将 xml 文件放入~/.local/share/mime/packages.该文件已作为/usr/share/mime/text/x-r-sweave.Rnw.事实证明,更改<comment>该文件中的标签会更改 thunar 和 pcmanfm 中的说明列。它还x-r-sweave为文件分配 MIME 类型。我已经在我的问题中发现了这一点,但忽略了它(我搜索了x-r-noweb


最小的例子:

我在一个空目录中创建了四个文件。两个是空的,两个是样本内容:

touch plain0 rnoweb0.Rnw

cat > plain <<EOF
text
EOF

cat > rnoweb.Rnw <<EOF
<<>>=
1+1
@
EOF

我对这些文件运行xdg-mime query filetypexdg-mime query default以获得以下结果:

filename      MIME type           Default app
-------------------------------------------------
plain         text/plain          medit.desktop
plain0        inode/x-empty
rnoweb0.Rnw   inode/x-empty
rnoweb.Rnw    text/plain          medit.desktop

但是,thunarpcmanfm文件类型*.Rnw列为“R Sweave 文件”,并将plain*文件列为纯文本文档(德语为“Einfaches Textdokument”)。文件管理器中列出的默认应用程序RStudio适用于 ,*.RnwGVim 适用于plain*.

纯文本文件使用 GVim 打开,与该xdg-mime实用程序不同,但符合我本地的设置.local/share/applications/mimeapps.list

我的系统上唯一匹配的文件locate mimeinfolocate mimeapps

/etc/xdg/mimeapps.list
/usr/share/applications/mimeinfo.cache
~/.local/share/applications/mimeapps.list
~/.local/share/applications/mimeinfo.cache

greprstudioping这些文件中 (rstudio.desktop)的出现情况会产生(类似结果总结在{...}

/usr/share/applications/mimeinfo.cache 
    application/x-r-data=rstudio.desktop;
    application/x-r-project=rstudio.desktop;
    text/css=rstudio.desktop;
    text/html=firefox.desktop;abiword.desktop;calibre-ebook-edit.desktop;rstudio.desktop;elinks.desktop;
    text/javascript=rstudio.desktop;
    text/x-R=rstudio.desktop;
    text/x-markdown=rstudio.desktop;
    text/x-r=rstudio.desktop;
    text/x-r-{doc,markdown,history,html,presentation,profile,source,sweave}\
    =rstudio.desktop;
    text/x-tex=texstudio.desktop;gvim.desktop;rstudio.desktop;

XDG 规范中提到的其他文件不包含任何rstudio.

grepping text/plainMIME 类型,我得到:

/etc/xdg/mimeapps.list : text/plain=medit.desktop;
/usr/share/applications/mimeinfo.cache : text/plain=medit.desktop;libreoffice-writer.desktop;gvim.desktop;abiword.desktop;
~/.local/share/applications/mimeapps.list : text/plain=gvim.desktop
~/.local/share/applications/mimeapps.list : text/plain=gvim.desktop;

答案1

制作 mime-info 文件

$ vi ~/.local/share/mime/packages/x-r-noweb.xml

$ cat ~/.local/share/mime/packages/x-r-noweb.xml
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
    <mime-type type="text/x-r-noweb">
        <comment>R noweb</comment>
        <glob pattern="*.Rnw"/>
    </mime-type>
</mime-info>

更新 mime 数据库

$ update-mime-database ~/.local/share/mime/

$ xdg-mime query filetype rnoweb0.Rnw 
text/x-r-noweb
$ mimetype -d rnoweb0.Rnw
rnoweb0.Rnw: R noweb
$ mimetype rnoweb0.Rnw
rnoweb0.Rnw: text/x-r-noweb

现在,您可以设置默认应用程序

$ xdg-mime default nice-app.desktop text/x-r-noweb
# (or edit ~/.local/share/applications/mimeapps.list)

$ xdg-mime query default text/x-r-noweb
nice-app.desktop

相关内容