从 SpaceFm 启动时,.desktop 文件无法在 Google Chrome 中打开

从 SpaceFm 启动时,.desktop 文件无法在 Google Chrome 中打开

使用 Google Chrome 时,我经常将网站链接从地址栏拖到桌面上的文件夹中,以供日后参考。这会创建一个.desktop文件,该文件本质上是指向网页的链接。

只需双击即可从 Nautilus 和 PCmanFM 轻松打开这些桌面文件,但是,当我使用 SpaceFM 文件管理器打开它们时,Google Chrome 会开始下载该文件,而不是像使用其他提到的文件管理器那样打开它。

如果我右键单击这些文件并使用 Firefox 打开,我可以通过 SpaceFM 打开这些文件,但不能使用 Google Chrome 打开。

桌面文件的示例如下:

[Desktop Entry]
Encoding=UTF-8
Name=Link to The Hidden Fortress (1958) - IMDb
Type=Link
URL=http://www.imdb.com/title/tt0051808/?ref_=nv_sr_2
Icon=text-html

有没有办法让这些.desktop文件在从 SpaceFM 浏览器启动时在 Google Chrome 中正常打开?

答案1

1. 将链接文件转换为启动器

以下解决方案提供了右键单击链接(.desktop文件)并选择 >“执行”的选项,这将运行Google-Chrome以打开链接。通过编辑SpaceFm的设置,您也可以通过双击来运行链接(参见注释[3])。

在此处输入图片描述

注意,解决方案会自动編輯(仅有的)新的桌面上的链接,专门运行链接Google-Chrome

这是什么

小型后台脚本每两秒钟检查一次新的 .desktop桌面上的文件。如果找到相关文件,则从关联文件放入应用文件。这可以通过编辑文件中的两行来完成:

  • 以下行:

    Type=Link
    

    更改为:

    Type=Application
    
  • 以下行:

    URL=<link>
    

    更改为:

    Exec=/usr/bin/google-chrome-stable <link>
    

在我运行的测试中,通过右键单击可以使链接“打开” SpaceFm:右键单击 > 打开 > 执行

剧本

#!/usr/bin/env python3
import os
import time

# --- define the (absolute) path to your desktop below
dr = "/absolute/path/to/your/desktop"
# edit (if necessary) the command to launch Google-Chrome
application = "/usr/bin/google-chrome-stable"

def find_relevant():
    return [f for f in os.listdir(dr) if f.endswith(".desktop")]

relevant1 = []

while True:
    time.sleep(2)
    relevant2 = [f for f in os.listdir(dr) if f.endswith(".desktop")]
    new = [f for f in relevant2 if not f in relevant1]
    if new:
        for f in new:
            f = dr+"/"+f
            rewrite = False
            lines = [l.strip() for l in open(f).readlines()]
            for i, l in enumerate(lines):
                if l.startswith("Type=Link"):
                    rewrite = True
                    lines[i] = "Type=Application"
                elif l.startswith("URL="):
                    lines[i] = l.replace("URL=", "Exec="+application+" ")
            if rewrite == True:
                print("rewrite")
                open(f, "wt").write(("\n").join(lines))            
    relevant1 = relevant2

如何使用

  1. 将脚本复制到一个空文件中,另存为edit_links.py
  2. 在脚本的头部部分,编辑桌面的路径(如上所述,这里使用绝对路径)
  3. 通过检查文件中的第一行来检查要运行的命令Google-Chrome(也在 head- 部分设置):运行Exec=google-chrome.desktop

    gedit /usr/share/applications/google-chrome.desktop
    

    读取文件。

  4. 通过以下命令测试运行脚本:

    python3 /path/to/edit_links.py
    

    打开Google-Chrome,将链接拖到桌面上,几秒钟后测试是否正常工作。

  5. 如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:

    python3 /path/to/edit_links.py
    

