Могу ли я пометить файлы как недавно использованные через командную строку?

Вопрос или проблема

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

  1. Скрипт на 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(), чтобы обработать сигнал изменений и добавить элементы в файл.

  2. Скрипт на 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 после редактирования.

Такие интеграции повышают эффективность работы, позволяя пользователю работать с удобной ему средой без потери функциональности между разными интерфейсами.

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

Оцените материал
Добавить комментарий

Капча загружается...