У меня 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:
А вот еще может еще поясните, почему
CurrentLayoutIsRu () { setxkbmap -query | grep -P "layout:\s+ru," > /dev/null; } # 0, если grep что-нибудь нашел
перестает работать, если ";" убрать?
Ну и уж сознаюсь: я баш, как и любой другой шелл, вижу впервые в жизни. Ну т.е. вот как месяц назад поставил себе Xenial Xerus вместо оффтопика, так потихоньку и осваиваюсь.