笔记

  1. 拖动的.desktop文件(链接)需要在桌面上停留至少一到两秒钟才能被发现和编辑,因此如果您移动链接,至少要将它们在桌面上保留几秒钟。:)
  2. 该脚本所做的就是检查.desktop桌面上是否有新文件,只有在有新文件时才会读取/编辑文件。这意味着没有什么到您的系统。
  3. 通过编辑SpaceFm的设置,您还可以双击运行“链接”:

    在此处输入图片描述

递归转换现有链接文件

此外,正如聊天中所讨论的,运行一次脚本可以递归地转换目录中的链接:

#!/usr/bin/env python3
import os
import sys

# --- define the (absolute) path to your desktop below
dr = sys.argv[1]
# edit (if necessary) the command to launch Google-Chrome
application = "/usr/bin/google-chrome-stable"

for root, dirs, files in os.walk(dr):
    for f in files:
        if f.endswith(".desktop"):
            f = root+"/"+f
            rewrite = False
            lines = [l.strip() for l in open(f).readlines()]
            for i, l in enumerate(lines):
                if l.startswith("Type=Link"):
                    rewrite = True
                    lines[i] = "Type=Application"
                elif l.startswith("URL="):
                    lines[i] = l.replace("URL=", "Exec="+application+" ")
            if rewrite == True:
                open(f, "wt").write(("\n").join(lines)) 

要使用它,请将其保存为convert_links.py,并使用目标目录作为参数运行它:

python3 /path/to/convert_links.py <directory>

2. 将链接转换为跨平台可用的链接文件

根据 OP 的要求,以下是(第一个)(背景)脚本的一个版本,将通过将链接从浏览器拖到桌面创建的链接文件转换为跨平台链接。用法与第一节中解释的完全相同。

剧本

#!/usr/bin/env python3
import os
import time

# --- define the (absolute) path to your desktop below
dr = "/absolute/path/to/your/desktop"

out1 = ["<html>", "<body>", '<script type="text/javascript">']
out2 = ["</script>", "</body>", "</html>"]

def find_relevant():
    return [f for f in os.listdir(dr) if f.endswith(".desktop")]

relevant1 = []

while True:
    time.sleep(2)
    relevant2 = [f for f in os.listdir(dr) if f.endswith(".desktop")]
    new = [f for f in relevant2 if not f in relevant1]
    if new:
        for f in new:
            f = dr+"/"+f
            rewrite = False
            lines = [l.strip() for l in open(f).readlines()]
            for i, l in enumerate(lines):
                if l.startswith("Type=Link"):
                    rewrite = True
                elif l.startswith("URL="): 
                    url = 'window.location.href = "'+l.replace("URL=", "")+'"'
                    out1.append(url)
                elif l.startswith("Name="):
                    name = l.replace("Name=", "")
            if rewrite == True:
                open(f.replace(".desktop", ".html"), "wt").write(("\n").join(out1+out2))
                os.remove(f)
    relevant1 = relevant2

用于转换递归目录中现有链接的版本(单次运行)

#!/usr/bin/env python3
import os
import sys

dr = sys.argv[1]

out1 = ["<html>", "<body>", '<script type="text/javascript">']
out2 = ["</script>", "</body>", "</html>"]

for root, dirs, files in os.walk(dr):
    for f in files:
        if f.endswith(".desktop"):
            f = root+"/"+f
            rewrite = False
            lines = [l.strip() for l in open(f).readlines()]
            for i, l in enumerate(lines):
                if l.startswith("Type=Link"):
                    rewrite = True
                elif l.startswith("URL="): 
                    url = 'window.location.href = "'+l.replace("URL=", "")+'"'
                    out1.append(url)
                elif l.startswith("Name="):
                    name = l.replace("Name=", "")
            if rewrite == True:
                open(f.replace(".desktop", ".html"), "wt").write(("\n").join(out1+out2))
                os.remove(f)

要使用它,请将其保存为convert_links.py,并使用目标目录作为参数运行它:

python3 /path/to/convert_links.py <directory>

笔记

此版本基于这个很好的答案在超级用户上创建跨平台链接。

相关内容