Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: HOWTO Не автоматический Перекодировщик неправильной раскладки  (Прочитано 15076 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dfg

  • Автор темы
  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Насмотревшись на глюки xneur намутил себе лисапед, для ручного отката неправильного текста.

Цитировать
#!/usr/bin/perl
use open ':utf8';
use open IO => ':utf8';
use encoding "UTF-8";
qx 'xvkbd  -xsendevent -text "\[Shift]\[Home]"'; #замена всей строки для замены слова ctrl+shift+<-
system("kbde -p RCtrl -p C -r C -r RCtrl");
qx 'xvkbd  -xsendevent -text "\[Delete]"';
system("xclip -o -selection clipboard > /home/home/xxxx");
open(MYFILE, '/home/home/xxxx');  #буферный файл, у вас свой должен быть путь.
while (defined($line=<MYFILE>))
{
$test = $line;
}
close (MYFILE);
if ($test =~ /.*[a-z]{1,3}.*/i )
{
$test =~ tr/qwertyuiop\[\]asdfghjkl\;\'zxcvbnm\,\./йцукенгшщзхъфывапролджэячсмитьбю/;
$test =~ tr/QWERTYUIOP\[\]ASDFGHJKL\;\'ZXCVBNM\,\./ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/;
}
else
{
$test =~ tr/йцукенгшщзхъфывапролджэячсмитьбю/qwertyuiop\[\]asdfghjkl\;\'zxcvbnm\,\./;
$test =~ tr/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/QWERTYUIOP\[\]ASDFGHJKL\;\'ZXCVBNM\,\./;
}
open(MYFILE, '>/home/home/xxxx');
print MYFILE $test;
close (MYFILE);
system("xclip -selection clipboard /home/home/xxxx");
qx 'xvkbd -xsendevent -text "\[Control]\[v]"';
system("kbde -k LCtrl");                       #меняем раскладку, у меня по lctrl

Два таких скрипта вешаются на хоткей, один заменяет строку, другой последнее слово.
В системе должны стоять perl, xclip, xvkbd,kbde.
Работает везде, где поддерживается функция копи-паста.
« Последнее редактирование: 18 Мая 2008, 23:04:01 от Dfg »

Оффлайн Dfg

  • Автор темы
  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Немного мондифицировалл скрипт для форсированной перекодировки в gtk приложениях.

Цитировать
# linux switcher переключатель клавиатуры
use open ':utf8';
use open IO => ':utf8';
use encoding "UTF-8";
qx 'xvkbd -xsendevent -text "\S\[Home]\Cc"';
$test = qx 'xclip -o -selection clipboard';
if (($test =~ /.*[a-z|а-я]{1,3}.*/i) != 1 ) #если не gtk-box
{
system("kbde -d 35 -p RCtrl -p C -r C -r RCtrl"); #for qt & web
}
#qx 'xvkbd  -xsendevent -text "\[Delete]"';
system("xclip -o -selection clipboard > /home/home/xxxx");
open(MYFILE, '/home/home/xxxx');
while (defined($line=<MYFILE>))
{
$test = $line;
}
close (MYFILE);
if ($test =~ /.*[a-z]{1,3}.*/i )
{
$test =~ tr/qwertyuiop\[\]asdfghjkl\;\'zxcvbnm\,\./йцукенгшщзхъфывапролджэячсмитьбю/;
$test =~ tr/QWERTYUIOP\[\]ASDFGHJKL\;\'ZXCVBNM\,\./ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/;
}
else
{
$test =~ tr/йцукенгшщзхъфывапролджэячсмитьбю/qwertyuiop\[\]asdfghjkl\;\'zxcvbnm\,\./;
$test =~ tr/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/QWERTYUIOP\[\]ASDFGHJKL\;\'ZXCVBNM\,\./;
}
open(MYFILE, '>/home/home/xxxx');
print MYFILE $test;
close (MYFILE);
system("xclip -selection clipboard /home/home/xxxx");
qx 'xvkbd -xsendevent -text "\[Control]\[v]"';
system("kbde -d 30 -k LCtrl");

kbde вобще штука занятная. Действует абсолютно глобально, в отличии от xvkbd(для gtk clip only).
Можно, например, забиндить в кваке комбинацию на рокетджамп с одной кнопки.)
« Последнее редактирование: 29 Марта 2008, 17:26:39 от Garfeild »

Оффлайн Crew

  • Старожил
  • *
  • Сообщений: 1384
  • xneur 0.20.0
    • Просмотр профиля
