避免在多个 Okular 实例中打开同一个文件

避免在多个 Okular 实例中打开同一个文件

当对已打开的文件调用 okular 时,它只会启动另一个实例。这会导致混乱,例如,在编译 LaTeX 文档并重复启动查看器时,或者只是在忘记已打开文件并从文件管理器再次打开它时。

相反,Evince 会检测到这一点,并改为提升现有窗口。

如何使用 okular 实现这一点?

答案1

Okular 为这种情况提供的唯一选项是当文件在新选项卡中打开时。启用此功能后,可以使用“如果文件已打开则切换到选项卡”选项来实现所需的效果。相关选项在下面的屏幕截图中突出显示:

okular_settings_switch_to_existing_tab

答案2

这是一个快速而简单的技巧:它是一个仅检查现有实例的 Python 脚本。

将此脚本另存为/usr/local/bin/okular并使其可执行。由于通常$PATH设置为 ,因此中的文件/usr/local/bin优先于 中的文件/usr/bin,因此您的脚本将代替标准的 运行okular

#! /usr/bin/env python3

import subprocess
import sys
import os
import getpass

OKULAR_FN = "okular"
OKULAR_FULLPATH="/usr/bin/okular"

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_FULLPATH])
    else :
        filename = os.path.abspath(sys.argv[1])
        pidl = get_okular_instance(filename)
        if len(pidl) != 1 :
            runcmd([OKULAR_FULLPATH, filename])
        else :
            wid = get_window_id(pidl[0])
            if wid is None :
                runcmd([OKULAR_FULLPATH, filename])
            else :
                raise_window(wid)

if __name__ == "__main__" :
    main()

答案3

对我来说,命令行选项--unique有效。

文档仅表明了“唯一实例控制”一词,这听起来像是做了正确的事情,对我来说似乎确实如此。

相关内容