Альтернативное управление окнами в Linux

    Я из тех, кто ставит на Caps Lock переключение раскладки потому, что лень нажимать 2 клавиши, когда можно нажимать одну. Я бы даже хотел 2 ненужные клавиши: одну бы я использовал для включения английской раскладки, а вторую для русской. Но вторая ненужная клавиша — это вызов контекстного меню, которая настолько ненужная, что выпиливается многими производителями ноутбуков. Так что приходится довольствоваться тем, что есть.


    А ещё я не хочу при переключении окон искать их иконки на панели задач, ловить взглядом названия при листании через Alt+Tab, листать рабочие столы и т. д. Я хочу нажать комбинацию клавиш (в идеале вообще одну, но свободных ненужных клавиш уже нет) и сразу попасть в нужное мне окно. Например так:


    • Alt+F: Firefox
    • Alt+D: Firefox (Private Browsing)
    • Alt+T: Terminal
    • Alt+M: Калькулятор
    • Alt+E: IntelliJ Idea
    • и т. д.

    Причём, по нажатию, например, на Alt+M я хочу видеть калькулятор вне зависимости от того, запущена ли в данный момент эта программа. Если запущена, то её окну надо передать фокус, а если нет — запустить нужную программу и передать фокус когда она загрузится.


    На случаи, которые не покрываются предыдущим сценарием, я хочу иметь универсальные комбинации клавиш, на которые можно легко назначить любые из открытых окон. Например, у меня назначены 10 комбинаций от Alt+1 до Alt+0, которые не привязанные ни к каким программам. Я могу просто нажать Alt+1 и окно, которое сейчас в фокусе, будет получать фокус при нажатии Alt+1.


    Под катом описание ещё пары фич и ответ на то, как можно это сделать. Но сразу предупрежу, что подобная кастомизация «под себя» может вызвать сильную зависимость и даже ломку при необходимости использовать Windows, Mac OS или даже чужой компьютер с Linux.


    На самом деле, если подумать, то мы не так много программ используем повседневно. Браузер, терминал, IDE, какой-то мессенджер, файловый менеджер, калькулятор и, пожалуй, это практически всё. Нужно не так много комбинаций клавиш, чтобы покрыть 95% повседневных задач.


    Для программ, у которых открыто несколько окон, одно из них можно назначить главным. Например, открыто несколько окон IntelliJ Idea, назначенных на Alt+E. В обычных условиях при нажатии на Alt+E будет открываться какое-то окно данной программы, скорее всего то, которое было открыто первым. Однако, если нажать на Alt+E когда одно из окон данной программы уже в фокусе, то именно это окно будет назначено главным и именно ему будет передаваться фокус при последующих нажатиях комбинации.


    Главное окно можно переназначить. Для этого комбинацию нужно сначала сбросить, а потом назначить на неё главным другое окно. Для сброса комбинации нужно нажать саму комбинацию, а потом специальную комбинацию сброса, у меня она назначена на Alt+Backspace. Это вызовет скрипт, который отменит назначение главного окна для предыдущей комбинации. А далее можно назначить новое главное окно как это было описано в предыдущем абзаце. Сброс привязанного окна к универсальным комбинациям происходит аналогично.


    Вступление получилось длинным, но хотелось сначала рассказать что будем делать, а потом объяснить как делать.


    Для тех, кому надоело читать


    Если коротко, то ссылка на скрипты в конце статьи.


    Но все равно сразу установить и пользоваться не получится. Придётся сначала разобраться как скрипт находит нужное окно. Без этого не получится указать скрипту куда именно нужно передать фокус. И нужно понять что делать, если вдруг подходящего окна не нашлось.


    А ещё я не буду заострять внимание на том, как настраивать выполнение скриптов по нажатию комбинаций клавиш. Например, в KDE это в System Settings → Shortcuts → Custom Shortcuts. В других оконных менеджерах такое тоже должно быть.


    Знакомство с wmctrl


    Wmctrl — консольная утилита для взаимодействия с X Window Manager. Это ключевая программа для скрипта. Давайте бегло глянем на то, как ей можно пользоваться.


    Для начала выведем список открытых окон:


    $ wmctrl -lx
    0x01e0000e -1 plasmashell.plasmashell             N/A Desktop — Plasma
    0x01e0001e -1 plasmashell.plasmashell             N/A Plasma
    0x03a00001  0 skype.Skype                         N/A Skype
    0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
    0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)
    ...

    Опция -l выводит список всех открытых окон, а добавляет к выводу название класса (skype.Skype, Navigator.Firefox и т.д). Нам тут понадобится id окна (колонка 1), имя класса (колонка 3) и название окна (последняя колонка).


    Можно попробовать активировать какое-то окно с помощью опции -a:


    $ wmctrl -a skype.Skype -x

    Если все пошло по плану, то на экране должно появиться окно Skype. Если вместо опции -x использовать опцию -i, то вместо имени класса можно будет указать id окна. С id проблема в том, что id окна меняется при каждом запуске приложения и мы не можем знать его заранее. С другой стороны, этот атрибут однозначно указывает на окно, что может быть важно, когда приложение открывает больше одного окна. Об этом чуть дальше.


    На этом этапе нам надо запомнить, что мы будем искать нужное окно с помощью regex по выводу wmctrl -lx. Но это не значит, что нам обязательно использовать что-то сложное. Обычно достаточно имени класса или названия окна.


    В принципе, основная идея уже должна быть ясна. В настройках глобальных hotkeys/shortcuts для вашего оконного менеджера настраиваем нужную комбинацию на выполнение скрипта.


    Как пользоваться скриптами


    Для начала надо установить консольные утилиты wmctrl и xdotool:


    $ sudo apt-get install wmctrl xdotool

    Дальше надо скачать скрипты и добавить их в $PATH. Я обычно кладу их в ~/bin:


    $ cd ~/bin
    $ git clone https://github.com/masyamandev/Showwin-script.git
    $ ln -s ./Showwin-script/showwin showwin
    $ ln -s ./Showwin-script/showwinDetach showwinDetach

    Если каталога ~/bin не было, то его надо создать и перезагрузиться (или перелогиниться), иначе ~/bin не попадёт в $PATH. Если всё сделано правильно, то скрипты должны быть доступны из консоли и должно работать автодополнение по Tab.


    Основной скрипт showwin принимает 2 параметра: первый это regex, по которому мы будем искать нужное окно, а второй параметр это команда, которую нужно выполнить, если нужного окна не нашлось.


    Можно попробовать выполнить скрипт, например:


    $ showwin "Mozilla Firefox$" firefox

    Если Firefox установлен, то его окну должен быть передан фокус. Даже если Firefox не был запущен, он должен был запуститься.


    Если получилось, то можно попробовать настроить выполнение команд на комбинации. В настройках глобальных hotkeys/shortcuts добавляем:


    • Alt+F: showwin "Mozilla Firefox$" firefox
    • Alt+D: showwin "Mozilla Firefox (Private Browsing)$" "firefox -private-window"
    • Alt+C: showwin "chromium-browser.Chromium-browser N*" chromium-browser
    • Alt+X: showwin "chromium-browser.Chromium-browser I*" "chromium-browser -incognito"
    • Alt+S: showwin "skype.Skype" skypeforlinux
    • Alt+E: showwin "jetbrains-idea" idea.sh

    И т. д. Комбинации клавиш и софта каждый может настроить как ему удобно.
    Если все получилось правильно, то по указанным выше комбинациям мы сможем переключаться между окнами простым нажатием клавиш.


    Разочарую любителей хрома: обычное окно он инкогнито отличить по выводу wmctrl нельзя, у них одинаковые названия классов и заголовки окна. В предложенных regex символы N* и I* необходимы только для того, чтобы эти регулярки отличались друг от друга и им можно было назначить главными разные окна.


    Для сброса главного окна предыдущей комбинации (по факту для regex, которым showwin вызывался в последний раз) нужно вызвать скрипт showwinDetach. У меня этот скрипт назначен на комбинацию клавиш Alt+Backspace.


    У скрипта showwin есть ещё одна функция. Когда он вызывается с одним параметром (в данном случае параметр является просто идентификатором), то он вообще не проверяет regex, а все окна считает подходящими. Само по себе это кажется бесполезным, однако таким образом мы можем назначить любое окно главным и быстро переключаться именно к этому окну.


    У меня настроены такие комбинации:


    • Alt+1: showwin "CustomKey1"
    • Alt+2: showwin "CustomKey2"
    • Alt+0: showwin "CustomKey0"
    • Alt+Backspace: showwinDetach

    Таким образом я могу привязать любые окна к комбинациям Alt+1...Alt+0. Просто нажав Alt+1 я привязываю текущее окно к этой комбинации. Отменить привязку могу нажав Alt+1, а затем Alt+Backspace. Или закрыть окно, так тоже работает.


    Дальше я расскажу немного технических деталей. Их можно не читать, а просто попробовать настроить и посмотреть. Но я бы всё-таки рекомендовал разобраться в чужих скриптах прежде, чем запускать их у себя на компьютере :).


    Как различать разные окна одного приложения


    В принципе, самый первый пример «wmctrl -a skype.Skype -x» был рабочий и его можно использовать. Но давайте ещё раз глянем на пример с Firefox, в котором открыты 2 окна:


    0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
    0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)

    Первое окно — обычный режим, а второе — Private Browsing. Эти окна хотелось бы считать разными приложениями и переключаться в них по разным комбинациям клавиш.


    Нужно усложнить скрипт, переключающий окна. Я использовал такое решение: вывести список всех окон, сделать grep по regex, взять первую строку с помощью head, достать первую колонку (это будет id окна) с помощью cut, переключить на окно по id.


    Тут должна быть шутка про регулярные выражения и две проблемы, но по факту я не использую ничего сложного. Регулярки мне нужны для того, чтобы можно было указать конец строки (символ «$») и отличать «Mozilla Firefox$» от «Mozilla Firefox (Private Browsing)$».


    Команда выглядит примерно так:


    $ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`

    Тут уже можно догадаться про вторую особенность скрипта: если grep ничего не выдал, значит нужное приложение не открыто и его нужно запустить, выполнив команду из второго параметра. А потом периодически проверять не открылось ли нужное окно, чтобы передать ему фокус. Не буду заострять на этом внимание, кому надо, тот посмотрит исходники.


    Когда окна приложения не различимы


    Итак, мы научились передавать фокус окну нужного приложения. Но что, если отрыто больше одного окна у приложения? К какому из них передавать фокус? Скрипт выше передаст, скорее всего, первому открытому окну. Однако, мы бы хотели большей гибкости. Хотелось бы иметь возможность запомнить какое именно окно нам нужно и переключаться именно к этому окну.


    Идея была такая: Если мы хотим запомнить для комбинации клавиш какое-то определённое окно, то нужно нажать эту комбинацию тогда, когда нужное окно в фокусе. В дальнейшем при нажатии этой комбинации фокус будет отдаваться именно этому окну. Пока окно не закроется или мы не сделаем сброс для этой комбинации скрипта showwinDetach.


    Алгоритм скрипта showwin примерно такой:


    • Проверить, не запомнили ли мы раньше id окна, которому надо передать фокус.
      Если запомнили и такое окно все ещё существует, то передаём фокус ему и выходим.
    • Смотрим какое окно сейчас в фокусе, и если оно подходит под наш запрос, то запомним его id для перехода к нему в дальнейшем и выходим.
    • Переходим хоть к какому-то подходящему окну если оно существует или открываем нужное приложение.

    Узнать какое окно сейчас в фокусе можно с помощью консольной утилиты xdotool, преобразовав её вывод в шестнадцатеричный формат:


    $ printf "0x%08x" `xdotool getwindowfocus`

    Что-то запоминать в bash проще всего создавая файлы в виртуальной файловой системе, находящейся в памяти. В Ubuntu такая подключена по умолчанию в /dev/shm/. Про другие дистрибутивы ничего не могу сказать, надеюсь, что подобное тоже есть. Можно посмотреть командой:


    $ mount -l | grep tmpfs

    Скрипт будет создавать пустые директории в этой папке, вот такие: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Дополнительно при каждом вызове он будет создавать symlink /dev/shm/$USER/showwin/showwin_last на /dev/shm/$USER/showwin/$SEARCH_REGEX. Это понадобится для того, чтобы при необходимости удалить id окна для определённой комбинации с помощью скрипта showwinDetach.


    Что можно улучшить


    Во-первых скрипты надо настраивать руками. Наверняка, из-за необходимости вникать и делать много руками, многие из вас даже не попробуют настроить систему. Если бы была возможность просто поставить пакет и настроить все проще, то, возможно, это бы обрело некоторую популярность. А там гляди и в стандартные дистрибутивы запилили бы приложение.


    И, возможно, проще можно сделать. Если по id окна можно узнать id процесса, его создавшего, а по id процесса узнать какая команда его создала, то можно было бы автоматизировать настройку. На самом деле я не разбирался, возможно ли то, что я написал в этом абзаце. Дело в том, что лично для меня устраивает то, как оно работает сейчас. Но если кому-то кроме меня весь подход покажется удобным и кто-то его улучшит, то я с радостью буду использовать лучшее решение.


    Другая проблема, как я уже писал, в том, что в некоторых случаях окна нельзя отличить одно от другого. Я пока наблюдал такое только с incognito в chrome/chromium, но, возможно, где-то ещё есть подобное. В крайнем случае, всегда есть вариант универсальных комбинаций Alt+1...Alt+0. Опять же, я использую Firefox и лично для меня эта проблема не существенна.


    А вот существенная для меня проблема в том, что по работе я использую Mac OS и там ничего подобного я настроить не смог. Утилиту wmctrl поставить вроде бы смог, но она на Mac OS толком не работает. Что-то можно сделать с приложением Automator, но оно так тормозит, что пользоваться им не удобно даже когда оно работает. Настроить комбинации клавиш так, чтобы они работали во всех программах я тоже не смог. Если вдруг кто-то придумает решение — буду рад им пользоваться.


    Вместо заключения


    Получилось неожиданно много слов для такой, казалось бы, простой функциональности. Хотелось донести идею и не перегружать текст, но я пока не придумал как рассказать проще. Возможно, в формате видео было бы лучше, но тут так не любят.


    Я немного рассказал о том, что под капотом скрипта и как его настроить. В подробности самого скрипта не вдавался, но он всего 50 строк, разобраться не сложно.


    Надеюсь, что кто-то ещё эту идею опробует и, возможно, даже оценит. Про себя могу сказать, что скрипт был написан года 3 назад и мне это ОЧЕНЬ удобно. Настолько удобно, что вызывает серьёзный дискомфорт при работе с чужими компьютерами. И с рабочим макбуком.


    Ссылка на скрипты

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 47

      +2
      Мне кажется, когда люди знают, что хотят от окон, то начинают использовать тайловые вм или что-то вроде. Из того, что я пробовал — xmonad и awesomewm.
        +2

        Большинство окон удобно разворачивать на весь экран, особенно на ноутбуке. Между полноэкранными окнами надо как-то переключаться.
        Несколько рабочих столов, листание тачпадом как на макбуке, тайловые оконные менеджеры. Пробовал, не понравилось. Хоткеи удобнее.

          +1
          Так в тайловых все на хоткеях и держится. Хочешь определенную программу на весь экран и на отдельном рабочем столе — пожалста.
          П.С.: один раз правила написал и пользуйся.
            0
            тайловые оконные менеджеры. Пробовал, не понравилось

            Возможно всё дело в том, что из коробки, их действительно неудобно непривычно использовать. Но потратив время на освоение и конфигурирование, вы получите гораздо более удобную рабочую среду, в т.ч. и универсальный хоткей для запуска любых приложений (dmenu/rofi).

            Если нет времени / лень вникать в тонкости конфигурирования, то есть уже готовые из коробки сетапы от сообщества, например awesome-copycats для AwesomeWM.
              0

              А есть что-нибудь подобное для i3wm?

                0
                Честно сказать, у меня почти дефолтная инсталляция i3wm, особо не видел смысла там что-то менять. Но вообще, тут можно посмотреть или на реддите r/unixporn.
                  0
                  github.com/addy-dclxvi/i3-starterpack такое ещё нашел.
                    0
                    awesome самое известное наверное. Под wayland есть аналог i3 — sway. Вообще их очень много (можно нагуглить), но пробовал я мало)
                  0
                  Так вы изобрели ровно то же самое.
                  Многие тайлинговые менеджеры (и не только) умеют биндить практически из коробки окна по разным рабочим столам.
                  На первом рабочем столе код, на втором браузер, на третьем терминалы, на четвертом файловый менеджер и т.д. Переключение на определенный рабочий стол каким нибудь альт+1..2..3 — проблема решена.

                  Но вы все равно молодец что разобрались и сконфигурировали под себя.
                +1
                За идею с CapsLock и раскладкой — спасибо.
                Задействовал CapsLock для латиницы и Shift+CapsLock для кириллицы)
                  0
                  и Shift+CapsLock для кириллицы

                  Shift+CapsLock обычно оставляют для возможности включения\выключения КАПС-режима


                  UPD: у себя, помимо переключения раскладки по CapsLock настроил отображение активной индикатором ScrollLock клавиатуры (к сожалению осталось мало клавиатур с этой лампочкой).
                  Вот кусок xorg.conf


                  Section "InputClass"
                          Identifier  "Keyboard Defaults"
                          Driver      "evdev"
                          OPtion      "XkbRules" "xorg"
                          Option      "XkbLayout" "us,ru"
                          Option      "XkbVariant" "basic,winkeys"
                          Option      "XkbOptions" "grp:caps_toggle,grp_led:scroll,lv3:ralt_switch,compose:rwin,misc:mytypo,terminate:ctrl_alt_bksp"
                          MatchIsKeyboard "on"
                          MatchDevicePath "/dev/input/event*"
                  EndSection

                  который настраивает клавиатуру вне зависимости от используемого WM|DE.

                    0
                    Спасибо. Ещё одна хорошая идея со скроллок)
                    Вот соберусь снова объединить белорусскую и русскую раскладки, и тогда их снова будет две, а не три. После переустановки всё лень. Может в отпуске. Или на пенсии. Или когда дети вырастут.
                    Пока русская на Ctrl+CapsLock.
                      0
                      который настраивает клавиатуру вне зависимости от используемого WM|DE.

                      После войн с убунтой на эту тему в моем ru.sh остались такие записи:


                      setxkbmap -layout "us,ru"
                      setxkbmap -option "grp:caps_toggle,grp_led:caps,compose:ralt,terminate:ctrl_alt_bksp"
                      exit 0
                      
                      #sudo dpkg-reconfigure keyboard-configuration
                      #gsettings reset org.gnome.desktop.input-sources xkb-options
                      dconf read   /org/gnome/desktop/input-sources/xkb-options
                      ['grp:caps_toggle', 'compose:ralt', 'terminate:ctrl_alt_bksp', 'grp_led:scroll']`
                      cd .config/dconf/
                      cp -a user user.bak #drop config and from **text** console restore back
                      
                      dump layout:
                      xkbcomp -xkb $DISPLAY xkbmap
                      
                      /etc/default/keyboard
                      echo '@setxkbmap -layout "fr,us"'|sudo tee -a /etc/xdg/lxsession/Lubuntu/autostart
                      
                      2013 – en DASH
                      2014 —  LONG em DASH
                      2e3a ⸺   2em DASH
                      2e3b ⸻     3em DASH
                      
                      Compose
                      /usr/share/X11/locale/en_US.UTF-8/Compose
                      
                      Ctrl+Shift+U+unicode_in_hex
                      2200 ∀
                      2201 ∁ 
                      2202 ∂
                      2203 ∃ 
                      2204 ∄
                      

                      Что из всего этого вам потребуется, смотрите сами ;)

                        0
                        setxkbmap -option "grp:caps_toggle,grp_led:caps,compose:ralt,terminate:ctrl_alt_bksp"

                        Вот отображение раскладки лампочкой CapsLock


                        …,grp_led:caps,… 

                        не всегда удобно. Не получится увидеть включен ли КАПС-режим, если он используется. Но, да, клавиатур с этой лампочкой ещё есть.


                        Да и ComposeKeys не является панацеей. Половина решается Третьим уровнем.

                    0
                    Повесил раскладку на левый Alt. А всевозможные переключения задач и столов на WinKey (Win+Tab процессы, Win+Esc present windows, Win+Space столы). Стало совсем удобно.
                      0

                      Кажется вы пытаетесь переизобрести i3wm/awesome с rofi и т.д.

                        0
                        Пользуясь случаем.
                        Народ, кто пользуется i3wm, подскажите пожалуйста, как сделать чтоб при запуске firefox был на 85% и без рамок по ширине, а телега на оставшиеся 15%?
                        Надоело каждый раз их подгонять.

                        В конфиге сейчас есть такие записи:
                        for_window [class="Thunderbird"] move container to workspace 2
                        for_window [class="Firefox"] move container to workspace 1, border none
                        for_window [class="Telegram"] move container to workspace 1, border none


                        Заранее спасибо!

                        Пробовал layout, но там вообще конфиг не подхватывается. Может я туплю? Либо он применяет конфиг до того как телега с браузером загрузятся?
                          0
                          Например i3-save-tree --workspace 1 > ~/.i3/workspace-1.json
                          В конфиге использовать append_layout с путем до сохраненного json
                            0
                            Сколько лет пользуюсь i3wm а не знал, что существует такая фича. И оказывается она мне жизненно необходима! Благодарю за наводку.
                          0
                          Когда мне нужно переключиться на какое-то окно, мне не приходится искать его на панели задач. Все нужные приложения у меня на ней закреплены и находятся всегда в одном и том же месте, в каком бы порядке я их ни открыл. Наведение мыши на иконку программы доведено фактически до автоматизма.
                          Кроме того, в Windows есть такой способ открытия/переключения между программами — Win+цифра. Нажмёте Win+1 — откроется программа, закреплённая на первой позиции на панели задач. Win+2 — вторая. И т.д. При этом, «я хочу видеть калькулятор вне зависимости от того, запущена ли в данный момент эта программа. Если запущена, то её окну надо передать фокус, а если нет — запустить нужную программу и передать фокус когда она загрузится» также работает. Для десятка самых нужных программ, на мой взгляд, этого более чем достаточно.
                            0

                            этот фокус работает и в циннамон. это облегчило мне отъезд с винды.

                            0
                            Передать фокус окну — это, кончено, классно и полезно. Но иногда бывает необходимо передать фокус конкретной вкладке браузера (например, открыть закреплённую вкладку с Яндекс.Музыка). Кто-нибудь находил хоть какое-нибудь рабочее решение, кроме передачи фокуса браузеру и перебор всех вкладок до нахождения нужной по изменяющемуся заголовку окна?
                              0
                              Tridactyl?
                                0
                                А конкретнее можно? А то я нахожу только Vim-like interface for Firefox, который вообще не в тему.
                                  0
                                  Сходу в .tridactylrc сделать бинд на открытый таб, либо так вбить.
                                  Ну скажем например bind L fillcmdline tab hrenomuzika.blabla.com, если таб открыт. Если нет — например tabopen использовать. Без биндов можно держать в нужном порядке (1-2-3 и т.д. таб) и использовать стандартные шоткаты альт+цифра например.
                                0
                                Кажется какой-то чувак делал addon для firefox который работает с Rofi (общаются через сторонний бекенд как, например, аддон который открывает видео в mpv). Но я не пробовал, не исключено что он работать перестал.
                                  0
                                  Если взять для примера конкретно Firefox под Windows, то в нем очень удобно можно запинить некоторые окна, а затем осуществлять быстрый переход по ним с помощью Ctl+1, 2, 3… Тогда вполне можно сделать глобальные хоткеи с помощью, например, AutoHotkey, при нажатии на которые будет не только активироваться браузер, но и будет передана нужная комбинация для открытия необходимой вкладки.
                                    0
                                    Это как вариант, да. Спасибо! Но хотелось бы более универсального решения, т.к. не всегда можно гарантировать одну и ту же последовательность закреплённых вкладок. А вот с универсальным решением пока глухо. (Я, по крайней мере, пока ничего вменяемого не нашёл.)
                                  0
                                  Эх… еще бы как нибудь хоткеи для skypeforlinux и подобных мессенджеров в xubuntu отключить.
                                  Задолбало, при переключении раскладки (Alt+Shift) активируются «кнопки» главного меню программы.
                                  Пока более-менее простого-стандартного способа не нашел, а городить костыли как-то не по феншую.

                                  Может кто-нибудь вкурсе, как спасти отца русской демократии?
                                    +1

                                    Сменить сочетание смены раскладки, чтобы не было клавиши Alt.

                                      0
                                      По этой же причине на днях перенастроил переключение раскладки на Caps Lock.
                                        0
                                        Случаем этот патч не поможет?
                                        launchpad.net/~nrbrtx/+archive/ubuntu/xorg-hotkeys
                                        0
                                        А вот существенная для меня проблема в том, что по работе я использую Mac OS и там ничего подобного я настроить не смог. Утилиту wmctrl поставить вроде бы смог, но она на Mac OS толком не работает. Что-то можно сделать с приложением Automator, но оно так тормозит, что пользоваться им не удобно даже когда оно работает. Настроить комбинации клавиш так, чтобы они работали во всех программах я тоже не смог. Если вдруг кто-то придумает решение — буду рад им пользоваться.


                                        По моему опыту — ничего не тормозит. Только визуальное программирование на automator — мне не зашло. Рекомендую работать на чистом AppleScript.
                                          0

                                          Под тормозит я имел в виду время от нажатия комбинации до момента, когда окно получит фокус. Т.е. сам автоматор, наверно, не тормозит, но тормозит его запуск. Не суть важно, не смог с ним получить приемлемый отклик. В Linux же я получаю мгновенный отклик если приложение уже запущено.
                                          Но это пол беды, я в Mac OS хоткеи не смог настроить. Они работают до тех пор пока текущая программа их не переопределит. Надо либо выдумывать сложные хоткеи, которые больше нигде не используются (но тогда они сложные и вся прелесть теряется) либо придумать что-то еще.

                                          0
                                          Смастерил себе клавиши «РУС» и «LAT», благо у мну на клавиатуре куча дополнительных кнопок. Очень удобно.
                                          setxkbmap -layout ru -- на клавише "Вперёд"
                                          setxkbmap -layout us -- на клавише "Назад"
                                          

                                            0

                                            Вот бы еще производителям ноутов это объяснить. Особенно одной яблочной компании.

                                              0

                                              Легко. Не покупать их продукцию.

                                            +1
                                            Пользователям gnome-shell все эти скрипты не нужны, там замечательно добавляются кастомные шорткаты и команды для запуска прямо из GUI.
                                              0

                                              Тут же идея в том, что на один шорткат навешены и запуск и получение фокуса. Плюс навигация по разным окнам одного приложения.
                                              Давно не пользовался gnome, возможно там много подобавляли, я не знаю.


                                              Можно ли в gnome повесить на разные шорткаты окно обычного Firefox и окно Firefox в Private Browsing? Ведь технически это одно и то же приложение. И желательно так, чтоб не перенастраиать это после перезагрузки или закрытия одного из окон.


                                              Или другой сценарий. Я обновляю, например, файлы конфигурации в нескольких микросервисах. Каждый микросервис открыт в отдельном окне Idea. Мне нужно сделать несколько однотипных изменений в файлах во всех микросервисах. Я привязываю все нужные окна Idea к разным шорткатам (выбираю клавиши рядом, у меня это Alt+1...Alt+0). А дальше вношу однотипные правки во все проекты. Т.е. сначала меняю file1 во всех проектах, затем меняю file2 и т.д. Мне не надо искать окна по Alt+Tab и искать в какой из проектов я ещё не внес правки. В gnome так можно? Назначить открытые окна на шорткаты, желательно не заходя в меню, а потом так же легко переназначить для выполнения другой задачи?

                                              +1
                                              Для Mac OS — Apptivate.
                                                +1

                                                Супер, отличная программа!
                                                Легко настраивается, основную задачу выполняет хорошо.
                                                К сожалению, нельзя настроить на отдельный шорткат Firefox в Private Browsing. И нет возможности создать кастомные шорткаты для привязки именно к окнам, а не к приложениям.
                                                В любом случае, с ней намного лучше, чем без нее. Спасибо :)

                                                0
                                                Я из тех, кто ставит на Caps Lock переключение раскладки потому, что лень нажимать 2 клавиши, когда можно нажимать одну. Я бы даже хотел 2 ненужные клавиши: одну бы я использовал для включения английской раскладки, а вторую для русской. Но вторая ненужная клавиша — это вызов контекстного меню, которая настолько ненужная, что выпиливается многими производителями ноутбуков. Так что приходится довольствоваться тем, что есть.

                                                Автор, в линуксах <Winkey's> делятся на правый и левый — это две разные „ненужные“ клавиши, но не каждая бубунта позволяет их различить.

                                                  0

                                                  Давно не видел правый Winkey в ноутбуках. Понял, что почти не пользуюсь правыми Alt и Ctrl, но переключение языка на них в KDE повесить не смог. Может мало копал.
                                                  Да и сомнения есть, стараюсь не настраивать то, что нельзя будет настроить на рабочем макбуке.

                                                  0

                                                  Поделюсь своим опытом тайлинга.


                                                  На MacOS пользовался Spectacle, потом захотел больше гибкости и перешел на Hammerspoon со своим скриптом. Сложнее, но можно сделать, что угодно. Иногда он, кажется, чуть подглючивал и подтормаживал.


                                                  А потом перешёл на Linux (Manjaro). Вначале решил, что если я не нуб, то должен настроить себе i3. А потом после трёх дней пляски с настройками за пару часов установил и настроил под себя GNOME. Его встроенных фич оказалось вполне достаточно:


                                                  • поменял местами CapsLock и левый Ctrl (очень рекомендую!)
                                                  • переключение раскладки оставил пока на дефолтном Super+SPC (но мне оно по работе нечасто нужно)
                                                  • каждый апп из панели запуска вызывается по Super+<его номер>, можно сделать и выделенный шорткат для запуска приложения, если нужно
                                                  • для переключения между окнами приложения (несколько сессий Firefox) есть шорткат (Alt+` по дефолту)
                                                  • терминал: Tilix в quake mode с шорткатами как у iTerm, которым пользовался на маке
                                                    +1
                                                    Я немного слоупок, но… спасибо за ваш скрипт:) Я его внедрил у себя и теперь с удовольствием использую.

                                                    Попробовал тайловые менаджеры как советуют выше — не то. У меня нет необходимости в нескольких окнах на экране. А без этой «фишки» i3 получается какой то очень пресной оболочкой. Да и ресурсы мне как то глупо экономить.

                                                    А вот назначить десятку приложений хоткеи и между ними переключаться не перекладывая руку на мышку и ничего не «листая» — самое то!
                                                    Теперь бы выучить собственные хоткеи… Может док и панель задач спрятать, чтобы по привычке к мышке не тянуться? :D

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

                                                    34,37c34
                                                    + if [[ "$MATCHED_CURRENT" -eq "$CURRENT" ]] && [[ -n "$CURRENT" && -n $2 || "$PINNED" -eq "$CURRENT" ]]; then
                                                    +   echo "Minimize"
                                                    +   xdotool getactivewindow windowminimize
                                                    + elif [[ -n $MATCHED_CURRENT && -z $PINNED ]]; then
                                                    ---
                                                    - if [[ -n $MATCHED_CURRENT && -z $PINNED ]]; then
                                                    


                                                    Вот так лучше. :)

                                                    Теперь повторное нажатие хоткея, если «нужное» окно уже активно — прячет его.
                                                    alt+m — вызвал почтовую программу, убедился что «полковнику никто не пишет» и тем же сочетанием клавиш ее обратно свернул.
                                                      0

                                                      Спасибо за отзыв. Рад что кто-то попробовал. :)


                                                      На самом деле, я и не надеялся, что кто-то вот прям сразу все себе настроит и прям сразу привыкнет. Для того, чтобы подсесть на хоткеи требуется время. А спрыгнуть еще сложнее. :)


                                                      Идея со сворачиванием тоже интересная, спасибо. Залью в репозиторий при возможности.

                                                        0

                                                        Обновил скрипт.
                                                        Добавил Ваше пожелание со сворачиванием окон, а заодно немного переделал механизм назначения главного окна. Теперь какое-то из окон всегда назначено главным, если надо переназначить, то это нужно делать явно.
                                                        Так же есть идея переделать механизм переназначения главного окна. Чтоб сначала нажимать комбинацию сброса, а потом комбинацию окна. Тогда при переназначении не будет прыжков: попасть в старое окно, нажать сброс главного окна, перейти в нужное окно и только потом назначить его главным.

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

                                                      Самое читаемое