My kbdswtch
Да, автоматическое переключение раскладок - немного зло… Привыкаешь, а потом на другой машине не можешь нормально работать.
Но, иногда бывает, не сразу замечаешь, что печатаешь не на нужной раскладке. Напрягает, что надо поменять раскладку и все перепечатать…
Простое решение: выделить неправильно набранный текст и нажать кнопочку, например, Pause и текст “перевернется” в альтернативную раскладку.
#!/bin/bash
# сохраняем выделение в файл
xclip -o -selection primary > /tmp/~sel.tmp
# сохраняем буфер обмена в файл
xclip -o -selection clipboard > /tmp/~clip.tmp
# чтобы не напечатать содержимое буфера обмена, если ничего не выделено, мы его очистим
xclip -i -selection clipboard
# очищаем выделение
xdotool key Delete
# записываем обработанный выделенный текст в буфер обмена
# - ru:
# cat /tmp/~sel.tmp | sed "y/\`~\!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?ёЁ\!\"№;%:?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ\/ЯЧСМИТЬБЮ,/ёЁ\!\"№;%:?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ\/ЯЧСМИТЬБЮ,\`~\!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?/" | xclip -selection clipboard
# - ua: (тут - стандартно)
# cat /tmp/~sel.tmp | sed "y/\`~\!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?ёЁ\!\"№;%:?йцукенгшщзхїфівапролджєячсмитьбю.ЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄ\/ЯЧСМИТЬБЮ,/ёЁ\!\"№;%:?йцукенгшщзхїфівапролджєячсмитьбю.ЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄ\/ЯЧСМИТЬБЮ,\`~\!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?/" | xclip -selection clipboard
# - ua: (a тут - ще англійський ` міняю на ’ - наклонний апостроф, який не одинарна кавичка!)
cat /tmp/~sel.tmp | sed "y/\`~\!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?ёЁ\!\"№;%:?йцукенгшщзхїфівапролджєячсмитьбю.ЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄ\/ЯЧСМИТЬБЮ,/’Ё\!\"№;%:?йцукенгшщзхїфівапролджєячсмитьбю.ЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄ\/ЯЧСМИТЬБЮ,\`~\!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,.\/QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?/" | xclip -selection clipboard
# при проблемах установить задержку по вкусу:
sleep 0.1
# вставляем содержимое буфера обмена
xdotool key Shift+Insert
# восстанавливаем буфер обмена из файла
cat /tmp/~clip.tmp | xclip -in -selection clipboard
# удаляем временные файлы
rm /tmp/~clip.tmp /tmp/~sel.tmp
# опционально меняем раскладку !!! не работает у меня !!!
# xdotool key Shift_L+Capslock
# это "setxkbmap 'ua'" - переключает раскладку, но "вешает" индикатор
#LANG1="us"
#LANG2="ua"
#CURRENT_LANG=$(setxkbmap -query | tail -n 1 | cut -f6 -d ' ')
#if [ "$CURRENT_LANG" = $LANG1 ]; then
# setxkbmap $LANG2
#else
# setxkbmap $LANG1
#fi
# этот вариант тоже не прокатил
#xdotool keydown Shift+Shift
#sleep 1
#xdotool keyup Shift+Shift
# shift иногда может залипать, это решает проблему
# xdotool key Shift
# notify-send "Change Layout" -t 2000
Нужно сохранить этот скрипт, дать права на выполнениее, в настройках клавиатуры добавить его, например, на клавишу Pause
i Должна быть установлена маленькая утилитка xdotool
sudo apt install xdotool
! Бывает, не работает в некоторых окошках
Было бы неплохо и сразу поменять раскладку индикатора, но не получается пока…
# опционально меняем раскладку !!! не работает у меня !!!
# xdotool key Shift_L+Capslock
# это "setxkbmap 'ua'" - переключает раскладку, но "вешает" индикатор
# LANG1="us"
# LANG2="ua"
# CURRENT_LANG=$(setxkbmap -query | tail -n 1 | cut -f6 -d ' ')
# if [ "$CURRENT_LANG" = $LANG1 ]; then
# setxkbmap $LANG2
# else
# setxkbmap $LANG1
# fi
#LANG="us"
#CURRENT_LANG=$(setxkbmap -query | tail -n 1 | cut -f6 -d ' ')
#if [ "$CURRENT_LANG" = $LANG ]; then
# #xdotool key Shift_L+Capslock
# xdotool keydown Shift_L+Capslock
# sleep 1
# xdotool keyup Shift_L+Capslock
#else
# xdotool keydown Capslock
# sleep 1
# xdotool keyup Capslock
#fi
# этот вариант тоже не прокатил
#xdotool keydown Shift+Shift
#sleep 1
#xdotool keyup Shift+Shift
# shift иногда может залипать, это решает проблему
# xdotool key Shift
# notify-send "Change Layout" -t 2000