adawdp,
Да, в браузере глючит, пробую исправить, или на три придется делить.
Пользователь добавил сообщение 01 Июня 2016, 11:55:07:
Вот:
#!/bin/bash
# Конвертирование текста набранного в не правильной
# раскладке клавиатуры.
# Направления конвертации:
# rus -> eng, eng -> rus (включая спец. символы)
# определяется по большинству букв одного из языков
# в строке, выделеном или последнем слове.
# Установка необходимых пакетов для работы скрипта:
# sudo apt-get install xvkbd xsel
# Для использования прописать в соответствующем
# конфиге вышей системы вызовы этого скрипта с нужными
# параметрами, при нажатии на определенные сочетания клавиш.
# Параметры конвертирования:
# -string - Вся строка
# -last_word - Последнее слово
# -selected - Выделеное (может некорректно работать)
# -auto - Авто: Выделеное, если нет, вся строка
# -auto2 - Авто: Выделеное, если нет, последнее слово
#######################################################################################
# Обработка параметра скрипта
STRING=false; LAST_WORD=false; SELECTED=false; AUTO=false; AUTO2=false
case "$1" in
-string) STRING=true;;
-last_word) LAST_WORD=true;;
-selected) SELECTED=true;;
-auto) AUTO=true;;
-auto2) AUTO2=true;;
*) echo "Wrong parameter."; exit;;
esac
# Задержка между командами (сек.)
N=0.2
#--------------------------------------------------------------------------------------
# Наборы символов для конвертации
# \x2F - слэш, \x5C - обратный слэш, \x27 - одинарная ковычка.
RUS='ёЁ"№;%:?\x2Fйцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,'
ENG='`~@#$%^&|qwertyuiop[]asdfghjkl;\x27zxcvbnm,.\x2FQWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?'
# Для раскладки Тypewriter
# ENG='`1234567890-=\x5C~!@#$%^&*()_+|qwertyuiop[]asdfghjkl;\x27zxcvbnm,.\x2FQWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?'
# RUS='|№-\x2F":,._?%!;+1234567890=\x5Cйцукенгшщзхъ)фывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪ(ФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ'
#--------------------------------------------------------------------------------------
# Убить все процессы использующие это скрипт, кроме процесса текущего интерпретатора.
lsof -t -p ^$$ "$(readlink -en "${0}")" | xargs kill -9
pkill -9 xvkbd; pkill -9 xsel
#--------------------------------------------------------------------------------------
Select_string() {
# Выделяем строку текста на экране до курсора
xvkbd -xsendevent -text "\[Shift]\[Home]" &>/dev/null
sleep $N
}
Get_selected() {
# Получаем выделеный текст
TEXT="$(xsel -o)"
}
# Получаем последнее слово и строку без последнего слова
Get_last_word() {
# Удаляем пробелы в конце
TEXT="$(echo "$TEXT" | sed 's/ *$//')"
# Получаем последнее слово из текста
LAST_WORD="${TEXT##* }"
# Текст без последнего слова
SUB_STR="${TEXT% *}"
# Если текста было всего одно слово, то оно будет в LAST_WORD и в SUB_STR
# - это позволяет избежать дублирования слова при объеденении переменных
[ "$LAST_WORD" = "$SUB_STR" ] && SUB_STR=""
# Если SUB_STR не пуста, возвращаем ей пробел в конце
[ "$SUB_STR" ] && SUB_STR="$SUB_STR "
TEXT="$LAST_WORD"
}
Conv_en_ru() {
CONV_TEXT="$(echo -n "$TEXT" | sed "y/$ENG/$RUS/")"
# Команда переключения раскладки на RUS
setxkbmap -layout ru,us
}
Conv_ru_en() {
CONV_TEXT="$(echo -n "$TEXT" | sed "y/$RUS/$ENG/")"
# Команда переключения раскладки на ENG
setxkbmap -layout us,ru
}
#--------------------------------------------------------------------------------------
$STRING && { Select_string; Get_selected; }
$LAST_WORD && { Select_string; Get_selected; Get_last_word; }
$SELECTED && Get_selected
$AUTO && { Get_selected; [ -z "$TEXT" ] && { Select_string; Get_selected; }; }
$AUTO2 && { Get_selected; [ -z "$TEXT" ] && { Select_string; Get_selected; Get_last_word; }; }
#--------------------------------------------------------------------------------------
# Проверяем количество символов текста, если меньше двух - выход.
[ ${#TEXT} -ge 2 ] || exit
# Резерв содержимого буфера обмена
BKP_CLIP="$(xsel -ob)"
sleep $N
#--------------------------------------------------------------------------------------
# Подсчет русских и английских букв
RU_CNT=$(echo "$TEXT" | grep -o '[А-ЯЁа-яё]' | wc -l)
EN_CNT=$(echo "$TEXT" | grep -o '[A-Za-z]' | wc -l)
# Конвертируем символы текста букв языка которых больше
[ $RU_CNT -gt $EN_CNT ] && Conv_ru_en
[ $EN_CNT -ge $RU_CNT ] && Conv_en_ru
#--------------------------------------------------------------------------------------
# Для теста
# zenity --info --text "TEXT-$TEXT\nCONV_TEXT-$SUB_STR$CONV_TEXT"
# exit
xsel -c
sleep $N
# Вставка конвертированного текста в буфер обмена
echo -n "$SUB_STR$CONV_TEXT" | xsel -ib
sleep $N
# Вставка конвертированного текста
xvkbd -xsendevent -text "\[Shift]\[Insert]" &>/dev/null
sleep $N
# Восстановление содержимого буфера обмена
echo -n "$BKP_CLIP" | xsel -ib
sleep $N
true
Добавил параметры, задержки.
В браузере уже нормально работает, но одна проблема осталась: не обновляется содержимое буфера выделеного текста после снятия выделения с текста.
Т.е после выделения какого-то текста, снятия выделения, xsel -o и xclip -o -selection clipboard
продолжают выводить этот текст.