Да, но вот только как быть, если в некоторых приложениях бинды не Ctrl+C(V), а Ctrl+Shift+C(V)? Это например tilda.
Опять же, выделение клавишами не работает в gnome-terminal.

Не воспринимайте это как критику, но этот скрипт нерешает свою задачу в общем случае. :( В икснеуре я пытался использовать эти механизмы с выделением и вставкой, но, как я уже говорил, в общем случае, это не решение проблемы.
PPA cо стабильными сборками xneur: ppa:andrew-crew-kuznetsov/xneur-stable
PPA c "ночными" сборками xneur: ppa:andrew-crew-kuznetsov/xneur-unstable

Оффлайн Dfg

  • Автор темы
  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Все с чем я работаю поддерживает именно эти комбинации. xchat, gajim, OO, opera, kate, sim и многое другое.

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

Насчет терминала. У меня там язык английский по умолчанию. Что там на русском писать?)
Плюс (вроде) как-то попадалась инфа, как сделать поддержку копи-паста в терминале.

Оффлайн roog

  • Любитель
  • *
  • Сообщений: 54
    • Просмотр профиля
 ;) молодец, а теперь давай подробнее как установить скрипт, ну и про автозагрузку не забудь. :coolsmiley:

Оффлайн Dfg

  • Автор темы
  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Берем архив. Распаковываем.

Кидаем в домашнюю дирректорию файлы xxxx и linsw
Кидаем в /usr/bin бинарник xclip. (это патченная версия с поддержкой юникода, сперто в altlinux)
Ставим из репов xvkbd (это программный эмулятор клавы)

Далее сборка ядреного эмулятора клавы.

В архиве заходим в каталог kbde-driver-1.1.6, и делаем make
В каталоге driver, появится модуль kbde.ko, его надо подгружать при  старте системы.

Я просто прописал в rc.local

mknod --mode=200 /dev/kbde c 11 0
chgrp users /dev/kbde
chmod 220 /dev/kbde
insmod /путь/kbde.ko


Если найдете kbde в репах, ставте))

Ну и навеска скрипта на хоткей. У меня fluxbox, поэтому.

/.fluxbox/keys
Super_L :ExecCommand /home/home/linsw

зы. Вобще не нравится, что приходится использовать доп. ядерный модуль kbde.
Но без него не работает компирование в буфер обмена в qt прогах, им же я переключаю раскладку.
 Удобно было бы переложить это все на софтовый xvkbd, но он почему то не работает с qt.
Я узнавал этот вопрос у японы разработчика, но тот ничего вразумительного он так и не ответил.

зыы. Если есть идеи как по-другому переключать раскладку или эмулировать нажатия клавиш - пишите.

Оффлайн Dfg

  • Автор темы
  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Переписал переключалку на питон, избавившись этим от 2 виртуальных клав, необходимости собирать ядреный модуль, а так-же буферного файла.

#!/usr/bin/python
# -*- coding: utf-8 -*-
import subprocess, string, re, virtkey, time

time.sleep(0.4)

v = virtkey.virtkey()

def lpress(w,x):
v.lock_mod(w)
v.press_keycode(x)
v.release_keycode(x)
v.unlock_mod(x)

def slpress(w,x,y):
v.lock_mod(w)
v.lock_mod(y)
v.press_keycode(x)
v.release_keycode(x)
v.unlock_mod(y)
v.unlock_mod(w)

def press(w):
v.press_keycode(w)
v.release_keycode(w)

lpress(1<<0,97)#выделяем всю строку Shift+Home, для выделени слова используем slpress(1<<0,100,1<<2)
lpress(1<<2,54)#копируем Ctrl+C

p1 = subprocess.Popen("xclip -o -selection clipboard",shell=True,stdout=subprocess.PIPE)
s = p1.communicate()[0]
if s != "":
s = str(s).decode('utf-8')
s = s.encode('cp1251')
tbl = string.maketrans(u"йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ".encode('cp1251'), u"qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>".encode('cp1251'))
tbl2 = string.maketrans(u"qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>".encode('cp1251'), u"йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ".encode('cp1251'))
if re.compile(".*[a-z]{1,3}.*",re.I).match(s) != None:
s = s.translate(tbl2).decode('cp1251').encode('utf-8')
else:
s = s.translate(tbl).decode('cp1251').encode('utf-8')
#s= ""
#s= s.decode('utf-8').encode('cp1251').decode('cp1251').encode('utf-8')
table3 = {'^)':':)','^D':':D',':В':':D','Ж)':':)','^В':':D'}# :)
for k in table3.keys():
s = s.replace(k,table3[k])
proc = subprocess.Popen(u"xclip -selection clipboard", shell=True, stdin=subprocess.PIPE)
proc.communicate(s)
press(107)
lpress(1<<2,55)#вставляем перекодированный вариант Ctrl+v

