如何在特定位置(由索引给出)向 gsettings 数组添加元素?

Ada*_*ski 5 command-line bash gsettings dconf

我想编写一个脚本,将devilspie“窗口规则”转换为“compiz”规则。Compiz 设置可以通过gsettingspath 中的键更改org.compiz.profiles.unity.plugins.place。共有三个键:viewport-matchesviewport-x-valuesviewport-y-values。不幸的是,每个键都是一个数组,元素的索引很重要。

Gsettingsarray除了一次重写整个数组之外,缺少任何类型的支持,我需要将数组中的项目放置在特定位置(例如,在开头,索引“1”)。

我知道,如果我不关心索引,我可以使用

gsettings set ${schema} ${key} \"`gsettings get ${schema} ${key} | sed s/.$//`, ${value}]\"
Run Code Online (Sandbox Code Playgroud)

问题补充了如何从脚本中的 gsettings 数组中删除元素?

Syl*_*eau 3

以下 python3 脚本将在给定索引处插入新元素:

#!/usr/bin/env python3

import argparse
import subprocess

parser = argparse.ArgumentParser()
parser.add_argument("schema", help="gsettings shema", metavar="SCHEMA")
parser.add_argument("key", help="gsettings key", metavar="KEY")
parser.add_argument("index",
                    help="KEY array index where VALUE(s) need to be inserted",
                    metavar="INDEX", type=int)
parser.add_argument("value",
                    help="gsettings VALUE(s) to add to the KEY array",
                    metavar="VALUE", nargs='*')

args = parser.parse_args()

array = eval(subprocess.check_output(["gsettings", "get", args.schema, args.key]))
for v in sorted(args.value, reverse=True):
    try:
        value = eval(v)
    except NameError:
        value = v
    array.insert(args.index, value)
subprocess.call(["gsettings", "set", args.schema, args.key, str(array)])
Run Code Online (Sandbox Code Playgroud)