Вопрос или проблема
GTK приложения отмечают файлы как недавно использованные, добавляя их в XML-файл ~/.local/share/recently-used.xbel
, но я часто работаю с файлами из терминальных приложений, таких как latex, и они не отмечаются в списке GTK, и поэтому не доступны из закладки “Недавно использованные” в графических файловых браузерах/выборщиках и т.д.
Существует ли команда CLI, которую я могу использовать, чтобы явно добавлять файлы в список недавно использованных, для упрощения работы между терминалом и графическим интерфейсом в моей работе с Linux? Либо официальный способ, либо быстрый и простой хак с побочным эффектом записи в файл recently-used.xbel
!
Следующий скрипт на Python добавит все указанные в качестве аргументов файлы в список недавно использованных, используя GIO:
#!/usr/bin/python3
import gi, sys
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio, GLib
rec_mgr = Gtk.RecentManager.get_default()
for arg in sys.argv[1:]:
rec_mgr.add_item(Gio.File.new_for_path(arg).get_uri())
GLib.idle_add(Gtk.main_quit)
Gtk.main()
Последние две строки необходимы для запуска цикла событий Gtk; если этого не сделать, измененный сигнал от менеджера не будет обработан, и файлы не будут добавлены в список недавно использованных.
Вот еще одна версия на Javascript, которая использует Glib вместо Gtk. Основано на этой заплатке для gnome-shell.
#!/usr/bin/env gjs
imports.gi.versions.GLib = "2.0"
const { GLib } = imports.gi
function add
(uri, mtype) {
try {
let xbel, bmf
xbel = GLib.build_filenamev([ GLib.get_user_data_dir(), 'recently-used.xbel' ])
bmf = new GLib.BookmarkFile()
bmf.load_from_file(xbel)
bmf.add_application(uri, "Bred", 'bred %u')
bmf.set_mime_type(uri, mtype);
bmf.to_file(xbel)
}
catch (err) {
console.log(err.message)
}
}
function usage
() {
console.error('Использование: add-recent <файл> <mime-типа>')
}
if (ARGV.length == 2)
add(ARGV[0], ARGV[1])
else
usage()
Ответ или решение
Конечно, возможность интеграции функций графического интерфейса (GUI) с коммандной строкой (CLI) может значительно улучшить эффективность работы для пользователей, широко использующих обоих подхода. Проблема, с которой вы столкнулись, связана с тем, что управляющие терминалом приложения, такие как LaTeX, не регистрируют файлы в списке "недавно использованных" в графических файловых менеджерах, таких как GNOME или KDE, поскольку они не используют GTK API напрямую для этого. Однако, используя скрипты, написанные на языках Python и JavaScript, вы можете добавить файлы к этому списку вручную прямо из коммандной строки.
Теория
Работа с недавно использованными файлами в Linux осуществляется через систему файловых метаданных. В GNOME, например, эти данные хранятся в файле recently-used.xbel
, который находится в каталоге ~/.local/share
. Это XML-файл, содержащий информацию о недавно открытых файлах, и используется различными графическими приложениями для формирования соответствующих списков в интерфейсе пользователя.
Файлы добавляются в этот список с помощью библиотеки Glib или Gtk, что позволяет регистрировать действие по работе с файлами в стандартном XML-формате.
Пример: Скрипты на Python и JavaScript
-
Скрипт на Python:
Этот скрипт использует GIO (часть Glib) и Gtk для добавления файла в список недавно использованных:
#!/usr/bin/python3 import gi import sys gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gio, GLib rec_mgr = Gtk.RecentManager.get_default() for arg in sys.argv[1:]: rec_mgr.add_item(Gio.File.new_for_path(arg).get_uri()) GLib.idle_add(Gtk.main_quit) Gtk.main()
Скрипт получает файлы в качестве аргументов, преобразовывает пути файлов в URI, а затем добавляет их в менеджер недавно использованных файлов. Важно отметить, что используется Gtk.main(), чтобы обработать сигнал изменений и добавить элементы в файл.
-
Скрипт на JavaScript:
Этот скрипт делает то же самое с помощью GLib и JavaScript:
#!/usr/bin/env gjs imports.gi.versions.GLib = "2.0" const { GLib } = imports.gi function add(uri, mtype) { try { let xbel, bmf xbel = GLib.build_filenamev([ GLib.get_user_data_dir(), 'recently-used.xbel' ]) bmf = new GLib.BookmarkFile() bmf.load_from_file(xbel) bmf.add_application(uri, "Bred", 'bred %u') bmf.set_mime_type(uri, mtype); bmf.to_file(xbel) } catch (err) { console.log(err.message) } } function usage() { console.error('Usage: add-recent <filename> <mime-type>') } if (ARGV.length == 2) add(ARGV[0], ARGV[1]) else usage()
Здесь скрипт требует ввода файла и MIME-типа, загружает существующий файл
recently-used.xbel
, и добавляет информацию о новом файле.
Применение
Используя данные скрипты, вы можете улучшить взаимодействие между CLI и GUI в Linux-среде. Например, вы работаете с LaTeX из командной строки и хотите, чтобы отредактированные документы стали доступными в меню "Недавно использованные" вашего файлового менеджера. Для этого вы можете создать скрипт, который добавляет необходимые файлы в recently-used.xbel
после редактирования.
Такие интеграции повышают эффективность работы, позволяя пользователю работать с удобной ему средой без потери функциональности между разными интерфейсами.
Скрипты можно автоматизировать и добавлять в пайплайн рабочих задач, чтобы обеспечение синхронизации "недавно использованных файлов" больше не занимало вашего времени. Общая цель — сделать ваше технологическое окружение более последовательным и интуитивно понятным, сводя к минимуму необходимость в ручных действиях при переключении между разными типами интерфейса.