如何为Unity Launcher添加最近使用的文件的动态,特定于应用程序的快捷列表?

使用启动器中的动态快速列表从LibreOffice访问最近使用过的文档将是一个很棒的function。 在如何创建自定义静态快速列表方面有相当多的经验 。

但是,是否有人可以就如何为最近使用的文档构建动态快速列表提供一些建设性的指导?

Ubuntu wiki有一个关于如何使用python或vala创建快速列表的简短描述 。 我没有经验,我没有找到动态快速列表的全面示例脚本。 因此,我正在寻找一些更简单的方法来实现它或已经完成/看过它的人。

将动态“最近使用的”部分添加到应用程序的启动器

应用程序与提到的动态快速列表条目的完全集成最有可能需要应用程序内部完成。 毕竟,有关已使用文件的最直接信息来自应用程序本身。

但是,由于编辑源代码超出了我们正在做的范围,因此这不是一条可行的道路。

那又怎样?

这并不意味着我们无法从“外部”获得几乎完全相同的结果,甚至可能以更灵活和更通用的方式实现。 我们需要的所有信息都可以在动态更新的文件中找到: ~/.local/share/recently-used.xbel ,我们可以从中检索已打开文件的完整历史记录,相应的日期和时间信息以及使用的应用程序。

此外,将动态更新的部分添加到启动器可以很好地作为“传统”(静态)部分的一部分来完成。 然后,解决方案的关键是创建一个处理上述操作的流程,而不会给系统增加明显的负担。
正如问题链接中所提到的,无论如何都需要一些后台流程来跟踪更改并传递指令。

下面的脚本正是这样做的。

解决方案; 后台脚本

下面脚本中的值是专门为LibreOffice及其文档设置的。 没有任何编辑,它可以用于将最近使用的部分添加到LibreOffice-Writer启动器。 它将显示由任何LibreOffice -modules打开的​​最后10个使用过的文档。

但是,该解决方案可用于在/usr/share/applications使用.desktop文件向许多应用程序添加“最近使用过的”部分。 由于~/.local/share/recently-used.xbel文件与Gtk相关,很可能,具有Gtk窗口的应用程序将是我们的潜在候选者(即,如果应用程序打开并编辑文件)。 此外,要显示的文件数是任意的。

看起来如何

该解决方案为Unity启动器中的目标启动器添加了一个部分,显示了最近使用的任意数量的文件,例如:

  • 显示最后七个文件:

    在此处输入图像描述

  • 或者最后十个文件:

    在此处输入图像描述

  • 然而,同样的方便,我们可以给gedit启动器一个动态部分,显示最后七个文件,用gedit打开(参见下面的图片)

如何使用

假设您预先安装了LibreOffice(下载的版本在/usr/share/applications中没有引用.desktop文件,这是脚本需要的,但在其他地方,请提及是否需要设置单独下载的LO版本)

  1. 将下面的脚本复制到一个空文件中,将其另存为dynamic_recent.py对于LibreOffice ,进程名称为soffice ,已在脚本中正确设置。

     #!/usr/bin/env python3 import subprocess import os import time import shutil # --- set the number of docs to show in recently used n = 7 # --- set the process name of the targeted application application = "soffice" #--- ONLY change the value below into "xdg-open" if you do not use LO preinstalled # else the value should be the same as in application = (above) open_cmd = "soffice" # --- set the targeted .desktop file (eg "gedit.desktop") target = "libreoffice-writer.desktop" # --- don't change anything below home = os.environ["HOME"]+"/.local/share" loc = home+"/applications/"+target recdata = home+"/recently-used.xbel" def runs(app): try: # see if the application is running app = subprocess.check_output(["pgrep", app]).decode("utf-8") except subprocess.CalledProcessError: return False else: return True def get_lines(): # retrieve information from the records: # -> get bookmark line *if* the application is in the exec= line with open(recdata) as infile: db = [] for l in infile: if ' 
  2. 在脚本的head部分,您可以设置许多选项:

     # --- set the number of docs to show in recently used n = 7 # --- set the process name of the targeted application application = "soffice" #--- ONLY change the value below into "xdg-open" if you do not use LO preinstalled # else the value should be the same as in application = (above) open_cmd = "soffice" # --- set the targeted .desktop file (eg "gedit.desktop") target = "libreoffice-writer.desktop" 

    如果你想将动态部分添加到LO-Writer启动器中,大多数选项都不言自明,请保持原样。 如果没有,请设置适当的启动器。

  3. 通过从终端运行来测试脚本:

     python3 /path/to/dynamic_recent.py 
  4. 该脚本将全局.desktop文件复制到~/.local/share/applications (在本例中为~/.local/share/applications/libreoffice-writer.desktop )。 将本地副本拖到启动器(否则您需要注销/进入)。

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

     python3 /path/to/dynamic_recent.py 

在其他应用程序上使用它

如上所述,您可以轻松地使用该脚本将动态“最近使用的”部分添加到其他应用程序的启动器中。 为此,请参阅脚本head部分的gedit示例设置:

 # --- set the number of docs to show in recently used n = 7 # --- set the process name of the targeted application application = "gedit" #--- ONLY change the value below into "xdg-open" if you do not use LO preinstalled # else the value should be the same as in application = (above) open_cmd = "gedit" # --- set the targeted .desktop file (eg "gedit.desktop") target = "gedit.desktop" 

在此处输入图像描述

这个怎么运作

  • 该脚本定期查看文件~/.local/share/recently-used.xbel以查找匹配文件,使用LibreOffice打开(processname: soffice

    它使用一种非常快速的算法,一次性“射击”文件,以检索所需的行(每个“记录”两个)。 结果是剧本的果汁非常低。

  • 一旦从文件中检索到相关行,则按日期/时间对行进行排序,从而创建相应应用程序的最近使用的文件的“前十”(或任何其他数量)。

  • 在更改此列表时,才会更新.desktop文件。

我可以注意到也没有测量任何额外的负载到我的系统,在后台运行脚本。

测试于14.04 / 15.10

如何恢复原始启动器

只需在~/.local/share/applications删除启动器的本地副本即可

笔记

  • 如果您使用Unity快速列表编辑器编辑启动器(快速列表),则应避免使用此答案中的动态更新的“上次使用”部分编辑启动器。 您使用QUicklist Editor进行的编辑将立即被脚本覆盖。

  • 您可以手动编辑快速列表,但请确保在Actions= - 行之前 (在左侧) divider1 之前添加新项目

    Actions=Window;Document; ;aap.sh;Todo;pscript_2.py;currdate;bulkmail_llJacob;verhaal;test doc;

    divider1 右侧的所有项目都属于动态更新的部分。


主要编辑

刚刚做了一些重大改进:

  1. 现在,脚本在目标应用程序运行时检查.xbel文件(因为如果应用程序未运行,最近使用的列表将不会发生更改)。 该脚本已经很少了,但现在,只关注应用程序是否运行,对您的系统来说意味着更少。
  2. 在15.04+中,结果certificate.xbel文件有双重提及的新文件; 一个,一个没有扩展。 现在已经消除了这种影响。