Câu hỏi Làm thế nào để thêm phần tử vào mảng gsettings tại vị trí cụ thể (được đưa ra bởi chỉ mục)?


Tôi muốn viết một kịch bản dịch devilspiecác quy tắc cửa sổ thành các quy tắc của compiz. Cài đặt Compiz có thể được thay đổi bởi gsettings phím trong đường dẫn org.compiz.profiles.unity.plugins.place. Có ba phím: viewport-matches, viewport-x-values và viewport-y-values. Thật không may mỗi khóa là một mảng và chỉ mục của các phần tử quan trọng.

Gsettings thiếu sự hỗ trợ của array các loại khác hơn là viết lại toàn bộ mảng cùng một lúc và tôi cần đặt mục trong mảng tại vị trí cụ thể (ví dụ: lúc bắt đầu, chỉ mục '1').

Tôi biết, nếu tôi không quan tâm đến chỉ mục, tôi có thể sử dụng

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

Bổ sung câu hỏi Làm thế nào để loại bỏ yếu tố từ mảng gsettings trong kịch bản?


2
2018-05-06 09:04


gốc


@SylvainPineau Tôi biết điều đó. Nhưng tôi sẽ không chấp nhận nó trước khi tôi biết nó hoạt động. Và một số thứ khác buộc tôi phải chia thời gian rảnh cho tôi mỏng hơn. Và, Sylvian thân yêu, tôi rất biết ơn công việc của bạn: câu trả lời của bạn thực sự vượt quá mong đợi của tôi; hiếm khi có trên Stack Exchange để nhận các kịch bản lệnh tùy chỉnh cho câu trả lời. Và bạn cũng đã làm chúng theo phong cách tốt! Theo tôi, +1 là cách để ít thể hiện đầy đủ số tiền trợ giúp bạn đã cho tôi. - Adam Ryczkowski


Các câu trả lời:


Tập lệnh python3 sau sẽ chèn (các) phần tử mới vào một chỉ mục đã cho:

#!/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



Bạn có thể giải thích thêm một chút, làm thế nào tôi nên sử dụng kịch bản của bạn? ;) - A.B.


Bạn cũng có thể thực hiện điều này thông qua tập lệnh 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