Не открывайте один и тот же файл в нескольких экземплярах Okular.

При вызове файла, который уже открыт, Okular просто запустит другой экземпляр. Это приводит к беспорядку, например, при компиляции документов LaTeX и повторном запуске средства просмотра, или просто, когда кто-то забыл открыть файл и открыть его снова из файлового менеджера.

Evince наоборот обнаружит это и вместо этого откроет существующее окно.

Как этого добиться с помощью окулара?

3 ответа

Решение

Вот быстрый и грязный трюк: это скрипт Python, который просто проверяет существующий экземпляр.

Чтобы использовать это, переименуйте /usr/bin/okular в /usr/bin/okular.real и сохраните этот скрипт как /usr/bin/okular,

#! /usr/bin/env python3

import subprocess
import sys
import os
import getpass

OKULAR_FN = "okular.real"

def get_okular_instance(filename) :
    try :
        lproc = subprocess.check_output(["ps", "-C", OKULAR_FN, "-o", "pid,user,args", "--no-headers"], universal_newlines=True).splitlines()
    except subprocess.CalledProcessError :
        return []
    result = []
    me = getpass.getuser()
    for proc in lproc :
        pid, user, _, args = proc.split(maxsplit=3)
        if user == me and args == filename :
            result.append(pid)
    return result

def get_window_id(pid) :
    fenetres = subprocess.check_output(["wmctrl", "-ulp"], universal_newlines=True)
    for f in fenetres.splitlines() :
        donnees = f.split()
        if len(donnees) < 3 :
            continue
        if donnees[2] == pid :
            return donnees[0]
    return None

def raise_window(wid) :
    subprocess.call(["wmctrl", "-i", "-a", wid])

def runcmd(cmdl) :
    subprocess.Popen(cmdl, stdin=None, stdout=None, stderr=None, close_fds=True)

def main() :
    if len(sys.argv) < 2 :
        runcmd([OKULAR_FN])
    else :
        filename = os.path.abspath(sys.argv[1])
        pidl = get_okular_instance(filename)
        if len(pidl) != 1 :
            runcmd([OKULAR_FN, filename])
        else :
            wid = get_window_id(pidl[0])
            if wid is None :
                runcmd([OKULAR_FN, filename])
            else :
                raise_window(wid)

if __name__ == "__main__" :
    main()

Единственный вариант на такой случай, который предусмотрен в Okular, — это открытие файлов в новых вкладках. Когда это включено, для достижения желаемого эффекта можно использовать опцию «переключиться на вкладку, если файл уже открыт». Соответствующая опция выделена на скриншоте ниже:

Для меня опция командной строки --unique работает.

В документации указан только термин "уникальный контроль экземпляра", который звучит так, как будто он делает правильные вещи, и для меня это кажется.

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