Настраиваем сочетания клавиш в Linux наподобие Mac OS X

  • Tutorial

Раньше, у меня довольно часто возникала такая ситуация, когда одновременно работаешь в терминале и, например, в браузере.
После нескольких часов работы начинаешь путаться и в терминале вместо [Ctrl]+[Shift]+[C] нажимаешь [Ctrl]+[C], а в браузере наоборот. В итоге в терминале вы получаете прерывание а в браузере вместо ожидаемого эффекта у вас медленно прогружается дебаггер.
В один прекрасный момент меня это достало и я решил, что пора что-то менять...

До того как я переустановил на своей рабочей машине OSX на Linux, я успел привыкнуть к довольно приятной реализации сочетаний клавиш. А точнее к тому, что все основные операции, такие как «Вырезать», «Копировать» и «Вставить», все они используют кнопку [Cmd] (аналог кнопки [Win] на PC), а не [Ctrl], как это сделано по умолчанию в Linux и Windows. Это очень удобно, так как, повторюсь, если вы часто работаете в терминале, вы имеете единые сочетания клавиш для копирования и вставки как и во всех других приложениях, а прерывание всегда остается на своем месте [Ctrl]+[C].
Вы так же олучите профит от такого способа, если вы используете тайловый оконный менеджер, т.к. в большинстве случаев для использования стандартных операций и переключений между тэгами/окнами вам не придется снимать палец с вашего modkey

Конечно настраивать сочетания клавиш можно в конфигах каждого определенного приложения, но это слишком не удобно, к тому же не каждое приложение поддерживает такую настройку. По этому я решил просто забиндить стандартные сочетания клавиш на те, что нужны мне.
Т.е. нажимая [Win]+[C], ваш терминал будет думать, что вы нажимаете [Ctrl]+[Shift]+[C], а все остальные приложения, что [Ctrl]+[C].

Для реализации задуманного нам понадобятся программа, которая будет отслеживать наши нажатия, например xbindkeys или же можно воспользоваться штатными возможностями вашего оконного менеджера, и эмулятор нажатий на клавиши, их несколько: xdotool, xte и xvkbd.

Правда с первыми двумя у меня возникал один преинтереснийший глюк: если например вы нажимете [Win]+[A], эмулятор покорно передаст [Ctrl]+[A] в приложение, а приложение увидит что нажаты все три клавиши [Win]+[Ctrl]+[A] и не обработает такое сочетание. Этот весьма неприятный баг было не просто обнаружить, так как не помогала даже опция --clearmodifiers для xdotool, которая, казалось бы, специально для такого случая и создана. В xkdbb подобного поведения замечено не было.

Начнем, пожалуй с xbindkeys. Отключем все CapsLock, NumLock и прочие модификаторы, запускаем:
$ xbindkeys -k

Открывается окошко, в окошке нажимаем сочетание [Win]+[A], в терминале получаем такой вывод:
"(Scheme function)"
    m:0x40 + c:38
    Mod4 + a

где Mod4 — это наша клавиша [Win]. Это же можно использовать для написания конфига xbindkeys:

Открываем ~/.xbindkeysrc и пишем:
"xvkbd -xsendevent -text '\[Control_L]a'"
    Mod4 + a
Вариант для xdotool и xte
xdotool
"xdotool key --delay 0 --clearmodifiers ctrl+a"
    Mod4 + a

xte
"xte 'keydown Control_L' 'key A' 'keyup Control_L'"
    Mod4 + a



Теперь запустим xbindkeys:
$ xbindkeys

И попробуем нажать [Win]+[A], эффект будет такой-же как и если бы вы нажали [Ctrl]+[A]

После того что вы убедитесь, что все работает, можно продолжить править кофиг, но перед следующим запуском нужно с начала завершить предыдущий процесс xbindkeys:
$ pkill xbindkeys


Ок, с этим разобрались, но как нам передавать различные сочетания клавиш, при нажатии одних и тех же кнопок, в зависимости от программы с которой мы работем?
На помощь приходит все тот же xdotool и xprop, с помощью которых мы определяем является ли активное окно терминалом.

