Пользователь
0,0
рейтинг
3 июня 2011 в 03:58

Администрирование → Исправление раскладки клавиатуры а-ля 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.

Скачать скрипт можно по этой ссылке
Андрей Сурнин @imitsuran
карма
18,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (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
              По своей воле выкинуть год жизни? Нет уж. Призвали — пошел, не хочу девять лет сидеть в подполье
              • 0
                Уважуха!
  • –1
    >который испраляет раскладку
    поправьте плиз
    • +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
    Было бы неплохо при смене раскладки выделенного текста также и переключать раскладку клавиатуры, чтобы не писать кракозябры дальше. Как это можно реализовать?

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