У меня может быть текстовая функциональность Alt-Tab?

Когда-то давно был невероятный менеджер окон, названный "просвещением".

Если Вы использовали его, и Вы поражаете Alt+Tab затем, Вы видели маленький список заголовков окон друг ниже друга.

Как это:

  • user@remote-host
  • foo@db-server
  • emacs
  • ...

Или как это:

window-switcher-simple-and-beautiful

Мне понравился он много.

Я хочу это назад. Я имею в виду функцию, не приложение.

Я использую Ubuntu 18.04

Я не хочу видеть значки приложений как это:

alt-tab-is-useless-at-the-moment

У меня есть до пяти открытых терминалов. Если я нажму ключ окон, то я буду видеть примерно то же изображение (небольшая версия большого терминала) пять раз.

window-key-icons

Это занимает время и умственная энергия найти правильный терминал. И я хочу переключиться с клавиатурой только, не используя мышь.

Волшебство позади терминала:

xtermset -title foo

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

Таким образом, я могу различать несколько терминалов легко.

Как получить эту функцию, которая работала в 1998 году назад?

(Не говорите мне устанавливать менеджер окон просвещения, этот вопрос о простой функции, не приложении),

Пользователь "DK Bose" хотел, чтобы я показал вывод этих команд:

===> wmctrl -m
Name: GNOME Shell
Class: N/A
PID: N/A
Window manager's "showing the desktop" mode: N/A
tguettler@aptguettler:~
===> 


tguettler@aptguettler:~
===> wmctrl -lx
0x0200000a  0 desktop_window.Nautilus  aptguettler Schreibtisch
0x01c00178  0 Pidgin.Pidgin         aptguettler tbz
0x02600010  0 Navigator.Firefox     aptguettler command line - List of window names on ALT-Tab - Ask Ubuntu - Mozilla Firefox
0x02200010  0 Mail.Thunderbird      aptguettler Posteingang - tguettler@tbz-pariv.de (IMAP) - Mozilla Thunderbird
0x04400006  0 gnome-terminal-server.Gnome-terminal  aptguettler foooooo
0x044000ce  0 gnome-terminal-server.Gnome-terminal  aptguettler tguettler@aptguettler

Строка "foooooo" была установлена через xtermset -title foooooo. Заголовок был установлен в оболочке, которая выполняла ssh на удаленном сервере.

6
задан 2 March 2019 в 21:43

4 ответа

Я не уверен, что желательно попытаться изменить менеджер окон в Ubuntu 18.04. Менеджер окон интегрируется в GNOME Shell.

Можно найти Rofi подходящим для цели, которую Вы описываете при оставлении значения по умолчанию системы неповрежденным.

Rofi in window switcher mode

  • Rofi доступен в разделе вселенной.

  • Это имеет установленный размер 524 КБ и и очень немного зависимостей, которые Вы видите путем выполнения apt show rofi или путем моделирования его использования установки apt install -s rofi.

  • Rofi имеет несколько функций, но тот интереса здесь является переключателем окна.

После того как Rofi установлен:

  • Выполненный rofi -dump-config > ~/.config/rofi/config.rasi генерировать локальный файл конфигурации, который можно изменить для удовлетворения потребностям.

  • Предварительно просмотрите тему, которую требуется использовать путем выполнения rofi-theme-selector. Если Вы хотите настроить тему далее, Вы могли бы скопировать тему от/usr/share/rofi/themes до ~/.local/share/rofi/themes и дать ей новое имя для предотвращения беспорядка. Я люблю Темный как поп и назвал локальную версию myPop-темной. В изображениях, отправленных в этом ответе, я использовал myPop-темный.

Использование

Продемонстрировать использование Rofi в качестве альтернативы Alt+Tab системы:

  • Я открыл несколько окон включая пять xterm окон.

  • Я назначил Ctrl+Win+R комбинацией клавиатуры ярлыка для выполнения rofi -show window -theme myPop-Dark

В изображении, отправленном выше, существует три столбца. Если Вы всегда хотите только название приложения и заголовка окна, редактируете ~/.config/rofi/config.rasi для изменения прокомментированного строка форматов окна на

window-format: "{n}    {t}";

Можно также изменить ширину, высоту и местоположение rofi окна.

Для обеспечения окна, Вы хотите в фокус, используете клавиши со стрелками или Ваш указатель мыши, чтобы выделить запись и затем нажать Enter.

Если Вы имеете действительно длинный список окон, нажимаете клавишу, это уникально для окна, Вы хотите отфильтровать все другие окна. Если это не возможно, отфильтруйте записи путем ввода, как в анимации ниже, f, сопровождаемый o для ограничения списка окнами, содержащими строку "нечто".

Анимация ниже иллюстрирует это.

filtering windows

