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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

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

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
1. Цирк получать лист параметров с значениями и парсить его, вместо того чтобы напрямую получить значение параметра.
2.gsettings get org.gnome.desktop.wm.keybindings switch-input-source | tr ">[]'< " "+\0"3.
4. Я же написал — для внешних переключалок нужна внешняя прога типа xkblayout-state Хотя у кого много языков — стоит проверить xset -q | grep -Eo '[0-9]{8}$'
« Последнее редактирование: 28 Мая 2016, 22:04:42 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн martin_wanderer

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
У меня Lubuntu, и
setxkbmap -queryвыводит одно и тоже на рус. и англ. раскладках.
-1. Если у вас в Lubuntu setxkbquery всегда возвращает одно и то же, ок - вам надо из какого-то другого источника брать текущую раскладку. Если знаете единый способ, надежно работающий хотя бы во всех деривативах убунты - буду благодарен.

Цитировать
короче:
gsettings list-recursively org.gnome.desktop.wm.keybindings \
| sed -rn 's/>/+/; s/.*switch-input-source \[\x27<(.*)\x27\].*/\1/p'
и сочетание для смены выводит не верное (Super+space, а реальное - Alt+Shift)
0. Короче - не значит лучше. Мой вариант сознательно написан как более читабельный. И у меня он выводит правильное значение. У вас, же он, видимо, вернул не прямое, а обратное переключение почему-то.

Cxms,
1.
Цитировать
Перед обявлением функции не нужно писать "function "
- что значит "не нужно"? Вы хотели сказать: "не обязательно"? В тот момент мне казалось, что так читабельнее, но пожалуй вы правы
2.
Цитировать
Лишние ";". Точка с запятой ставится только МЕЖДУ командами или зарезервированными словами записаными в одной строке, или после последней команды в функции, если закрывающая скобка функции находится в этой же строке.
- Привычка. Некомфортно без ";" в конце выражения.
3.
Цитировать
При объеденении содержимого из нескольких значений переменных двойные скобки нужны только в начале и в конце.
newvar="$var1$var2$var3"
- согласен, избыточно. Хотя и тут мне казалось, что так читабельнее.
4.
Цитировать
printf '%s' "$fixed""$converted"можно вывести и эхом:
echo "$fixed$converted"
- ошибаетесь. Можно вывести с ключом -n, а чистое echo добавит лишний перенос строки.
5.
Цитировать
[ $(SrcContainsRuChars)$? == $(CurrentLayoutIsRu)$? ] &&
    xdotool key --clearmodifiers $(LayoutShortcut);
заменить на:
SrcContainsRuChars && CurrentLayoutIsRu \
&& xdotool key --clearmodifiers $(LayoutShortcut)
Ошибаетесь: ваш код работает только когда оба кода возврата равны нулю, а мой и тогда, когда оба кода возвраты равны единице. Т.е. в вашем варианте переключение будет работать только после конвертации в английский.

Цитировать
# если раскладка текста равна текущей раскладке - переключить ееА когда раскладка клав. может быть не равна раскладке текста?
Ввел текст не в той раскладке, потом зачем-то перключил раскладку (случайно?),
и нажал сочетание для вызова скрипта конвертации?

Имхо: нужно в конце просто менять раскладку,
и не вычеслять сочетание, а указать его в переменной.
Да, бывает что я сразу машинально переключаю раскладку. А бывает вообще добиваю все предложение, и только потом возвращаюсь к опечатке: при скорости хотя бы в 200 ударов в минуту неохота сбиваться с ритма.
Насчет захардкодить - так и было сначала, но я по своей наивности подумал, что если вдруг мой скрипт кому пригодится, у него может оказаться другое сочетание смены раскладки. Насчет переменной не понял: если хардкодить, то и переменная не нужна, а если все-таки брать из настроек, то не важно, через переменную или функцией - все равно вычисляется ровно один раз при каждом вызове скрипта.

gsettings list-recursively org.gnome.desktop.wm.keybindings \
| sed(grep)
Что за цирк?gsettings get org.gnome.desktop.wm.keybindings switch-input-source | grep -om1 "[^][' .,]\+"Почему это функция? Значение нужно 1 раз, следовательно стоит присвоить переменной, а не получать его каждый раз.
По поводу текущей раскладки стоит смотреть параметр gsettings get org.gnome.desktop.input-sources currentв перечне раскладок gsettings get org.gnome.desktop.input-sources sources— но они могут быть пустые, если переключение идет через setxkbmap
Подробнее…
О! Спасибо насчет gsettings get - это я реально велосипед изобрел. Зато увлекательно. И насчет текущей раскладки тоже благодарствую. А вот насчет функции уже написал: вызов ровно один ( а хоть бы и два ) - это какая-то копеечная оптимизация. Мне вариант с функцией показался "чище".


