Как я могу добавить динамический, специализированный quicklist для недавно используемых файлов к Средству запуска Единицы?

Это была бы потрясающая функция для доступа к недавно используемым документам от LibreOffice с динамическим quicklist в средстве запуска. Существует небольшое количество опыта в том, как создать пользовательский статический quicklists.

Но кто-либо там, кто мог бы дать некоторую конструктивную ориентацию о том, как создать динамический quicklist для недавно используемых документов в lo?

Wiki Ubuntu имеет очень краткое описание о том, как создать quicklists с Python или vala. Я не испытан ни в одном из двух, и я не нашел всесторонние сценарии в качестве примера для динамического quicklists там. Поэтому я ищу некоторый более легкий способ реализовать его или кто-то, кто уже делал/видел его.

4
задан 13 April 2017 в 15:24

1 ответ

Добавление динамического "недавно используемого" раздела к средству запуска приложения

Полная интеграция приложения с упомянутым динамическим quicklist - записи, скорее всего, должна быть сделана изнутри приложения. В конце концов, самая прямая информация об используемых файлах прибывает из самого приложения.

Однако начиная с редактирования исходного кода выходит за рамки, какого мы делаем, который не был бы дорогой для взятия.

Затем, что?

Это не означает, что мы не можем достигнуть в значительной степени точно того же результата, возможно, даже более гибким и общим способом, с "внешней стороны". Вся информация, в которой мы нуждаемся, доступна в динамично обновленном файле: ~/.local/share/recently-used.xbel, от которого мы можем получить полную историю открытых файлов, соответствующей даты и информации времени и приложения, которое использовалось.

Кроме того, для добавления динамично обновленного раздела к средству запуска может очень хорошо быть сделано как часть "традиционного" (статического) раздела. Ключ решения должен затем создать процесс, который заботится о вышеупомянутых действиях, не добавляя значимую нагрузку для Вашей системы.
Как упомянуто в ссылке от вопроса, некоторый фоновый процесс был бы необходим так или иначе, чтобы отслеживать изменения и передать инструкции.

Сценарий ниже в значительной степени делает точно это.

Решение; фоновый сценарий

Значения в сценарии ниже конкретно установлены для LibreOffice и его документы. Без любого редактирования это может использоваться для добавления недавно используемый - раздел к LibreOffice-Writerсредство запуска. Это покажет последние 10 используемых документов, открытых любым из LibreOffice - модули.

Решение может однако использоваться для добавления "недавно используемого" раздела ко многим приложениям с a .desktop файл в /usr/share/applications. Начиная с файла ~/.local/share/recently-used.xbel Gtk связанный, скорее всего, приложения с a Gtk окно будет нашими потенциальными кандидатами (то есть, если приложение откроет и отредактирует файлы). Кроме того, количество файлов для показа произвольно.

Как это смотрит

Решение добавляет раздел к целенаправленному средству запуска в средстве запуска Единицы, показывая произвольное число недавно используемых файлов, например:

  • покажите последние семь файлов:

    enter image description here

  • или последние десять файлов:

    enter image description here

  • С той же простотой однако, мы можем дать gedit средство запуска динамический раздел, показывая последние семь файлов, открытых с gedit (см. изображение далее ниже),

Как использовать