Для закрытия выделенного окна нажмите Shift+Delete.

7
ответ дан 23 November 2019 в 07:16

Ubuntu, включая 18,04, теперь основана на GNOME, и некоторые дополнительные функции могли быть сделаны доступными через GNOME Расширения Shell. Перейдите к веб-сайту и поиску: используйте "переключатель окна" в качестве ключевых слов, и соответствующий внутренний абонент может быть перечислен на первой странице результата поиска.

Этот кажется релевантным и сохраняемым:

Переключатель dlandau

switcher by dlandau in action

Окна переключателя или запускают приложения быстро путем ввода

Используйте настроенную глобальную горячую клавишу (Super+w по умолчанию) для открытия списка текущих окон. Введите часть имени или заголовок окна приложения, которое Вы хотите активировать и поразить, вводят или нажимают на объект, который Вы хотите активировать. Можно использовать клавиши со стрелками, чтобы перейти среди фильтрованного выбора и ввести разделенные критерии поиска нескольких пространств для фильтрации далее. Используйте Esc или нажмите где угодно вне переключателя для отмены.

Используйте настроенную глобальную горячую клавишу (Super+x по умолчанию) для открытия средства запуска приложения. Введите часть названия приложения, которое Вы хотите запустить и поразить, входят. Можно использовать Ctrl+Space или Ctrl+Tab для переключения между переключателем и средством запуска, или когда нет никаких открытых окон, соответствующих имени, но существуют приложения, режим переключается автоматически.

Можно настроить стиль и функциональность в предпочтениях.

Дополнительная Домашняя страница: https://github.com/daniellandau/switcher

Версия Shell: 3.30 3.28 3.26 3.24 3.22 3.20 3.18 3.16.3 3.16 3.14

Для привязки общего сочетания клавиш Alt+Tab или Super+Tab с этим расширением пользователь может быть обязан использовать обходное решение. Пользователь GitHub, PHLAK, отправил этот выпуск № 63 о GitHub и также объяснил обходное решение в нескольких комментариях:

Я хотел бы связать Переключатель с Супер + Вкладка, но не могу. Я также заметил, что не могу связать его с Высоким звуком + Вкладка также.


Я смог работать вокруг этого путем устанавливания значения непосредственно с dconf:

dconf write /org/gnome/shell/extensions/switcher/show-switcher "['<Super>tab']"

Можно также сделать то же при помощи dconf-config GUI.


Вам, возможно, также придется развязать любые предварительно сконфигурированные ярлыки с помощью того сочетания клавиш. А именно, "Приложения переключателя" связываются с Super+Tab в Gnome.

Можно изменить это путем открытия Settings и навигации к Devices > Keyboard. Затем поиск Super+Tab и измените или удалите эту привязку.

Отказ от ответственности: Я не использую Ubuntu 18.04 или GNOME Shell, таким образом, я не протестировал это расширение. Я просто заключил в кавычки наиболее на вид надежные ресурсы, найденные в сети. Снимок экрана был восстановлен и оптимизировал (122 КБ) в GIMP вместо этого, потому что исходный снимок экрана и изображение с анимацией были слишком большими (500 КБ, 7 МБ).

TL; DR Переходит к Shell GNOME веб-сайт Расширений и устанавливает предпочтительное расширение: Переключатель dlandau. Согласно совместимости с версией Shell.

5
ответ дан 23 November 2019 в 07:16

Я думаю, что Вы конкретно ищете функцию "Cycling through windows in a list", которая доступна в Тонких настройках Менеджера окон-> Циклически повторяющийся в XFCE.

ALT-TAB, циклически повторяющийся в списке

enter image description here

4
ответ дан 23 November 2019 в 07:16

Текстовая вкладка высокого звука

Последний приготовленный в домашних условиях:

В действии

enter image description here

Как настроить

Установка существует двух крошечных сценариев, чтобы быть сохраненной в один и тот же каталог:

сценарий 1

#!/usr/bin/env python3
import gi
gi.require_version("Gtk", "3.0")
gi.require_version('Wnck', '3.0')
from gi.repository import Gtk, Wnck, Gdk
import subprocess

css_data = """
.activestyle {
  background-color: grey;
  color: white;
  border-width: 1px;
  border-radius: 0px;
  border-color: white;
}
.defaultstyle {
  border-width: 0px;
  color: black;
  background-color: white;
}
"""

