Исправление раскладки клавиатуры а-ля Punto Switcher на bash

Так как мой слепой метод набора текста заключается в том, чтобы смотреть на клавиатуру, а не в монитор, то у меня постоянно получается что-то вроде — «Руддщб Рфикфрфик». В какой-то момент мне это порядком надоело и я написал простенький скрипт на bash, который исправляет раскладку, например, заменяя «ghbdtn» на «привет». Скрипт очень простой, для его работы надо выделить текст и нажать сочетание горячих клавиш. Автоматической смены раскладки нету, так же как и исправления регистра.
Конечно я знаю про существование Punto Switcher и мой велосипед не тянет на его уровень, но мне очень нравится создавать небольшие программки для облегчения жизни и просто так, just for fun.



Для работы скрипта нам понадобиться установить xsel, xvkbd и xbindkeys.
В дебиан дистрибутивах это делается командой apt-get install.

apt-get install xsel xvkbd xbindkeys

Я же сижу на мандриве, поэтому пользуюсь urpmi.

urpmi xsel xvkbd xbindkeys

И так, пока пакеты ставятся мы открываем любимый текстовый редактор и пишем:


#!/bin/bash
if [ "$(xsel)" = "" || "$(xsel)" = " " ]; then exit 1; fi
BOOFER=$(xsel -b)


Первая строчка указывает какой интерпретатор использовать, в нашем случае это bash.
Вторая прервет выполнение скрипта, если ничего не выделено или выделен пробел.
Третья строка заносит в переменную «BOOFER» результат работы команды xsel -b.
xsel — это небольшая командно-строчная утилита для работы с буфером обмена. Опция -b указывает, что работать надо с буфером клавиатуры.

Далее пишем:

xsel  | sed "y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.\/<>?@#\$^&\`~фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбюБЮ№ёЁ/фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбю.БЮ,\"№;:?ёЁabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.<>#\`~/" | xsel -b -i 


Давайте разберемся с этими кракозябрами.
xsel берет выделенный текст и передает его по конвейеру потоковому текстовому редактору sed. Именно он и производит замену символов. Команда y (sed "y/abcdef...) заменяет символ из первого шаблона на соответствующий ему символ из второго шаблона(sed «y/abcdefg.../фисвуап...; sed „y/abcdefg.../фисвуап...). Результат работы sed'а передается все той же утилите xsel, но теперь с опциями -b и -i.
Мы уже знаем что опция -b указывает, что работать надо с буфером клавиатуры, а вот опция -i говорит утилите, что этот буфер нужно переписать. Таким образом наш исправленный текст попадает в буфер обмена.

Теперь исправленный текст нам нужно вставить вместо исходного варианта, в этом нам поможет xvkbd. Это виртуальная клавиатура для X Window System, xvkbd также может отправлять символы, переданные в качестве аргумента командной строки, в другие приложения.

xvkbd -xsendevent -text "\[Control_L]\[v]"


Этой командой мы имитируем нажатие Ctrl+V, то есть вставляем содержимое буфера обмена вместо выделенного текста.

И теперь остается только вернуть в буфер обмена то, что было там до нашего вмешательства.

echo -n "$BOOFER" | xsel -b -i


Все. Наш скрипт готов, сохраняем его в удобном месте с расширением *.sh.
Даем ему права на выполнение:

chmod +x /путь/к/скрипту.sh

Теперь нужно назначить для него хоткей. Я выбрал сочетание клавиш Alt+Q, вы можете назначить любое другое. Хоткей я назначал с помощью xbindkeys.
Открываем в домашней директории файл .xbindkeysrc и добавляем в него следующие строки:

"/путь/к/скрипту.sh"
Alt + q


Сохраняем, выполняем в консоли:

xbindkeys

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

Скачать скрипт можно по этой ссылке
Метки:
Поделиться публикацией
Похожие публикации
Комментарии 33
  • +3
    А как быть с приложениями, где Ctrl+V не вставляет? В эмуляторах терминала, например, по умолчанию Shift+Ctrl+V чаще всего.

    Неплохой скрипт. Может, избавлюсь от xneur, только для этой функции и держал его.
    • +6
      Я даже не думал об этом, т.к. все время меняю в настройках комбинации Shift+Ctrl+V и Shift+Ctrl+C на привычные Ctrl+V и Ctrl+C соответственно. Тут как вариант можно попробовать использовать Ctrl+Insert и Shrift+insert.

      P.S. Прошу прощения за столь поздний ответ, я в данный момент в армии и доступ к интернету у меня сильно ограничен
      • 0
        Ого! А доступ к компьютеру с линуксом на борту там в неограниченных количествах?
        • 0
          Ну может админит местную локалку :)
          • 0
            Ага, ноутбук и ПК соединенные напрямую — вот и вся локалка)
            • 0
              А что, можно в кваку рубиться со старшиной) Выиграл — минус 1 наряд ;)
              • +2
                Да я бы с радостью) но сержанты тут больше контру любят, лейтенанты постоянно играют в worldoftanks, а подполковник недавно первого сталкера проходил. Короче тут весело)
                • 0
                  Игротеку открывать можно)))
                  • 0
                    раскрыл военную тайну )
            • +3
              Нет, тут винда, но я постараюсь обратить их в свою веру)
              А пост я писал еще на гражданке за два дня до призыва.

              • +1
                Как же вас так угораздило? Или по своей воле?
                • 0
                  У нас военник 70к стоит)
                  А вообще хорошо, что хоть человек доступ к машинкам имеет, несказанно повезло, порой такие части бывают, что и домой не позвонишь.
                  • +1
                    Я попал в уставную часть, так что кроватки по нитке, телефоны по воскресеньям
                    • 0
                      А связь с Интернетом через что и какое к этому отношение в части?
                      • –1
                        А вот это уже военная тайна =)
                  • 0
                    По своей воле выкинуть год жизни? Нет уж. Призвали — пошел, не хочу девять лет сидеть в подполье
        • –1
          >который испраляет раскладку
          поправьте плиз
        • +1
          Автоматическое переключение больше мешает, чем помогает. Так что правильный велосипед:)
          • 0
            А обязательно в sed указывать вот эти символы: "[]{};':\",.\/<>?@#\$^&\`~"?
            Если да, то что будет если их не указывать?
            • 0
              Посмотрите на клавиатуру и подумайте, что будет допустим при наборе емейла не с той раскладкой.
              • 0
                Не додумался сразу, спасибо.
            • –1
              Для информации: есть программка XNeur — альтернатива PuntoSwitcher для Linux.
              • +1
                Я пытался использовать эту программу (в её «ручном» режиме), но в Ubuntu 11.04 она ведёт себя несколько странно и периодически вылетает.
              • +1
                Хмм, слово BOOFER больше похоже на буфера, чем BUFFER =)
                • +1
                  Мдя… это мой косяк) с английским плохо дружу
                • +1
                  куищще -> reboot
                  • +1
                    мне одному кажется что sed тут немного избыточен, и tr придумали как раз для таких вещей?
                    • 0
                      Возможно вы правы, ведь я не волшебник, а только учусь и многое еще не знаю. К сожалению у меня сейчас нету возможности проверить/попробовать tr в действии.
                    • 0
                      Кстати, можете использовать xdottool
                      • 0
                        *xdotool

                        С помощью неё также можно посылать события к клавиатуре.
                      • 0
                        Было бы неплохо при смене раскладки выделенного текста также и переключать раскладку клавиатуры, чтобы не писать кракозябры дальше. Как это можно реализовать?

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