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


Автор Тема: Скрипты частично заменяющие или дополняющие функционал программы xNeur.  (Прочитано 678172 раз)

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

adawdp

  • Автор темы
  • Гость
2016 May 29; 07:46 PM; Oakville, ON, Canada.

А есть ли возможность как-то сделать более быстрым вот этот скрипт?
(Нажмите, чтобы показать/скрыть)
— Этот скрипт исправляет раскладку в одном слове, т.е. в любой фразе до пробела и при этом не нужно делать выделение текста. Я приводил его, когда начинал эту тему.
— Скрипт перебирает  медленно буквы до пробела хотелось бы это дело убыстрить…

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
adawdp, Смотря в какой программе… Если нужно одно слово от текущей позиции влево есть комбинация «Ctrl+Стрелка_влево». И +Shift если надо выделить. Но в консоле например такое выделение не сработает.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

  • Автор темы
  • Гость
2016 May 30; 08:20 AM

— Да, Azure, абсолютно верная мысль, а главное простая… :( Что же я так переусердствовал… :(
Код: (bash) [Выделить]
gsettings set org.gnome.desktop.input-sources current 'uint32 1' #русский
#sleep 0.1; xdotool sleep 0.1 key Shift+Home
sleep 0.1; xdotool sleep 0.1 key Shift_L+Control_L+Left
xsel | sed "y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.\/<>?@#\$^&\`~фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбюБЮ№ёЁ/фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбю.БЮ,\"№;:?ёЁabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.<>#\`~/" | xsel -b -i
sleep 0.1s
xdotool key Shift+Insert
sleep 0.1s
xsel --clear
— Мгновенно меняет раскладку одного слова слева от курсора… Что касается консоли, то мне пока не приходилось использовать там кириллицу или другие алфавиты, достаточно просто того, что она там отображается. Возможность писать кириллицей конечно настроена, у меня там даже настройки для мыши слева от клавиатуры ( для левши, коим я являюсь) :)
— Правда есть маленький недостаток с символами “э(')“ ; “ж(; )“ ; “б(,)“ ; “ё(`)“ выделение происходит до этих символов ('rjyjvbrf →  'кономика)
— В скрипте, который под спойлером в предыдущем моём сообщении замена происходит корректно, но медленно :(
« Последнее редактирование: 30 Мая 2016, 15:25:13 от adawdp »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
— Правда есть маленький недостаток с символами “э(')“ ; “ж(; )“ ; “б(,)“ ; “ё(`)“ выделение происходит до этих символов ('rjyjvbrf →  'кономика)
Два С+<- , С+->, ->, С+S+End ?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн martin_wanderer

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
2016 May 29; 07:46 PM; Oakville, ON, Canada.

А есть ли возможность как-то сделать более быстрым вот этот скрипт?
— Скрипт перебирает  медленно буквы до пробела хотелось бы это дело убыстрить…
Именно поэтому я в своем варианте использую Shift+Home, а потом регуляркой выделяю последнее слово. Точнее "непрерывные непроблелы" - Ctrl+Left спотыкается обо все, что не буква.

Пользователь добавил сообщение 30 Мая 2016, 21:41:05:
…если есть необходимость
  • использовать несколько раз одни данные — переменная
  • в повторении одинаковых действий — функция
Если нет повторений — не нужно ни то, ни другое.
2. …Или строить конвейеры из самых простейших команд tr, cut, paste, join, printf, echo
По второму пункту полностью согласен, а в первом есть еще один вариант: данные нужны всего один раз ( например для передачи на вход какого-нибудь API ), а код для получения этих данных весьма объемен. В такой ситуации я не гнушаюсь завести функцию даже для однократного вызова, и подставить ее вызов в качестве аргумента.

Пользователь добавил сообщение 30 Мая 2016, 21:43:32:
Два С+<- , С+->, ->, С+S+End ?
А если это слово: "ёжиковый"?
« Последнее редактирование: 30 Мая 2016, 21:43:32 от martin_wanderer »

adawdp

  • Автор темы
  • Гость
2016 May 30; 04:26 PM

Цитировать
Два С+<- , С+->, ->, С+S+End ?
А если это слово: "ёжиковый"?
— Дело в том, что Ctrl+C+C+←, например, точно так «спотыкается» обо всё что не буквы :( , ну например „бордюр“ две “мины” сразу…
Martin_wanderer буду сейчас рассматривать Вашу композицию…

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
adawdp, Вы меня не поняли. Если менять надо только 1 слово, значит слово перед ним написано правильно. Два «Ctrl + <-» — начало предыдущего слова, «Ctrl + ->» конец предыдущего … Хотя уже сам вижу проблемы если редактируемое слово первое…
Давайте попробуем модифицировать Ваш скрипт.
Код: (bash) [Выделить]

sleep 0.1; xdotool sleep 0.1 key Shift+Home
DONOTCHANGE=$(xsel -op | grep -o '.*\s\<')
TOMODIFY=$(xsel -op | grep -o '\S\+\s*$' | sed "y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.\/<>?@#\$^&\`~фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбюБЮ№ёЁ/фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбю.БЮ,\"№;:?ёЁabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.<>#\`~/")
echo -n "${DONOTCHANGE}${TOMODIFY}" | xsel -ib
xdotool key Shift+Insert
Добавьте что ещё надо, ну и потестить желательно на разных данных.
P.S. Если переводите на русский, зачем такая длинная строка замены? Разумно оставить только англ —> рус символы.
« Последнее редактирование: 31 Мая 2016, 08:35:57 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

  • Автор темы
  • Гость
2016 May 31; 11:19 AM

Azure, что-то где-то не так в той строке, что закомментирована, но если сделать как я изваял :), то пока работает… И с русского на английский и с английского на русский с проблемными словами типа: жук, ёжик, бордюр, буженина, эхолот, подъём
Код: (bash) [Выделить]
#!/bin/bash
gsettings set org.gnome.desktop.input-sources current 'uint32 1' #русский
sleep 0.1; xdotool sleep 0.1 key Shift+Home
#DONOTCHANGE=$(xsel -op | grep -o '.*\s\<')
DONOTCHANGE=$(xsel -op | sed -e 's/[^ ]*$//')
TOMODIFY=$(xsel -op | grep -o '\S\+\s*$' | sed "y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.\/<>?@#\$^&\`~фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбюБЮ№ёЁ/фисвуапршолдьтщзйкыегмцчняФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯхъХЪжэЖЭбю.БЮ,\"№;:?ёЁabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]{};':\",.<>#\`~/")
echo -n "${DONOTCHANGE}${TOMODIFY}" | xsel -ib
xdotool key Shift+Insert
— В том варианте, что с #DONOTCHANGE=$(xsel -op | grep -o '.*\s\<') почему-то в некоторых случаях пропадало предпоследнее слово, я не смог понять почему и заменил на более мне понятную конструкции с sed.
— А большое количество символов для замены это не я придумал, это я списал, ибо необычайно силён в плагиате :) !

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля

adawdp,
Цитировать
— Этот скрипт исправляет раскладку в одном слове, т.е. в любой фразе до пробела и при этом не нужно делать выделение текста. Я приводил его, когда начинал эту тему.
А мой скрипт исправляет не только последнее слово, но и (или) выделеленый текст если он имеется.
Что в некоторых ситуациях очень нужно.
+ Автоопределение направления исправления (конвертации) текста.
+ Содержимое буфера остается целым.

Azure,
Вместо head -1 -> line
(-3 знака) :)
« Последнее редактирование: 01 Июня 2016, 11:50:31 от Cxms »

adawdp

  • Автор темы
  • Гость
2016 May 31; 12:26 PM

Cxms, буду тестировать Ваш! Потом напишу.У Вас, конечно, по заявленному функционалу весьма солидно получилось!
— А я всё разделил на три скрипта. Один изменяет раскладку всей строки, другой раскладку последнего слова и третий раскладку выделенного текста. Все запускаются по hotkeys Scroll Lock, Pause Break и Shift+Pause Break соответственно.
— Использую в основном в строке browser'a при составлении запросов. Надо бы потестировать на других программах. Не факт, что будет работать везде :(, мои точно, за Ваш пока не знаю.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Cxms, adawdp, Пытался предусмотреть случай если после меняемого слова будет поставлен пробел. Пока такgrep -Po '.*\s(?=\S)'
Azure,
Вместо head -1 -> line
(-3 знака) :)
Не уловил :(
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
adawdp,
Да, в браузере глючит, пробую исправить, или на три придется делить.

Пользователь добавил сообщение 01 Июня 2016, 11:55:07:
Вот:
Код: (bash) [Выделить]
#!/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
продолжают выводить этот текст.
« Последнее редактирование: 01 Июня 2016, 11:56:34 от Cxms »

adawdp

  • Автор темы
  • Гость
2016 Jun 01; 07:25 AM; Oakville, ON, Canada.

Cxms, попробовал Ваш скрипт, (вместо своего на ту же клавишу поставил) что-то не заработал у меня никак и нигде, почему не разбирался пока. Т.е. автоматический перенос не дал результата :(

Цитировать
Добавил параметры, задержки.
В браузере уже нормально работает, но одна проблема осталась: не обновляется содержимое буфера выделеного текста после снятия выделения с текста.
Т.е после выделения какого-то текста, снятия выделения, xsel -o и xclip -o -selection clipboard
продолжают выводить этот текст.

— Такое может быть в том числе и тогда, когда стоит программа типа Diodon'a или другая, которая кеширует буфер обмена.

— С работы попробую ещё…


Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
adawdp,
1. Скрипт должен вызыватся с параметром (см. в коментариях).
2. Должны быть устанолены пакеты xvkbd и xsel.
3. Сделать скрипт исполняемым.

Для теста можно запустить скрипт из терминала с задержкой:
sleep 5; bash "/path/to/script.sh" -last_wordчтобы успеть переключится в другое окно с введенной строкой текста.


Пользователь добавил сообщение 01 Июня 2016, 15:58:41:
Цитировать
— Такое может быть в том числе и тогда, когда стоит программа типа Diodon'a или другая, которая кеширует буфер обмена.
Подобных программ не ставил, тут что-то другое.
Можете проверить:
Откройте терминал и браузер, в терминал вставьте команду:
xsel -oВ браузере наберите какой нибудь текст, выделите, снимите выделение,
потом в терминале нажмите ентер и посмотрите содержимое буфера выделеного (которого не должно быть).
« Последнее редактирование: 01 Июня 2016, 16:00:07 от Cxms »

adawdp

  • Автор темы
  • Гость
2016 Jun 01; 01:40 PM

— Спасибо Cxms,  я как-то не досмотрел про параметры запуска… я создал кнопку запуска, поместил в launcher и так тренируюсь :)!
(Нажмите, чтобы показать/скрыть)
— В целом вроде бы всё работает с разными параметрами, но я недостаточно ещё потренировался.
— Не совсем понял о чём должен свидетельствовать тест c xsel -o у меня всегда выводит   содержимое выделенного при исполнении команды xsel -o
— Если всё равно скрипт нужно запускать с разными параметрами, там может есть смысл поделить его на части? Я не программист совсем, потому советовать сильно не могу. Но ведь ценность скрипта именно в использовании с hotkey'ями. Ну и более трёх сочетаний клавиш для этой всей затеи с заменой раскладки это по-моему будет перебором…
— После работы потестирую ещё…

 

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