Como adicionar elementos à matriz gsettings na localização específica (dada pelo índice)?

2

Eu quero escrever um script que traduza as regras de janelas de devilspie em regras de compiz. As configurações do Compiz podem ser alteradas por gsettings keys no caminho org.compiz.profiles.unity.plugins.place . Existem três chaves: viewport-matches , viewport-x-values e viewport-y-values . Infelizmente, cada chave é uma matriz e o índice dos elementos é importante.

Gsettings não tem suporte de array tipos além de reescrever todo o array de uma só vez, e eu preciso colocar um item no array no local específico (digamos, no começo, index '1').

Eu sei que, se eu não me importar com o índice, posso usar

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

A questão complementa Como remover o elemento do gsettings array no script?

    
por Adam Ryczkowski 06.05.2014 / 11:04

2 respostas

2

O seguinte script python3 irá inserir novos elementos em um determinado índice:

#!/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)])
    
por Sylvain Pineau 06.05.2014 / 12:44
0

Você também pode fazer isso por meio de um script 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
    
por Bjarne Roß 16.03.2017 / 01:32