Давайте напишем простенький скрипт и положим его в /bin/copypaste.sh:
#!/bin/bash
W=`xdotool getactivewindow`
S1=`xprop -id ${W} |awk '/WM_CLASS/{print $4}'`
S2='"URxvt"'                                               #Мой любимый терминал
S3='"XTerm"'                                               #Мой второй терминал

if [ $1 = "copy" ]; then                                   # Проверяем аргумент на copy                                    
    if [ $S1 = $S2 ] || [ $S1 = $S3 ]; then                # Если это терминал
    xvkbd -xsendevent -text '\[Control_L]\[Shift_L]\[C]'   # Отправляем [Ctrl]+[Shift]+[C]
    else                                                   # Если нет 
    xvkbd -xsendevent -text '\[Control_L]c'                # Отправляем [Ctrl]+[C]
    fi  
fi

if [ $1 = "paste" ]; then                                  # Тоже самое для аргумента paste
    if [ $S1 = $S2 ] || [ $S1 = $S3 ]; then
    xvkbd -xsendevent -text '\[Control_L]\[Shift_L]\[V]'
    else
    xvkbd -xsendevent -text '\[Control_L]v'
    fi  
fi

Используйте xprop, если вы не знаете какой класс использует ваша программа:
xprop
и клик на окне

Не забываем сделать скрипт исполняемым:
# chmod +x /bin/copypaste.sh

Работает он вот так:
$ copypaste.sh copy
$ copypaste.sh paste

Это же и допишем в наш конфиг ~/.xbindkeysrc:
"xvkbd -xsendevent -text '\[Control_L]a'"
    Mod4 + a
"copypaste.sh copy"
    Mod4 + c
"copypaste.sh paste"
    Mod4 + v


Подобным образом настраиваем сочетания для остальных клавиш.

Готовый конфиг:
для xbindkeys
~/.xbindkeysrc
"copypaste.sh copy"
    Mod4 + c 
"copypaste.sh paste"
    Mod4 + v 
"/usr/bin/xvkbd -xsendevent -text '\[Control_L]x'"
    Mod4 + x 
"/usr/bin/xvkbd -xsendevent -text '\[Control_L]z'"
    Mod4 + z 
"xvkbd -xsendevent -text '\\[Control_L]\\[Shift_L]\\[Z]'"
    Shift+Mod4 + z 
"/usr/bin/xvkbd -xsendevent -text '\[Control_L]q'"
    Mod4 + q 
"/usr/bin/xvkbd -xsendevent -text '\[Control_L]y'"
    Mod4 + y 
"/usr/bin/xvkbd -xsendevent -text '\[Control_L]a'"
    Mod4 + a 
"/usr/bin/xvkbd -xsendevent -text '\[Control_L]s'"
    Mod4 + s 
"/usr/bin/xvkbd -xsendevent -text '\[Control_L]o'"
    Mod4 + o 
"/usr/bin/xvkbd -xsendevent -text '\[Control_L]f'"
    Mod4 + f 
