цикл с массивом в оболочке TCSH

Ради своих собственных нужд я собрал следующий скрипт. Он использует xdotoolдля получения списка запущенных браузеров (, исправленных для Firefox + Chrome прямо сейчас ). Он отображает результаты в виде списка и позволяет выбрать соответствующий браузер. Он переключается на рабочий стол (Я использую i3wm ), активирует окно браузера и вводит URL-адрес. Это определенно не самый красивый код... Но он работает:)

#!/usr/bin/env python3

import sys
import tkinter
import subprocess

URL = sys.argv[1] if len(sys.argv) > 1 else None
SEARCH_STRING = 'Mozilla Firefox|Google Chrome'

def get_options():
    cmd = ['xdotool','search','--name',SEARCH_STRING]
    result = subprocess.run(cmd, stdout=subprocess.PIPE)
    window_ids = result.stdout.decode('utf-8').rstrip().split("\n")

    options = []
    for id in window_ids:
        cmd = ['xdotool','getwindowname', id]
        result = subprocess.run(cmd, stdout=subprocess.PIPE)
        title = result.stdout.decode('utf-8').rstrip()
        options.append((title, id))

    return options

def kill_window(event = None):
    root.destroy()

def select_prev_option(event):
    val = curr_var.get()
    idx = [i for i, option in enumerate(OPTIONS) if option[1] == val][0]
    if idx > 0:
        curr_var.set(OPTIONS[idx-1][1])

def select_next_option(event):
    val = curr_var.get()
    idx = [i for i, option in enumerate(OPTIONS) if option[1] == val][0]
    if idx < len(OPTIONS)-1:
        curr_var.set(OPTIONS[idx+1][1])

def execute_option(e = None):
    window_id = curr_var.get()

    cmd = ['xdotool', 'get_desktop']
    result = subprocess.run(cmd, stdout=subprocess.PIPE)
    current_desktop = int(result.stdout.decode('utf-8').rstrip())

    cmd = ['xdotool', 'get_desktop_for_window', window_id]
    result = subprocess.run(cmd, stdout=subprocess.PIPE)
    window_desktop = int(result.stdout.decode('utf-8').rstrip())

    if current_desktop != window_desktop:
        cmd = ['xdotool', 'set_desktop', str(window_desktop)]
        result = subprocess.run(cmd, stdout=subprocess.PIPE)

    cmd = [ 'xdotool', 'windowactivate', '--sync', window_id ]
    result = subprocess.run(cmd, stdout=subprocess.PIPE)

    if URL:
        cmd = [
            'xdotool', 'key','--clearmodifiers','--window', window_id, 'ctrl+t',
            'sleep', '.1',
            'type', '--clearmodifiers', URL
        ]
        result = subprocess.run(cmd, stdout=subprocess.PIPE)

        cmd = ['xdotool','key','--clearmodifiers','--window', window_id, 'Return']
        result = subprocess.run(cmd, stdout=subprocess.PIPE)

    kill_window()


root = tkinter.Tk()
root.tk.call('tk', 'scaling', 4.0)
root.attributes('-type', 'dialog')

OPTIONS = get_options()

curr_var = tkinter.StringVar()
curr_var.set(OPTIONS[0][1])

max_len = max([len(t) for t, i in OPTIONS])

for text, mode in OPTIONS:
    b = tkinter.Radiobutton(
        root,
        text=text,
        variable=curr_var,
        value=mode,
        indicatoron=0,
        font=("Arial", 12),
        width=max_len,
        anchor=tkinter.W,
        command=execute_option
    )
    b.pack(anchor=tkinter.W)


root.bind("<j>", select_next_option)
root.bind("<Down>", select_next_option)
root.bind("<k>", select_prev_option)
root.bind("<Up>", select_prev_option)
root.bind("<Return>", execute_option)

root.bind("<Control-q>", kill_window)
root.bind("<Control-w>", kill_window)
root.protocol("WM_DELETE_WINDOW", kill_window)

root.mainloop()

Я создал файл рабочего стола, указывающий на этот скрипт, и установил браузер по умолчанию, используя:

xdg-settings set default-web-browser browserpicker.desktop
xdg-mime default browserpicker.desktop x-scheme-handler/https
xdg-mime default browser.desktop x-scheme-handler/http
1
15.04.2021, 15:26
1 ответ

Присваивание set arr=($list_one $list_two)объединяет списки в один.

Я не совсем уверен, что вы здесь ищете, но вы можете просмотреть имена списков с помощью

set names=(list_one list_two)

foreach i ($names)
    echo $i
end

Но переход оттуда к фактическому использованию первых двух списков после того, как вы записали их имена в переменную, кажется более сложным. Я не могу найти, поддерживает ли tcsh косвенные ссылки на переменные, кроме как через eval. Кажется, что-то вроде этого работает, но правильное цитирование в eval кажется непостоянным:

#!/usr/bin/tcsh
set l1 = (aa bb cc)
set l2 = (dd ee)
set names = (l1 l2)

foreach i ($names)
    eval set x = \(\$$i\)
    foreach j ($x)
        echo $i $j
    end
end

Но значения, содержащие пробелы, разделяются, и я понятия не имею, как это исправить.


Честно говоря, я бы отказался от Tcsh и сделал бы то же самое, например, в. Зш:

l1=(aa bb cc)
l2=(cc dd)
names=(l1 l2)

for i in $names; do
    for j in ${(P)i}; do
        echo $i $j
    done
done

Это должно иметь дело с пробелами в значениях, но пропускает пустые элементы.

2
28.04.2021, 22:52

Теги

Похожие вопросы