class AltTabStuff(Gtk.Window):
    def __init__(self):
        # css
        self.provider = Gtk.CssProvider.new()
        self.provider.load_from_data(css_data.encode())       
        Gtk.Window.__init__(
            self, title="AltTab replacement"
        )
        self.curr_index = 0
        self.connect('key-press-event', self.get_key)
        self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
        self.set_decorated(False)
        buttongrid = Gtk.Grid()
        self.add(buttongrid)
        self.connect("delete_event", Gtk.main_quit)

        wins = get_winlist()
        self.buttonindex = 0
        self.buttonsets = []
        index = 0
        for w in wins:
            button = Gtk.Button("\t" + w.get_name())
            button.set_relief(Gtk.ReliefStyle.NONE)
            buttongrid.attach(button, 0, index, 1, 1)
            index = index + 1
            button.connect("clicked", raise_window, w)
            self.buttonsets.append([button, w])
        self.set_focus()
        self.show_all()
        Gtk.main()

    def set_focus(self):
        for b in self.buttonsets:
            button = b[0]
            self.set_style(button, active=False)
        newactive = self.buttonsets[self.buttonindex][0]
        self.set_style(newactive, active=True)
        n_buttons = len(self.buttonsets)
        self.buttonindex = self.buttonindex + 1
        if self.buttonindex >= n_buttons:
            self.buttonindex = 0

    def set_style(self, button, active):
        st_cont = button.get_style_context()
        if active:
            st_cont.add_class("activestyle")
            st_cont.remove_class("defaultstyle")
        else:
            st_cont.remove_class("activestyle")
            st_cont.add_class("defaultstyle")
        Gtk.StyleContext.add_provider(
            st_cont,
            self.provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
        )

    def get_key(self, val1, val2):
        keyname = Gdk.keyval_name(val2.keyval)
        if keyname == "Tab":
            self.set_focus()
        elif keyname == "Alt_L":
            window = self.buttonsets[self.buttonindex-1][1]
            button = self.buttonsets[self.buttonindex-1][0]
            raise_window(button, window)
        elif keyname == "Escape":
            Gtk.main_quit()


def raise_window(button, window):
    subprocess.Popen(["wmctrl", "-ia", str(window.get_xid())])
    Gtk.main_quit()

def check_windowtype(window):
    try:
        return "WNCK_WINDOW_NORMAL" in str(
            window.get_window_type()
        )
    except AttributeError:
        pass

def get_winlist(scr=None):
    """

    """
    if not scr:
        scr = Wnck.Screen.get_default()
        scr.force_update()
    windows = [w for w in scr.get_windows() if check_windowtype(w)]
    return windows


AltTabStuff()

сценарий 2

#!/bin/bash

dr=`dirname $0`
f=$dr'/alttab_runner'

if ! pgrep -f $f
then
$f
else
echo "runs"
fi

Сделайте следующие шаги:

  1. Удостоверьтесь оба Wnck и wmctrl установлены:

    sudo apt install python3-gi gir1.2-wnck-3.0 wmctrl
    
  2. Сохраните сценарий 1 в пустой файл как (точно) alttab_runner, сценарий 2 как (точно) alttab_alternative. сделайте оба исполняемых файла сценариев

  3. Отключите существующий Alt-Tab:

    gsettings set org.gnome.desktop.wm.keybindings switch-applications '[]'
    
  4. Установите ярлык (точно) Alt-Tab для выполнения сценария 2:

    /path/to/alttab_alternative
    

Использование

Нажмите Alt + Вкладка, чтобы назвать переключатель (как в изображении), выпустить Высокий звук и нажать Tab, чтобы циклически повториться через окна, нажать Alt снова для выбора выбранного окна из списка.

Escape отклонит (закрывают) переключатель.

Опции

Если Вы хотели бы различные цвета, можно играть с CSS в сценарии 1 для установки собственного моделирования.

enter image description here enter image description here

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

css_data = """
.activestyle {
  background-color: blue;
  color: white;
  border-width: 1px;
  border-radius: 0px;
  border-color: white;
}
.defaultstyle {
  border-width: 0px;
  color: black;
  background-color: white;
}
"""

См. опции CSS Gtk здесь на шрифте и кнопках.


Править

Если требуется придерживаться точно Высокого звука +, Вкладка, в точном ключевом поведении как обычное, использует вместо сценария один:

#!/bin/bash

dr=`dirname $0`
user=$USER
f=$dr'/alttab_runner'
trg='/tmp/'$user'_alttab_trigger'

if ! pgrep -f $f
then
$f
else
echo "runs"
touch $trg
fi

И вместо сценария 2:

#!/usr/bin/env python3
import gi
gi.require_version("Gtk", "3.0")
gi.require_version('Wnck', '3.0')
from gi.repository import Gtk, Wnck, Gdk
import subprocess
from threading import Thread
import time
import os

trigger = os.path.join("/tmp", os.environ["USER"] + "_alttab_trigger")

css_data = """
.activestyle {
  background-color: grey;
  color: white;
  border-width: 1px;
  border-radius: 0px;
  border-color: white;
}
.defaultstyle {
  border-width: 1px;
  color: black;
  background-color: white;
}
"""