Пользователь добавил сообщение 29 Мая 2016, 02:30:32:
А вот еще может еще поясните,  почему
Код: (Bash) [Выделить]
CurrentLayoutIsRu () { setxkbmap -query | grep -P "layout:\s+ru," > /dev/null; } # 0, если grep что-нибудь нашел
перестает работать, если ";" убрать?
Ну и уж сознаюсь: я баш, как и любой другой шелл, вижу впервые в жизни. Ну т.е. вот как месяц назад поставил себе Xenial Xerus вместо оффтопика, так потихоньку и осваиваюсь.
« Последнее редактирование: 29 Мая 2016, 02:30:32 от martin_wanderer »

Оффлайн martin_wanderer

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

Пользователь добавил сообщение 29 Мая 2016, 02:52:30:
Цитировать
или после последней команды в функции
- мда, невнимателен. Пойду лечить невнимательность сном.

Оффлайн Cxms

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

Оффлайн martin_wanderer

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Cxms, с буфером кривизна какая-то: через раз то сконвертированный текст подставляется, то ранее скопированное в буфер.

Пользователь добавил сообщение 29 Мая 2016, 11:24:44:
И, кстати, почему apt-get а не apt?

Пользователь добавил сообщение 29 Мая 2016, 11:43:46:
Код: (Bash) [Выделить]
RUS='ёЁ"№;%:?\x2Fйцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,'
ENG='`~@#$%^&|qwertyuiop[]asdfghjkl;\x27zxcvbnm,.\x2FQWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?'
Здесь забыт бэкслэш и вообще модифицировать неудобно. Все-таки не зря я делил на части.
« Последнее редактирование: 29 Мая 2016, 11:43:46 от martin_wanderer »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
у кого много языков — стоит проверить xset -q | grep -Eo '[0-9]{8}$'
Кто-то проверит?
А вот насчет функции уже написал: вызов ровно один ( а хоть бы и два ) - это какая-то копеечная оптимизация. Мне вариант с функцией показался "чище".
Если вызов только 1 тем более зачем связываться с функцией?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн martin_wanderer

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
xset -q | grep -Eo '[0-9]{8}$'Кто-то проверит?
Если я правильно понял, это поле "LED mask:". Но я что-то не соображу, как из него выудить текущую раскладку.

Цитировать
Если вызов только 1 тем более зачем связываться с функцией?
В общем случае я предпочитаю функции переменным, т.к. понять состояние переменной бывает весьма нетривиальной задачей. В какой-нибудь процедуре на 3000 строк кода со 153 присовениями этой переменной. ( *НЕНАВИСТЬ* ). А что возвращает чистая функция легко понять по ее коду или банально проверить.

Ну а в данном случае это все вообще не актуально:  трехстрочный "цирк" здесь плохо смотрелся, а через gsettings get норм.
Код: (Bash) [Выделить]
xdotool key --clearmodifiers $(gsettings get org.gnome.desktop.wm.keybindings switch-input-source | sed "s/[^[:alnum:]_>]//g; s/>/+/g")

Пользователь добавил сообщение 29 Мая 2016, 15:38:45:
gsettings get org.gnome.desktop.wm.keybindings switch-input-source | grep -om1 "[^][' .,]\+"
А зачем здесь точка, запятая и пробел отбрасываются? Разве они там могут вообще встретиться?
« Последнее редактирование: 29 Мая 2016, 15:38:45 от martin_wanderer »

Оффлайн Cxms

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

Цитировать
Cxms, с буфером кривизна какая-то: через раз то сконвертированный текст подставляется, то ранее скопированное в буфер.
Да, есть такое, исправил, но теперь если содержимое выделеного будет равно содержимому буфера, то скрипт работать не будет.
У меня такое только один раз было, чтобы это отключить можно закоментить строку 31.

Цитировать
почему apt-get а не apt?
разницы нет, можно и apt

Цитировать
Здесь забыт бэкслэш и вообще модифицировать неудобно. Все-таки не зря я делил на части.
Бэкслэш не забыт, как и цифры и еще нексколько символов которые теми же кнопками (с учетом шифта) набираются на обоих раскладках.
И зачем модифицировать? убрать спец. символы?
« Последнее редактирование: 31 Мая 2016, 17:41:43 от Cxms »

Оффлайн martin_wanderer

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
И зачем модифицировать? убрать спец. символы?
Чтобы работало с раскладкой ru+typewriter, а не с обычной ru

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Чем отличается typewriter от обычной ru?