для awesome 3.5
awful.key({ modkey,           }, "c",     function () awful.util.spawn("copypaste.sh copy") end),
awful.key({ modkey,           }, "v",     function () awful.util.spawn("copypaste.sh paste") end),
awful.key({ modkey,           }, "x",     function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]x") end),
awful.key({ modkey,           }, "z",     function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]z'") end),
awful.key({ modkey, "Shift"   }, "z",     function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]\\[Shift_L]\\[Z]'") end),
awful.key({ modkey,           }, "y",     function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]y'") end),
awful.key({ modkey,           }, "a",     function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]a'") end),
awful.key({ modkey,           }, "s",     function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]s'") end),
awful.key({ modkey,           }, "o",     function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]o'") end),
awful.key({ modkey,           }, "f",     function () awful.util.spawn("xvkbd -xsendevent -text '\\[Control_L]f'") end),
Метки:
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 53
  • +3
    А еще всем очень советую попробовать настроить переключение раскладки по Caps Lock. После недолгого привыкания, это окажется крайне удобным!
    • –3
      На правах белки истерички скажу, что более вредоносной идеи, чем настраивать переключение раскладки по Caps Lock, просто не существует!

      Посыл правильный — Caps Lock не нужен. Но отдавать целую кнопку исключительно под переключение раскладки имеет смысл только если вы переключаете раскладку нескоколько раз в минуту. Да и то не факт.

      Caps Lock is the new Control — вот верный слоган, ведущий в светлое будущее! Мапим Caps Lock как Control и навсегда забываем про необходимость скрючивать пальцы или двигать ладонь при необходимости что-нибудь скопипастить, вставить или сделать ещё полторы сотни действий, забитых на клавиатурные шорткаты.
      • +2
        У Caps Lock есть фатальный недостаток для такого использования: он несимметричен. Т. е. комбинации Ctrl+[левая половина клавиатуры] идут лесом вразрез с правильной постановкой рук при слепой десятипальцевой печати, ибо как минимум всякие ZAQ придётся нажимать не мизинцем. Встречал костыли для тех же иксов, позволяющие использовать Enter одновременно как модификатор и по назначению, либо глобально перенести прямое назначение на C-m. Последнее, пожалуй, с сабжем вполне сочетается.
        только если вы переключаете раскладку нескоколько раз в минуту
        Я куда чаще переключаю. Но по AltGr. А Caps Lock исПОЛЬзую пО НАЗначению, ибО АББревиатуры (а В СЛУчае с ПРОграммироваНИЕМ — констАНТы) ниКТО НЕ отмеНЯл.
        • +4
          У Caps Lock есть фатальный недостаток для такого использования: он несимметричен. Т. е. комбинации Ctrl+[левая половина клавиатуры] идут лесом вразрез с правильной постановкой рук при слепой десятипальцевой печати, ибо как минимум всякие ZAQ придётся нажимать не мизинцем

          Пользователи Emacs смотрят на вас как на странного :-)
          • 0
            А пользователи Emacs с Evil/педалями?
            • 0
              Они из другой песочницы)

              з.ы. идея с педалями, кстати, наверно хорошая… надо попробовать…
          • +1
            Вы совершенно случайно не хотите сказать, что если Ctrl находится на своём исконном месте в левом нижнем углу, то комбинация Ctrl+[левая половина клавиатуры] совершенно нормально сочетается со слепым методом десятипальцевой печати,? Ну то есть я конечно понимаю, что врядли кто-то будет утверждать, что необходимость убирать руку с home row при нажатии Ctrl+z никак не мешает при наборе текста, но вдруг… В конце концов вы каким-то образом нашли фатальный недостаток в использовании клавиши, нажатие которой вообще не требует двигать руку :).

            Ух ты, я сразу не заметил, но недостаток оказывается ещё и в том, что ZAQ придётся нажимать не мизинцем. Я так понимаю речь идёт о сочетаниях Crtl+a, Ctlr+z и Ctrl+q. Если вы набираете их левой рукой и мизинец у вас не на Ctrl, а на буквах, то вы очень редкий экземпляр :). Если вы, как рекомендуется при печати вслепую, зажимаете Ctrl справа правым мизинцем, то я не понимаю при чём тут Caps Lock. Или может речь идёт буквально о заглавных ZAQ? Тоже непонятно при чём тут несимметричность Caps Lock, обычно их набирают, зажимая Shift правым мизинцем.

            Оооо, вы переключаете раскладку более нескольких раз в минуту. Определённо редкий экземпляр :)!
            • +3
              Набирая научный текст, изобилующий химическими формулами и латинскими буквенными обозначениями. приходится переключать раскладку порой каждые 2-3 секунды.
              • 0
                Как я уже говорил, редкий экземпляр.

                Также добавлю, что если бы задача создания таких текстов стояла передо мной, то я бы забил набор латиских символов на модификатор + клавишу. Как сейчас набор заглавных букв забит на шифт + клавишу.
                • 0
                  Такой модификатор хорош для ввода одиночных символов. А когда подряд несколько символов одной раскладки, потом несколько символов другой раскладки — или не раскладки, а регистра (посмотрите примеры исходников на языках SQL и Modula-2) — тут нужна переключалка с фиксацией.
                  • 0
                    Я думаю попробовать сделать переключение раскладки по типу шифта, зажал кнопку, ввел несколько русских букв. Отпустил и дальше в консоли наяриваешь, или наоборот.
                    • 0
                      До сих пор считаю идеалом удобства в этом смысле клавиатуру УКНЦ с кнопками «алф» и «фикс».
                    • +1
                      Думаю вы просто не в курсе, что Shift+CapsLock в данной ситуации действует как CapsLock в стандартной раскладке, поэтому набирать аббревиатуры вы сможете все с тем же комфортом.

                      Ну либо я не понял проблемы.
                • +1
                  на своём исконном месте в левом нижнем углу
                  И правом. Впрочем, теоретически ничто не мешает использовать как Ctrl совместно правый Ctrl и Caps Lock, так что… Проблема разве в том, что один и тот же клавиш в разных местах для левой и правой руки вызывает когнитивный диссонанс. Впрочем, этим ноутбуки и без извращений с ремаппингом грешат: как модификаторы только не плавают… Кстати, по этой же причине правый Ctrl может быть неюзабелен. На всяких мелких кверти — и вовсе отсутствует, но для десятипальцевой печати они не прадназначены.
                  Определённо редкий экземпляр
                  Просто вимер, предпочитающий переключение раскладки кривым костылям для раскладконезависимого управления. Ну и вёрстка TeX, HTML, набор пестрящих англоязычной терминологией текстов тоже частых переключений требует, знаете ли.
              • –1
                Очень удобно переключать капсом раскладку, привыкаешь за пару дней и становится очень удобно. Особенно программисту, ведь постоянно надо гуглить что-то, и отвечать в контактиках/фейсбуках/твиттерах. Очень часто переключаю, тут менеджеру пишеш, потом код, потом время в таск отметить или баг описать туда же
                • 0
                  Дожили! Программисты сидят в контактиках, фейсбуках и твиттерах столько, что приходится переносить переключение раскладки на отдельную клавишу.

                  Но, кроме шуток, общение с менеджерами вперемежку с работой с кодом — удовольствие ещё то. Однако переключение раскладки капсом тут не ответ.

                  Когда раскладка нажатием клавиши или сочетания клавиш переключается на противоположную — надо постоянно быть в курсе, какая раскладка активна сейчас. Кажется, что это несложно, но это реально напрягает. Вспомните, сколько раз вы были уверены, что раскладка одна, а на самом деле она была другая и после переключения и набора нескольких букв приходилось менять язык обратно, удалять то, что только что написал и печатать заново!

                  Ответ — использование одного сочетания для одного языка и другого, для другого. Тогда можно зажать шорткат и быть абсолютно уверенным, что сейчас язык — английский, независимо от того, каким он был секунду назад.

                  Вот в комментарии человек правильно советует, хоть с использованием для этого шифтов я и не согласен.
                  • +1
                    Я очень часто общаюсь со своей девушкой, поэтому не вижу в этом ничего странного. Ну а насчет сочетания клавиш — это уже личное дело каждого, для меня например именно использование капса лучше всего. При слепой печати ты сразу понимаешь какой язык используеш, поэтому никаких проблем для использования капсом я абсолютно не вижу
                    • 0
                      Как я написал в предыдущем комментарии, при слепой печати понимание какой язык используешь, приходит после того, как напечатаешь несколько символов, которые придётся удалить, если язык не тот. Или придётся перед тем, как печатать, посмотреть на индикатор языка и осознать, какой язык активен, что является лишней нагрузкой на мозг. Эти две проблемы сопряжены с любым способом циклического переключения раскладки — неважно капслоком, советанием клавиш или чем-то ещё. Использование отдельного сочетания для каждого языка позволяет обойти эти проблемы и разгрузить сознание.

                      Что касается общения со своей девушкой во время работы — это требует постоянной смены контекстов, что вредит и работе и общению с девушкой. Ну а так как девушка конечно гораздо ценнее работы — в основном вредит конечно работе и развитию как программиста.
                      • 0
                        А еще можно использовать глобальное переключение, я вот не имея никаких индикаторов уже инстинктивно переключаю раскладку, при этом ее переключение не создает никаких особых неудобств, я просто нажимаю еще одну кнопку когда мне нужно что то набрать на другом языке.

                        За собой заметил, что иногда я даже набирая текст на русском языке, бывает по привычке переключаюсь на английский только для того что бы набрать какой-нибудь знак препинания. Не знаю плохо это или нет, но мне вполне удобно и я об этом даже не задумываюсь…
                        • 0
                          Ну если долго тренироваться, то хранение контекста перестаёт ощущаться. И вроде нормально всё и не мешает и так всегда и было.

                          Многие не хотят осваивать слепую печать, потому что нормально печатают и так, а то, что приходится постоянно бегать глазами от клавиатуры к монитору и обратно они давно уже не замечают. Понимание того, насколько это реально напрягало приходит только после того, как начинаешь печатать вслепую.
                          • 0
                            Такое ощущение что вы друг друга в чём-то пытаетесь убедить. Кому как удобно, тот и так и будет делать. Если захочется чего-то иного — попробует. Я вот большинство дум вообще ручкой на бумаге делаю — тут вообще проблем с переключалкой не стоит :-D а код писать — достаточно английской оной. Запрос в гугл — тоже. Один знакомый, не дурной программист, вообще мышкой раскладку меняет. Дедлайны не проваливает.
                  • 0
                    А вот для этого есть запоминание текущей раскладки по отдельности для каждого окна.
                    • 0
                      безусловно, но я предпочитаю открывать лишь одно окно браузера, а там приходиться еще и гуглить и доки читать и тд.
                  • +5
                    Caps Lock is the new Control
                    new
                    Разве что в комбирации с «новое — это хорошо забытое старое» :-)

                    • +1
                      Теза, антитеза, синтез. История развивается по спирали короче :)
                      • 0
                        История тут особо ни при чём. Контрол на капс маппят отдельные уникумы и уже давно (в том числе олдфаги, да). Но инициативы о выпиливании «ненужного» капслока проскакивают регулярно, вон Lenovo недавно Home/End вместо него попробовали засунуть, а в хромбуках там вообще кнопка пойска на регулярной основе.
                  • –2
                    Самый удобный вариант переключения раскладки — шифты. Левый шифт — английский язык. Правый — русский. У меня так. Уже давно привык перед вводом текста нажимать соответствующий шифт сначала. Если забыл — пунто свитчер поправит.
                    • +3
                      Начал читать комментария и подумал: «Ну, наконец-то. Я нашёл человека, который расскажет, как это сделать на Ubuntu 14.04». И тут — пунто свитчер (((
                      • –1
                        Есть же некий xneur. Возможно, у него в функционал заложена возможность смены раскладки шифтами.
                        • 0
                          Не помню точно про возможность смены раскладки там, но то, что он реально ломает мне, например, типографскую раскладку — это проверено.
                          • 0
                            Наверное, есть смысл его установить, отключить автоматическую смену раскладки и оставить только переключение шифтами. Должно помочь.
                      • +1
                        Левый шифт — раскладка? А на что у вас тогда верхний регистр букв?

                        К слову, когда-то я недоумевал, для чего люди переключение раскладки перенастраивают. Потом начал пользовать Емакс, и стандартные клавиши стали сильно мешать. К примеру Alt+Shift+F — прыжок на слово вперед с выделением, и переключение языка, если не повезет. В итоге перенастроил на правые Ctrl+Shift.
                        • 0
                          Регистр на то же самое. Раскладка переключается после нажатия и отпускания шифта без других клавиш. Регистр как обычно — шифт плюс буква. Одно другому никак не мешает.
                          • +1
                            В линухе переключалки реалигуют на Key Press, а не на Key Release. Поэтому такие артефакты. Известный повод для откладывания кирпичей и прочего бугурта.
                            • 0
                              Как раз наоборот, потому я и написал «если не повезет». А «не везет», например, когда хотел выделить слово, зажал Alt+Shift, а потом передумал, и отпустил. В результате раскладка переключилась.
                              • 0
                                Заставили попробовать. Действительно, что-то меняется либо разработчики различных тулкитов делают какие-то свои WA.

                                Дано: Mint 17.x, Cinnamon. Переключалка — средствами Cinnamon, CapsLock.

                                Кейс 1:
                                1. Нажимаю — не переключается
                                2. Отпуска — переключается

                                Кейс 2:
                                1. Нажимаю Капс — не переключается
                                2. Нажимаю другую клавишу (можно отпускать, можно не отпускать)
                                3. Отпускаю Капс — не переключается

                                Так что да, как у вас. Нужно проверить переключение, настроенное в конфиге Xorg. И в других средах.
                          • 0
                            А если просто что-то с шифтом набрать надо? Мне кажется, что Alt-space намного удобнее. И близко и случайно не перепутаешь.
                            • 0
                              Я же сказал — никаких проблем это не привносит. Язык переключается только при нажатии шифта без других клавиш.
                              В отличие от комбинации alt-space я всегда знаю, на какой язык переключился перед вводом текста.
                              • +1
                                А если нажал шифт, а потом передумал? А если три раскладки? Не масштабируемо и не логично, imho. На каком-то старом советском компьютере у меня так было :)
                                • 0
                                  Если была английская раскладка и нажал левый шифт — ничего не произойдёт. Если правый — переключится на русский.
                                  Я же не настаиваю на таком способе. Попробуйте сами. Часто передумываете в момент нажатия шифта?
                                  • 0
                                    Отвечу на дополнение к комментарию тоже: у меня всего две раскладки и больше не предвидится. С логикой всё в порядке. Если вам хочется спорить ради спора, давайте остановимся. Если ищете удобства — попробуйте сами такой способ и тогда обсудим.
                                  • 0
                                    Использование именно шифтов не одобряю, но в остальном полностью поддерживаю!
                              • –1
                                Сделал так пару лет назад и счастлив
                                • 0
                                  На правый Ctrl.
                                  • 0
                                    А я на место Caps Lock назначил Backspace — раскладку менять не так часто приходится как код чистить. Советую попробовать как-нибудь. При десятипальцевом наборе, нажатие Alt-Shift сводится к легкому сгибанию пальцев, а за основным Backspace нужно часто и неудобно тянуться.

                                    Еще, в отличие от смены раскладки, замена Caps Lock на Backspace легко делается на Windows:
                                    одним .reg-файлом
                                    REGEDIT4 
                                    
                                    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] 
                                    "Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,0e,00,3a,00,00,00,00,00
                                    

                                    Чтобы вернуть обратно:

                                    REGEDIT4 
                                    
                                    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] 
                                    "Scancode Map"=-
                                    

                                    • 0
                                      Если сидеть всё время на одной системе, то в самом деле. Но проблема в том, что на той же Mac OS нет возможности так вольно выбирать клавиши переключения. И в гетерогенном варианте (на работе линукс, дома мак) по итогу выиграл Cmd+Пробел (покуда его можно установить как на маке, так и на линуксе)
                                      • –1
                                        В Вин8+ по Win+Пробел меняется. Так что будущее за этой комбинацией.
                                        • 0
                                          Я кстати тоже поставил это сочетание.

                                          Только вот чего не хватает в линуксе — это бы такое же меню в цент экрана как в маке.
                                        • 0
                                          У меня так давно. Все стеснялась огласить. Действительно классно )
                                        • –1
                                          Спасибо!
                                          Еще бы под виндой такое сделать, а то когда переключаюсь на винду, не привычно =(
                                          • 0
                                            Есть программа Mkey. Позволяет менять назначение клавиш/мыши/джойстика/пульта.
                                          • 0
                                            Еще бы нашли способ хороший сделать расскладку dvorak-qwerty как на маке, я нашел одно решение, но если ставить эту раскладку в настройках иксов (а не оболочки) то автоматическое повторение клавиши перестает работать (что мешает при работе в VIM). github.com/kentonv/dvorak-qwerty вот репозиторий если кто вдруг решит помочь мне починить его, до разработчика достучаться не смог.
                                            • 0
                                              комментарий удален автором

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