Вопрос Как добавить элемент в массив gsettings в определенном месте (заданный индексом)?


Я хочу написать сценарий, который переводит devilspie's правила окна в правила compiz. Настройки Compiz можно изменить gsettings ключи в пути org.compiz.profiles.unity.plugins.place, Есть три ключа: viewport-matches, viewport-x-values а также viewport-y-values, К сожалению, каждый ключ представляет собой массив, и имеет значение индекс элементов.

Gsettings не хватает поддержки array типы, кроме перезаписи всего массива сразу, и мне нужно разместить элемент в массиве в определенном месте (например, в начале, индекс «1»).

Я знаю, что если меня не интересует индекс, я могу использовать

gsettings set ${schema} ${key} \"`gsettings get ${schema} ${key} | sed s/.$//`, ${value}]\"

Вопрос дополняет Как удалить элемент из массива gsettings в скрипте?


2
2018-05-06 09:04


происхождения


@SylvainPineau Я это знаю. Но я не принял бы это, пока не узнаю, что это работает. И некоторые другие вещи заставили меня разделить меня на свободное время, даже тоньше. И, дорогая Сильвия, я очень благодарны за вашу работу: ваш ответ на самом деле превзошел мои ожидания; на Stack Exchange на реестре редко можно получить собственные сценарии для ответа. И вы сделали их в хорошем стиле! На мой взгляд, +1 - это способ немного, чтобы полностью выразить объем помощи, которую вы мне дали. - Adam Ryczkowski


ответы:


Следующий скрипт 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)])

2
2018-05-06 10:44



Можете ли вы объяснить немного больше, как я должен использовать ваш скрипт? ;) - A.B.


Вы также можете сделать это с помощью сценария bash:

#!/bin/bash

SCHEMA="your.wanted.schema"
KEY="your-wanted-key"

STATUS=$(gsettings get ${SCHEMA} ${KEY})

# Optional proof, whether value to add already exsists
if [[ $STATUS == *"'to.add.value'"* ]]; then
    echo "to.add.value is already in the list!"
else
    gsettings set ${SCHEMA} ${KEY} "${STATUS%]*}, 'to.add.value']"
    echo "Added to.add.value to the list."
fi

0
2018-03-16 00:32