Принятие Вас имеет предварительно установленный LibreOffice (загруженная версия не имеет обращения .desktop файл в /usr/share/applications который необходим сценарию, но где-то в другом месте, упомяните, необходимо ли установить отдельно загруженную версию 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 (e.g. "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 '<bookmark href="file://' in l:
                    sub = l
                elif 'exec="&apos;'+application in l:
                    db.append(sub)
        # fix bug in xbel -file in 15.04
        relevant = [l.split('="') for l in set(db) if all([not "/tmp" in l, "." in l])]
        relevant = [[it[1][7:-7], it[-2][:-10]] for it in relevant]
        relevant.sort(key=lambda x: x[1])
        return [item[0].replace("%20", " ") for item in relevant[::-1][:n]]
    
    def create_section(line):
        # create shortcut section
        name = line.split("/")[-1]
        return [[
            "[Desktop Action "+name+"]",
            "Name="+name,
            "Exec="+open_cmd+" '"+line+"'",
            "\n",
            ], name]
    
    def setup_dirs():
        # copy the global .desktop file to /usr/share/applications/
        glo = "/usr/share/applications/"+target
        if not os.path.exists(loc):
            shutil.copy(glo,loc)
    
    def edit_launcher(newdyn, target, actionlist):
        # read the current .desktop file
        ql = [list(item) for item in list(enumerate(open(loc).read().splitlines()))]
        # find the Actions= line
        currlinks = [l for l in ql if "Actions=" in l[1]]
        # split the line (if it exists)  by the divider as delimiter 
        linkline = currlinks[0][1].split("divider1")[0] if currlinks else None
        # define the shortcut sections, belonging to the dynamic section (below the divider)
        lowersection = [l for l in ql if "[Desktop Action divider1]" in l]
        # compose the new Actions= line
        addlinks = (";").join(actionlist) + ";"
        if linkline:
            newlinks = linkline + addlinks
            ql[currlinks[0][0]][1] = newlinks
            # get rid of the "dynamic" section  
            ql = ql[:lowersection[0][0]] if lowersection else ql
            # define the new file
            ql = [it[1] for it in ql]+newdyn
            with open(loc, "wt") as out:
                for l in ql:
                    out.write(l+"\n")
        else:
            newlinks = "Acrions="+addlinks
    
    setup_dirs()
    lines1 = []
    
    while True:
        time.sleep(2)
        # if the application does not run, no need for a check of .xbel
        if runs(application):
            lines2 = get_lines()
            # (only) if the list of recently used changed: edit the quicklist
            if lines1 != lines2:
                actionlist = ["divider1"]
                newdyn = [
                    "[Desktop Action divider1]",
                    "Name=" + 37*".",
                    "\n",
                    ]
                for line in lines2:
                    data = create_section(line)
                    actionlist.append(data[1])
                    section = data[0]
                    for l in section:
                        newdyn.append(l)
                edit_launcher(newdyn, target, actionlist)           
            lines1 = lines2
    
  2. В главном разделе сценария можно установить много опций:

    # --- 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 (e.g. "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. Если все хорошо работает, добавьте его для Запущения Приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:

    python3 /path/to/dynamic_recent.py
    

Использовать его на других приложениях

Как упомянуто, можно легко использовать сценарий для добавления динамического "недавно используемого" раздела к средству (средствам) запуска другого приложения. Для этого посмотрите 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 (e.g. "gedit.desktop")
target = "gedit.desktop"

enter image description here

Как это работает

  • Сценарий периодически просматривает файл ~/.local/share/recently-used.xbel найти соответствие файлам, открытым с LibreOffice (processname: soffice)

    Это использует довольно алгоритм FAST, чтобы сделать так, "стреляя" через файл в единственной передаче, получить необходимые строки (два на "запись"). Результат состоит в том, что сценарий является очень низким на соке.

  • После того как соответствующие строки получены из файла, строки отсортированы по дате/времени, создав "лучшие десять" (или любое другое число) последний раз используемых файлов соответствующего приложения.

  • ТОЛЬКО ЕСЛИ этот список изменяется, .desktop файл обновляется.

Я мог заметить, ни измерить любую дополнительную загрузку в свою систему, запустив скрипт в фоновом режиме.

Протестированный по телефону 14.04/15.10

Как восстановить исходное средство запуска

Просто удалите локальную копию средства запуска в ~/.local/share/applications

Примечания

  • В случае, если Вы используете Единицу Редактор Quicklist для редактирования средств запуска (quicklists), необходимо постараться не редактировать средства запуска с динамично обновленный "последний используемый" - разделяют из этого ответа. Редактирования, которые Вы делаете с Редактором QUicklist, будут немедленно перезаписаны сценарием.

  • Можно отредактировать quicklist вручную, но удостовериться, что Вы добавляете новый объект прежде (на левой стороне) divider1 в Actions= - строка

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

    Все объекты справа от divider1 принадлежите динамично обновленному разделу.


Основное редактирование

Некоторые основные улучшения были просто сделаны:

  1. Сценарий теперь только проверяет .xbel файл, в то время как целевое приложение работает (так как не будет изменений в недавно используемом списке, если приложение не будет работать). Сценарий уже был низким на соке, но теперь, только следящий если выполнение приложения, средства еще меньше для Вашей системы.
  2. В 15,04 +, это складывается .xbel файл имел двойные упоминания о новых файлах; один с, и один без расширения. Эффект этого теперь устраняется.

4
ответ дан 1 December 2019 в 09:47

Другие вопросы по тегам:

Похожие вопросы: