Полезные мелочи: перекодировка неправильной раскладки

    Часто случается, что текст набран в неправильной раскладке.
    Владение методом слепого набора, конечно, существенно уменьшает эту вероятность, но казусы всё равно случаются.
    Особенно обидно, если текст довольно большой и перенабирать лень.


    1. unix way

    Самое очевидное — написать перекодировщик из stdin в stdout:
    #!/usr/bin/perl -CS
    use utf8;
    $lat=q(`~!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:"|ZXCVBNM<>?);
    $cyr=q(ёЁ!"№;%:?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ,);
    while(<>) { eval "tr{$lat$cyr}{$cyr$lat}"; print; }

    /* '-CS' тут устанавливает кодировку utf8 для stdin и stdout, 'use utf8' — кодировку самого текста скрипта.
    В принципе, можно засунуть всё это в однострочник:
    perl -CS -Mutf8 -pe 'tr/qwerty...цйук.../йцук...qwert.../;'
    */

    Upd:
    Вместо perl можно использовать более дефолтовый sed:
    sed -e 'y/qwerty...цйук.../йцук...qwerty.../'

    Этот скрипт вполне естественно прикрутить, например, в klipper из kde:
    Для регулярного выражения .* (любой текст), команда: echo -n "%s" | translit
    В gnome наверняка есть что-нибудь похожее.
    Правда, вызвать его не очень удобно, поскольку klipper не умеет привешивать хоткеи на отдельные действия:
    1. Выделить текст
    2. Поместить в буффер
    3. Вызвать меню действий
    4. Выбрать действие (курсором)
    5. Вставить текст из буффера


    2. xclip

    С помощью утилитки xclip можно вытаскивать текст из буфера и помещать его обратно.
    Причём можно обрабатывать как буфер обмена (clipboard), так и текст выделенный мышью (primary selection).
    Команда: xclip -out | translit | xclip -in
    Перекодирует выделенное левой кнопкой мыши, результат можно вставить средней кнопкой мыши.
    Чтобы обрабатывать не мышиное выделение, а буфер обмена:
    xclip -out -sel clip| translit | xclip -in -sel clip

    3. xdotool

    Универсальной команды «поместить выделенный текст в буфер/из буфера» в иксах нету.
    Зато в большинстве программ это выполняется нажатиями Ctrl-C/Ctrl-V.
    Нажатия этих клавиш можно симулировать утилитой xdotool.
    Команда в результате получется такая:
    xdotool key 'ctrl+c'; xclip -out -sel clip | translit | xclip -in -sel clip; xdotool key 'ctrl+v'
    Её можно повесить на глобальный хот-кей.
    1. Выделяем текст как угодно
    2. Нажимаем хот-кей
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 79
    • +7
      а еще есть (g)xneur: xneur.ru/
      • +3
        больно хотячая до ресурсов программулина, уж очень порядочно подтормаживает с ней система, пришлось отказаться.
        • 0
          Отключите звук. И всё будет нормально.
          • 0
            а как быть с тем, что при смене раскладки и переконвертации слова первая буква дублируется на английском языке?
            • 0
              Не встречался с таким.
              Попробуйте обновиться.

              Была одна проблема, при занесении в автозагрузку gxneur, программа запускалась до каких-то других служб и горячие клавиши не работали.
              Лечится записью в автостарте такой команды: bash -c «sleep 15 && gxneur».
              Речь идёт об Ubuntu 10.04.
              • 0
                Извините.
                Кавычки должны быть просто двойными. Типографские парсер поставил.
                • +1
                  в фаерфоксе он себя так ведет, скорее это проблема самого фокса. А недавно совсем веселуха началась — может одну букву писать латиницей а вторую кbриkbцеq — до перезагрузки gdm
          • +1
            Он довольно глючный. Периодически вылетает, в гтк-виджетах из-за него перестают работать гиперссылки.
          • +1
            xneur скорее для автокоррекции, а смена раскладки там до кучи.
            ну и навороченное оно до ужаса:
            ldd `which xneur` | wc -l
            57
            включая библиотеки для воспроизведения аудио.

            • 0
              А можно сделать какой-нибудь DE-независимый вариант, который бы по хоткею заменял бы выделенный текст? Было бы удобно для браузера, например (не везде ж есть Яндекс.Бар)
              • 0
                ну так это вполне DE-независимый вариант.
                нужен перл и две утилитки.
                • 0
                  Не совсем. Я так понимаю, что: а) это требует куда-то копировать текст б)это привязано к какому-то приложению (хотя бы эмулятор терминала). Я имею ввиду, что-то, что работало бы в фоне и срабатывало на любом выделеном тексте на любом месте экрана в любом приложении
                  • 0
                    доступа к «любому выделенному тексту» в иксах я не нашёл.
                    выделение текста обрабатывается приложением (и ещё драйвером мыши).
                    такчто универсального способа не получится.
                    а решение с мышью я привёл.
                    сейчас напишу ещё одно.
                    • 0
                      Почти все приложения X11 при выделении текста автоматически копируют его в первичный буфер обмена.
                      • 0
                        qt-шные не копируют.
                    • 0
                      требует копировать в иксовый буфер.
                      xdotool работает с любым иксовым приложением(аля эмулирует нажатие на клаву мышь) — в данном случае зависит от того работает ли ^C ^V в приложении (а это в том же xterm не работает), т.е. надо заточить для сочетаний шифт-инсерт шифт-дел (как работают они — во всех или нет не знаю, но думаю определять приложение и в некоторых юзать сочитаня с шифтом не составит особого струда)

                      автору спасибо — как всегда самое простое решение лежит на поверхности, но его очень трудно увидеть =)
                • –9
                  Вообще мне нравится Punto — в нем есть раскладкоисправлятель. Жаль, конечно, что для линукса его не планируют выпускать, но… для Мака и Винды уже есть.
                  • –8
                    Почему если не хочется плюсовать надо обязательно минусануть и плюнуть в карму?
                    ps. потом не жалуйтесь, если я буду приходить с просьбой написать пост или вопрос :)
                    • +7
                      Потому, что для Linux есть (g)xneur…
                      И такие решения, как описано в топике…

                      Почему, если не в теме, то нужно написать глупость?
                      Промолчал бы (и почитал внимательно), сэкономил бы карму ;)
                      В качестве бонуса — знания…
                      • –8
                        Ну во-первых, я не линуксоид ;)
                        Во-вторых, я боюсь это сказать, но «я просто сказал» (с) и просто поделился тем чем обладаю
                        • +4
                          внезапно, это блог для линуксоидов.
                          • +2
                            Внезапно, это блог про линукс для всех желающих его почитать.
                            • +1
                              это блог про линукс

                              Ну, а зачем было оставлять комментарий, полный сожаления? Тем более, что в первом уже приводился пример функционально схожей утилиты.
                          • 0
                            > Ну во-первых, я не линуксоид ;)
                            Это было видно сразу, при упоминании про Punto…
                            И про отсутствие знания про xneur, который позиционируется как его аналог.

                            Этот комментарий писать не нужно было, ибо он совершенно бесполезный.
                            За что и наказали…

                            Или вы действительно считаете, что линуксоиды на столько тупые, что не владеют информацией о состоянии дел «по ту сторону баррикад»?
                            ;)

                            P.S.
                            Давай не будем выходить за рамки обсуждаемой темы…
                            Лучше обрати внимание, как легко и просто, парой однострочных скриптов, реализован функционал, который «у вас» реализуется мегабайтами кода ;)
                            • 0
                              на самом деле punto и xneur реализуют и другой функционал:
                              смена раскладки на лету/автоопределение языка.
                              а вот это так просто скриптами уже не сделать.
                              • –11
                                > который «у вас» реализуется мегабайтами кода ;)
                                А вот не надо ;) «у нас» есть самая фантастическая, короткая и замечательная строка кода, про которую написано так много сказаний — format c: :)
                                • +9
                                  Я ж говорю, у вас все длинное и бестолковое…
                                  rm -rf /

                                  ;)
                                  • –7
                                    Это не настолько красиво и брутально :) Виндовая больше знаменита
                                    • +3
                                      Нашли чем мериться, горячие эстонские парни =)
                                      • –6
                                        Ааа, так вот кто минусует! =)
                                      • 0
                                        Это пока вам ее не засвинячили в BASE64, в виде безобидного скрипта ;)
                                        • 0
                                          На самом деле очень красиво, проверено, наблюдать как система гордо втыкает себе нож в брюхо и усиленно начинает его там крутить. Полный суицид не получился, полностью сама себя не захотела добить, но под конец напоминала прикованного к постели больного, которого оставалось только из жалости добить.
                                      • 0
                                        А вот не надо ;) «у нас» есть самая фантастическая, короткая и замечательная строка кода, про которую написано так много сказаний — format c: :)

                                        ваша же любимая винда запилит сеё действо на корню
                                  • +2
                                    зачем вы так с детьми
                                    • +1
                                      Простите, синдром учителя…
                                      Я им два года в школе мозги вправлял…
                                      (экспериментальный курс информатики на базе OS Linux)

                                      Видать по инерции ;)
                                      • 0
                                        Синдром учителя — это фразы вроде:
                                        — Где тетрадь? Дома забыл? А голову ты дома не забыл?
                                        Вы своим ученикам тоже такое говорили?
                                        • 0
                                          :)
                                          Нет. У меня был лекционный стиль. Я тетради и конспекты не требовал…
                                          Но за слова «Открываем файл в текстовом редакторе» давал в зубы VIM и объяснял разницу между текстовым редактором и WYSIWYG.
                                          Попутно, текстовый файл и текстовый документ…
                                          И т.д.…

                                          Было очень интересно и познавательно.
                                  • +2
                                    Потому что иногда хочется минусануть, а то и плюнуть в карму. Особенно тем, кто просит её поднять, чтобы помочь написать бестолковый комментарий вроде этого.
                                  • 0
                                    потомучто, кроме прочего, хочется чтобы в этом топике и в этом блоге не писали всякую оффтопичную хуйню, например.
                                    • 0
                                      За красивое решение, однозначно, респект.
                                      А за отсутствие выдержки, нет…

                                      Он же ж (loshvitalik) еще молодой очень… Прояви снисходительность.
                                      Я то же виноват, больше не буду объяснять ему, в чем он не прав…

                                      ;)
                                      • –8
                                        Простите, не удержался.
                                        > Прояви снисходительность.
                                        > Карма –5,0 7 голосов
                                        • +2
                                          Не нужно клянчить карму…
                                          Сделай выводы молча.
                                          И впредь будь умнее…
                                          • –8
                                            Это был сарказм :) И никакие ни клянчинья.
                                            • +4
                                              Это был не сарказм, это было нытьё.
                                  • 0
                                    в него, говорят, яндекс кучу всякого непонятного напихал.
                                    наверно, поэтому и не планируется под линукс (там не любят closed-source)
                                    • –3
                                      Я один не вижу там ничего непонятного? Ну хотя даа, эти постоянные коннекты с Яндексом, разве они это утаивают?
                                  • +1
                                    Советовал бы еще описать как последние два варианта можно прикрутить к xbindkeys
                                    • 0
                                      из-за испоьлзования в команде xdotool key ctrl-c
                                      при назначении на control + что-нибудь получается залипание состояния клавиши control.
                                      (команда выполняется при нажатой клавише control)
                                      как от этого избавиться непонятно.
                                      • 0
                                        Аналогичное залипание Ctrl и Shift у меня. И не пойму как гуглить проблему. Может кто подскажет английский аналог слова «залипание» в данном контексте?
                                    • 0
                                      а разве xclip не умеет доставать выделенный текст?
                                      • 0
                                        только выделенный мышью (primary selection)
                                      • +3
                                        > Полезные мелочи: перекодировка неправильной раскладки

                                        В заголовке вообще какая-то путаница в терминологии.
                                        1) Перекодировка — это изменение кодировки текста (utf-8, cp1251, KOI8-R, cp866 и др.), и этим занимаются утилиты вроде iconv.
                                        2) Раскладка клавиатуры — это схема расположения клавиш на клавиатуре, например, раскладка QWERTY (ЙЦУКЕН/QWERTY), AZERTY, Dvorak и др.

                                        А то, о чём вы говорите, называется преобразованием языка ввода (input language). В данном случае это преобразование делается уже после ввода текста.
                                        • 0
                                          перекодировка это преобразование входного потока в выходной согласно заданного алгоритма кодирования
                                          остальное всё частности
                                          • 0
                                            согласен. название некорректное. зато понятное и не громоздкое.
                                          • 0
                                            давно написал себе скрипт и повесил на хоткей:

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


                                            Без всяких перлов работает…
                                            • 0
                                              хм. раньше оно вроде не работало с utf8 локалью (также как и tr из coreutils)
                                            • 0
                                              Зачем целый perl, когда есть tr?
                                              • 0
                                                целый tr не умеет utf8.
                                              • 0
                                                Спасибо, прикрутил.
                                                Чаще всего белиберда замечается не сразу, можно вначале ещё прикрутить shift+home для выделения, чтобы ручками не делать, да и в конце не мешал бы какой-нибудь echo "" | xclip для того чтобы сконверченная белиберда при случайном нажатии хоткея не вставилась куда не надо.
                                                • 0
                                                  А меня прет по новой набирать.
                                                  Половину из-того что уже было набрано — выбрасываешь и пишешь дальше )
                                                  • 0
                                                    >Особенно обидно, если текст довольно большой и перенабирать лень.

                                                    Быть может вы хотели сказать: особенно обидно, если текст в пять тысяч символов и перебирать лень? :)
                                                    Стёр те пару слов и набрал, ничего сложного)

                                                    Лично я приучил себя следить за раскладкой в фоновом режиме и всё прекрасно. Когда вы так делаете, — вы не плюётесь и не выкрикиваете «чорт!», нажимая Pause/Break. И настроение вцелом намного лучше :)
                                                    • 0
                                                      Если бы в Gnome починили баг с переключением языка ввода, то я бы гораздо реже набирал всякую ерунду не теми буквами…
                                                      • 0
                                                        Это всё, конечно, замечательно, но тру-пацан-вэй — таки освоить слепой набор.
                                                      • +1
                                                        автоматическое переключение раскладки — для домработниц
                                                        • 0
                                                          Вам бы скрипт в deb-пакет и на Launchpad PPA :). Я бы тут же поставил.
                                                          • 0
                                                            зачем три строчки текста в пакет?
                                                          • –1
                                                            легче будет заново текст набрать, чем так заморачиваться
                                                            • 0
                                                              Вот мой вариант:

                                                              #!/bin/bash
                                                              
                                                              # сохраняем выделение в файл
                                                              xclip -o -selection primary > /tmp/~sel.tmp
                                                              
                                                              # сохраняем буфер обмена в файл
                                                              xclip -o -selection clipboard > /tmp/~clip.tmp
                                                              
                                                              # чтобы не напечатать содержимое буфера обмена, если ничего не выделено, мы его очистим
                                                              xclip -i -selection clipboard
                                                              
                                                              # очищаем выделение
                                                              xdotool key Delete
                                                              
                                                              # записываем обработанный выделенный текст в буфер обмена
                                                              cat /tmp/~sel.tmp | sed "y/\`~\!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?ёЁ\!\"№;%:?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛД
                                                              ЖЭ\/ЯЧСМИТЬБЮ,/ёЁ\!\"№;%:?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ\/ЯЧСМИТЬБЮ,\`~\!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<
                                                              >?/" | xclip -selection clipboard
                                                              
                                                              # при проблемах установить задержку по вкусу:
                                                              sleep 0.1
                                                              
                                                              # вставляем содержимое буфера обмена
                                                              xdotool key Shift+Insert
                                                              
                                                              # восстанавливаем буфер обмена из файла
                                                              cat /tmp/~clip.tmp | xclip -in -selection clipboard
                                                              
                                                              # удаляем временные файлы
                                                              rm /tmp/~clip.tmp /tmp/~sel.tmp
                                                              
                                                              # опционально меняем раскладку
                                                              xdotool key alt+shift
                                                              
                                                              # shift иногда может залипать, это решает проблему
                                                              xdotool key Shift
                                                              


                                                              Этот скрипт вешается, например, на Shift+Break, и меняет раскладку выделенного текста и клавиатуры. Буфер обмена не изменяется, Ctrl+C не используется.

                                                              Иногда после его использования, а именно из-за xdotool key Shift+Insert программно залипает кнопка Shift. Чтобы решить проблему, нужно выполнить скрипт ещё раз.

                                                              Вот так.
                                                              • 0
                                                                таки этот скрипт будет перекодировать только то, что выделено мышью.
                                                                Ctrl-C я вставлял чтобы достать то, что выделено средствами приложения.

                                                                мышиное выделение, оно, конечно, универсальнее.
                                                                но вставление текста Shift-Ins тоже может где-нибудь не проехать.
                                                                • 0
                                                                  Ну, тогда скрипт можно слегка поправить. Я сначала думал вместо primary selection нажимать Shift+Del, «вырезать», но в некоторых ситуациях это может быть опасно, как и Ctrl+C.

                                                                  И да, почему только то, что выделено мышью? Ведь и с клавиатурным выделением работает. Если я вижу, что я набираю неправильно, я жму Shift+Ctrl+Left и Shift+Break. У тебя не так?
                                                                  • 0
                                                                    не так.
                                                                    firefox и chrome, например, помещают выделение курсором в primary
                                                                    а qt-шные приложения из всех попробованых — нет.

                                                                    возможно даже, имеет смысл написать им.
                                                                    • 0
                                                                      Тогда вместо первых двух команд нужно написать такое:

                                                                      xclip -o -selection clipboard > /tmp/~clip.tmp
                                                                      
                                                                      xdotool key Ctrl+Insert
                                                                      
                                                                      xclip -o -selection clipboard > /tmp/~sel.tmp
                                                                      
                                                                      xclip -i -selection 
                                                                      ...
                                                                      


                                                                      А если будут проблемы с Ctrl, добавить в конец

                                                                      xdotool key Ctrl
                                                                      
                                                              • 0
                                                                Перекодировать неправильную кодировку и показывать текст в окошке можно так:

                                                                Msg=$(xclip -out | iconv -f cp1251 -c) && kdialog --msgbox "$Msg"
                                                                • 0
                                                                  Да, супер! Пару месяцев пользуюсь именно таким способом (использую вариант с sed)
                                                                  Это в 100500 раз лучше Punto и xneur
                                                                  А всё потому, qbh hfx fy nd.sub j dujptunph' «DVORAK»
                                                                  =))

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