Это была бы потрясающая функция для доступа к недавно используемым документам от LibreOffice с динамическим quicklist в средстве запуска. Существует небольшое количество опыта в том, как создать пользовательский статический quicklists.
Но кто-либо там, кто мог бы дать некоторую конструктивную ориентацию о том, как создать динамический quicklist для недавно используемых документов в lo?
Wiki Ubuntu имеет очень краткое описание о том, как создать quicklists с Python или vala. Я не испытан ни в одном из двух, и я не нашел всесторонние сценарии в качестве примера для динамического quicklists там. Поэтому я ищу некоторый более легкий способ реализовать его или кто-то, кто уже делал/видел его.
Полная интеграция приложения с упомянутым динамическим quicklist - записи, скорее всего, должна быть сделана изнутри приложения. В конце концов, самая прямая информация об используемых файлах прибывает из самого приложения.
Однако начиная с редактирования исходного кода выходит за рамки, какого мы делаем, который не был бы дорогой для взятия.
Затем, что?
Это не означает, что мы не можем достигнуть в значительной степени точно того же результата, возможно, даже более гибким и общим способом, с "внешней стороны". Вся информация, в которой мы нуждаемся, доступна в динамично обновленном файле: ~/.local/share/recently-used.xbel
, от которого мы можем получить полную историю открытых файлов, соответствующей даты и информации времени и приложения, которое использовалось.
Кроме того, для добавления динамично обновленного раздела к средству запуска может очень хорошо быть сделано как часть "традиционного" (статического) раздела. Ключ решения должен затем создать процесс, который заботится о вышеупомянутых действиях, не добавляя значимую нагрузку для Вашей системы.
Как упомянуто в ссылке от вопроса, некоторый фоновый процесс был бы необходим так или иначе, чтобы отслеживать изменения и передать инструкции.
Сценарий ниже в значительной степени делает точно это.
Значения в сценарии ниже конкретно установлены для LibreOffice
и его документы. Без любого редактирования это может использоваться для добавления недавно используемый - раздел к LibreOffice-Writer
средство запуска. Это покажет последние 10 используемых документов, открытых любым из LibreOffice
- модули.
Решение может однако использоваться для добавления "недавно используемого" раздела ко многим приложениям с a .desktop
файл в /usr/share/applications
. Начиная с файла ~/.local/share/recently-used.xbel
Gtk
связанный, скорее всего, приложения с a Gtk
окно будет нашими потенциальными кандидатами (то есть, если приложение откроет и отредактирует файлы). Кроме того, количество файлов для показа произвольно.
Решение добавляет раздел к целенаправленному средству запуска в средстве запуска Единицы, показывая произвольное число недавно используемых файлов, например:
покажите последние семь файлов:
или последние десять файлов:
С той же простотой однако, мы можем дать gedit
средство запуска динамический раздел, показывая последние семь файлов, открытых с gedit
(см. изображение далее ниже),
Принятие Вас имеет предварительно установленный LibreOffice (загруженная версия не имеет обращения .desktop
файл в /usr/share/applications
который необходим сценарию, но где-то в другом месте, упомяните, необходимо ли установить отдельно загруженную версию LO),
Скопируйте сценарий ниже в пустой файл, сохраните его как 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="''+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
В главном разделе сценария можно установить много опций:
# --- 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
средство запуска, оставьте все как есть. В противном случае установите соответствующее средство запуска.
Тестовый прогон сценарий путем выполнения от терминала:
python3 /path/to/dynamic_recent.py
Сценарий скопировал глобальное .desktop
файл к ~/.local/share/applications
(в этом случае ~/.local/share/applications/libreoffice-writer.desktop
). Перетащите локальную копию к средству запуска (еще, необходимо было бы зарегистрироваться/в).
Если все хорошо работает, добавьте его для Запущения Приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:
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"
Сценарий периодически просматривает файл ~/.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
принадлежите динамично обновленному разделу.
Некоторые основные улучшения были просто сделаны:
.xbel
файл, в то время как целевое приложение работает (так как не будет изменений в недавно используемом списке, если приложение не будет работать). Сценарий уже был низким на соке, но теперь, только следящий если выполнение приложения, средства еще меньше для Вашей системы..xbel
файл имел двойные упоминания о новых файлах; один с, и один без расширения. Эффект этого теперь устраняется.