Оффлайн martin_wanderer

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Верхний ряд клавиатуры
без шифта
Код: (Bash) [Выделить]
en1='`1234567890-='    ru1='|№-\x2F":,._?%!;'
с шифтом
Код: (Bash) [Выделить]
EN1='~!@#$%^&*()_+'    RU1='+1234567890=\x5C'
А также расположением буквы ё и круглых скобок

Оффлайн Cxms

  • Активист
  • *
  • Сообщений: 407
    • Просмотр профиля
Если определить что раскладка ru - typewriter, подставить символы для typewriter.
Вот вариант для typewriter, проверен.
ENG='`1234567890-=\x5C~!@#$%^&*()_+|qwertyuiop[]asdfghjkl;\x27zxcvbnm,.\x2FQWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?'
RUS='|№-\x2F":,._?%!;+1234567890=\x5Cйцукенгшщзхъ)фывапролджэячсмитьбюёЙЦУКЕНГШЩЗХЪ(ФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ'

Пользователь добавил сообщение 29 Мая 2016, 19:42:00:
xdotool в отличае от xvkbd жмет сочетания только на русской раскладке.
но может это только у меня.
« Последнее редактирование: 29 Мая 2016, 19:42:00 от Cxms »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
то поле "LED mask:". Но я что-то не соображу, как из него выудить текущую раскладку.
Опытным путем. Число меняяется при смене раскладки.
В общем случае я предпочитаю функции переменным, т.к. понять состояние переменной бывает весьма нетривиальной задачей. В какой-нибудь процедуре на 3000 строк кода со 153 присовениями этой переменной.
Если происходит «153 присвоения» то такая переменная не нужна. Вы по-моему не совсем правильно понимаете область применения переменных.
"[^][' .,]\+" - А зачем здесь точка, запятая и пробел отбрасываются? Разве они там могут вообще встретиться?
А если несколько сочетаний для переключения раскладки?
sed "s/[^[:alnum:]_>]//g; s/>/+/g"
tr ">,[]'< " "+\n\0" | head -1не понравилась?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн martin_wanderer

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Вы по-моему не совсем правильно понимаете область применения переменных.
При всем уважении, это не "я не понимаю" - это так бывает в жизни: пишешь метод, в котором происходит что-нибудь безобидное (псевдокод):
firstname=getFirstName(user);
// делаем что-то с firstname
А потом этот же объект правит другой разработчик, и там уже
firstname=getFirstName(user);
// делаем что-то с firstname
firstname=getLastName(user);
// снова делаем что-то с firstname, которое по смыслу уже lastname

А теперь представьте, что такое случалось не раз и не два в процедуре на пару-тройку тысяч строк кода, написанной позапрошлым "поколением" разработчиков эдак лет десять назад. Впрочем, изучение коммитов svn быстро показало, что приход другого разработчика не обязателен - люди не парятся, и используют одну переменную tmp на все случаи жизни.
При однократном использовании невелика разница между "потратить чуть-чуть памяти данных" или "потратить чуть-чуть памяти программ". А в случае интерпретируемого языка - совсем не вижу разницы. Но может быть я просто чего-то не понимаю.

Цитировать
А если несколько сочетаний для переключения раскладки?
Не подумал об этом: через интерфейс Убунты непохоже, чтобы можно было задать больше одного сочетания.

Цитировать
tr ">,[]'< " "+\n\0" | head -1не понравилась?
Я как-то проглядел этот момент - ухватился за gsettings get, а что вы еще и парсите его по другому не обратил внимания. Классное решение! А я как раз думал в сторону tr, но до конца мысль не довел, только упростил регулярку до заведомо общепонятной
gsettings get org.gnome.desktop.wm.keybindings switch-input-source | grep -Po '\w+' | tr '\n' '+' | sed 's/+$//'

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
martin_wanderer, То что Вы рассказываете встречается (и довольно часто к сожалению) но тут вопрос больше в создании правилльной архитектуры программы, а не названии переменной. Лично для себя я решаю вопрос так: если есть необходимость
  • использовать несколько раз одни данные — переменная
  • в повторении одинаковых действий — функция
Если нет повторений — не нужно ни то, ни другое.
2. Конечно вычислительные можности позволяют создавать ковейеры с любым количеством программ, но все же стоит постараться решить задачу минимумом. Использовать grep + sed IMHO «индусский код» — или grep (если надо только выбрать элементы), или sed (выбор с модификацией). А если с вычислениями то awk. Или строить конвейеры из самых простейших команд tr, cut, paste, join, printf, echo
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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