#смена раскладки у каждого своя
press(37)# изменяем раскладку клавы, L_Ctrl
#Коды клавиш для комбинаций
#зажать Shift 1<<0
#зажать Alt 1<<1
#зажать Ctrl 1<<2
#Пример смены раскладки по по комбинации Ctrl+Shift
#lpress(1<<2,37)
#Пример смены раскладки по CapsLock
#press(66)
#Код клавиши можно узнать набрав в шелле xev

Все что необходимо, это установить из репов python (наверняка у многих уже стоит) и библиотеку python-virtkey (так-же есть в репах, кинул в архив на всяк случай)
Скопировать xclip в /usr/bin
Скопировать питоновский скрипт linsw в нужное вам место и навесить его на хоткей.
В конце скрипта отредактировать код для вашего переключения раскладки.
Примеры даны.

http://ifolder.ru/6606307
« Последнее редактирование: 27 Мая 2008, 09:10:02 от Dfg »

Оффлайн snsanych

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Переписал переключалку на питон, избавившись этим от 2 виртуальных клав, необходимости собирать ядреный модуль, а так-же буферного файла.

Скопировать xclip в /usr/bin
интересно почему xclip из репозитария вставляет белиберду в буфер в отличии от приложенного
aptitude show xclip
Пакет: xclip
Состояние: установлен
Автоматически установлен: да
Версия: 0.08-7
Приоритет: необязательный
Раздел: universe/x11

Оффлайн Dfg

  • Автор темы
  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Это патченная версия из altlinux-а. По дефолту он юникод не умеет.

Оффлайн snsanych

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Это патченная версия из altlinux-а. По дефолту он юникод не умеет.
понятно, спасибо за идею и воплощение :)

Оффлайн Dfg

  • Автор темы
  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Да пожалуйста)

Оффлайн Q3303Z

  • Участник
  • *
  • Сообщений: 154
  • в фортачки дует вирями, а дома тихо и спокойно
    • Просмотр профиля
2Dfg, хорошая работа)), но вот одна незадачка наблюдается: а что если в буфере уже содержится важная инфа? Ее же надо перед этими манипуляциями сохранить куда-нить, не так ли?))
Ubuntu(vmware) miniServer [apache2/perl/mysql/php]

Оффлайн Dfg

  • Автор темы
  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Можно в принципе прикрутить сохранение/востановление буфера. Мне то это не мешает как то.)

Оффлайн Q3303Z

  • Участник
  • *
  • Сообщений: 154
  • в фортачки дует вирями, а дома тихо и спокойно
    • Просмотр профиля
да, вот еще такой вопрос: а xclip может работать(сохранять) только текстовые данные в буфере или вот такой коммандой
$ xclip -o -selection clipboard > $HOME/xclip.out
можно сохранить и, скажем, скопированный из гимпа кусок изображения?
Ubuntu(vmware) miniServer [apache2/perl/mysql/php]

Оффлайн Dfg

  • Автор темы
  • Активист
  • *
  • Сообщений: 323
    • Просмотр профиля
Не пробовал, помоему не получится такое)

А для сохранения буфера достаточно в принципе добавить пару трочек в скрипт.
В начале

def press(w):
v.press_keycode(w)
v.release_keycode(w)

##############################################
#запоминание текущего состояния буфера
p1 = subprocess.Popen("xclip -o -selection clipboard",shell=True,stdout=subprocess.PIPE)
s1 = p1.communicate()[0]
#################################

lpress(1<<0,97)#выделяем всю строку Shift+Home, для выделени слова используем slpress(1<<0,100,1<<2)
lpress(1<<2,54)#копируем Ctrl+C

И в самом конце

########################################
#восстановление состояния буфера
proc = subprocess.Popen(u"xclip -selection clipboard", shell=True, stdin=subprocess.PIPE)
proc.communicate(s1)
#########################################
« Последнее редактирование: 26 Июня 2008, 16:21:14 от Dfg »

 

Страница сгенерирована за 0.038 секунд. Запросов: 26.