class AltTabStuff(Gtk.Window):
    def __init__(self):
        # apply css
        self.provider = Gtk.CssProvider.new()
        self.provider.load_from_data(css_data.encode())       
        Gtk.Window.__init__(
            self, title="AltTab replacement"
        )
        self.curr_index = 0
        self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
        self.set_decorated(False)
        buttongrid = Gtk.Grid()
        self.add(buttongrid)
        self.connect("delete_event", Gtk.main_quit)

        wins = get_winlist()
        self.buttonindex = 0
        self.buttonsets = []
        index = 0
        for w in wins:
            button = Gtk.Button("\t" + w.get_name())
            button.set_relief(Gtk.ReliefStyle.NONE)
            buttongrid.attach(button, 0, index, 1, 1)
            index = index + 1
            button.connect("clicked", raise_window, w)
            self.buttonsets.append([button, w])
        self.set_focus()

        # thread to watch the trigger file
        self.timer = Thread(target=self.wait)
        self.timer.setDaemon(True)
        self.timer.start()

        self.show_all()
        Gtk.main()

    def set_focus(self):
        # rotate the focus + styling
        for b in self.buttonsets:
            button = b[0]
            self.set_style(button, active=False)

        newactive = self.buttonsets[self.buttonindex][0]
        newselected = self.buttonsets[self.buttonindex][1]
        time.sleep(0.03)
        self.set_style(newactive, active=True)
        n_buttons = len(self.buttonsets)
        self.buttonindex = self.buttonindex + 1
        if self.buttonindex >= n_buttons:
            self.buttonindex = 0
        return newselected

    def wait(self):
        """
        wait loop; see if trigger file pops up, or we need to quit on immediate
        key release
        """
        newfocus = self.buttonsets[0][1]
        while True:
            time.sleep(0.05)
            if not self.key_checker():
                # try/except, in case no windows on workspace
                try:
                    self.activate(str(newfocus.get_xid()))
                except TypeError:
                    pass
                Gtk.main_quit()
            if os.path.exists(trigger):
                os.remove(trigger)
                newfocus = self.set_focus()

    def activate(self, arg1, arg2=None):
        # activate the selected window, close preview window
        w = arg2 or arg1
        subprocess.Popen(["wmctrl", "-ia", w])
        Gtk.main_quit()

    def set_style(self, button, active):
        st_cont = button.get_style_context()
        if active:
            # st_cont.add_class(Gtk.STYLE_CLASS_SUGGESTED_ACTION)
            st_cont.add_class("activestyle")
            st_cont.remove_class("defaultstyle")
        else:
            st_cont.remove_class("activestyle")
            # st_cont.remove_class("suggested-action")
            st_cont.add_class("defaultstyle")
        Gtk.StyleContext.add_provider(
            st_cont,
            self.provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
        )


    def key_checker(self):
        # check if keys are in a pressed state
        exclude = ["Button", "Virtual", "pointer"]
        keyboards = [
            k for k in get(["xinput", "--list"]).splitlines()
            if not any([s in k for s in exclude])
        ]
        dev_ids = [[
            s.split("=")[1] for s in k.split() if "id=" in s
        ][0] for k in keyboards]
        pressed = False
        for d in dev_ids:
            if "down" in get(["xinput", "--query-state", d]):
                pressed = True
                break
        return pressed


def get(cmd):
    # just a helper
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except (subprocess.CalledProcessError, TypeError, UnicodeDecodeError):
        pass


def raise_window(button, window):
    subprocess.Popen(["wmctrl", "-ia", str(window.get_xid())])
    Gtk.main_quit()


def check_windowtype(window):
    try:
        return "WNCK_WINDOW_NORMAL" in str(
            window.get_window_type()
        )
    except AttributeError:
        pass


def get_winlist(scr=None):
    if not scr:
        scr = Wnck.Screen.get_default()
        scr.force_update()
    windows = [w for w in scr.get_windows() if check_windowtype(w)]
    return windows


AltTabStuff()

Установка точно как первая версия:

  1. Удостоверьтесь оба Wnck и wmctrl установлены:

    sudo apt install python3-gi gir1.2-wnck-3.0 wmctrl
    
  2. Сохраните сценарий 1 в пустой файл как (точно) alttab_runner, сценарий 2 как (точно) alttab_alternative. сделайте оба исполняемых файла сценариев

  3. Отключите существующий Alt-Tab:

    gsettings set org.gnome.desktop.wm.keybindings switch-applications '[]'
    
  4. Установите ярлык (точно) Alt-Tab для выполнения сценария 2:

    /path/to/alttab_alternative
    
4
ответ дан 23 November 2019 в 07:16

Другие вопросы по тегам:

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