Скрипт для переключения setxkbmap

8

Я хотел бы сценарий bash, который переключается между: setxkbmap seи setxkbmap us.

Затем я собираюсь сопоставить этот скрипт с CtrlEscпомощью клавиатуры> настраиваемых сочетаний клавиш.

Дело в том, что я хочу переключить раскладку клавиатуры с помощью CtrlEscape. Как я могу это реализовать?

Фредрик
источник
1
Какой DE вы используете?
Дейзи
3
XKB может настроить ключ для переключения между макетами. Это не то, что вы хотели бы написать, но, вероятно, есть заранее подготовленная конфигурация для этого где-то, где вам нужно только выбрать, какую пару раскладок и какую комбинацию клавиш вы предпочитаете.
Жиль "ТАК - перестань быть злым"

Ответы:

3

Я не знаю, в какой среде рабочего стола вы работаете, как вы можете назначить комбинацию клавиш, может отличаться, но этот скрипт работает глобально, по крайней мере, для моих Ubuntu 12.04 boxи Arch Linux:

#!/bin/bash

(setxkbmap -query | grep -q "layout:\s\+us") && setxkbmap se || setxkbmap us
маргаритка
источник
К сожалению, это не работает, если вы измените макет с помощью графического метода. По крайней мере, это не на моей коробке xfce. Это работает, только если вы используете setxkbmap для переключения раскладок. Единственный способ, который я обнаружил, что всегда, последовательно работает - это разбор, xmodmapкак в моем ответе ниже.
Terdon
@terdon это работает по крайней мере на моем Ubuntu 12.04 box, вы пробовали это в вашей системе?
маргаритка
Да, поверьте мне, я потратил много времени на решение этой проблемы. Я регулярно переключаюсь между 3 раскладками клавиатуры (us, fr, es) и между двумя физическими клавиатурами, одна с американской раскладкой и одна с испанской. Если я использую апплет на панели tint2 для изменения раскладки клавиатуры, то в выводе команды нет никакой разницы setxkbmap. То же самое происходит, если я переключаю макеты, используя ярлык, настроенный через keyboard shortcutsграфический интерфейс на моем LMDE. setxkbmapменяется только когда я переключаюсь с его помощью.
Тердон
Действительно аккуратный с одним решением линии. Спасибо.
Фредрик
В итоге я сохранил строку в файл .sh в моей домашней директории. Затем сопоставил ./toggleLayout.sh ctrl-esc
Фредрик
4

Есть разные ответы на похожие вопросы . Тем не менее, ни один из них не работает надежно для меня.

Следующий скрипт должен работать во всех случаях. Это, безусловно, работает в моей системе Debian при переключении раскладок с помощью setxkbmap:

#!/bin/bash
seven=`xmodmap -pke | grep "keycode  16" | awk '{print \$5}'` 
## If this is the "us" layout
if [ $seven == "ampersand" ]; then
    setxkbmap se
else
  setxkbmap us
fi

Сценарий анализирует выходные данные xmodmap, чтобы определить, является ли текущий макет «us» или «se». В макете «нас» SHIFT+ 7отображается на «амперсанд». Если вы будете переключаться между макетами «us» и «se», то включение «ampersand» 7означает, что вы используете макет «us», и сценарий изменится на «se». Если у вас нет «амперсанда» 7, сценарий переключается на «нас».

Тердон
источник
4

лучшим способом было бы не использовать скрипт, а загрузить двухслойную клавиатуру (например :) setxmodmap "us,se"и переопределить Ctrl- Escдля отправки ISO_Next_Group

Посмотрите на этот ответ на xkb, чтобы узнать, как переопределить некоторые ключи без необходимости редактировать основные файлы по умолчанию (таким образом, не нужно быть пользователем root). В файле локальных символов (например:) ~/.xkb/symbols/mysymbolsпоместите небольшой раздел как:

partial modifier_keys 
xkb_symbols "ctrl_esc_toggle" {
    key <ESC> {
        type[Group1]="PC_CONTROL_LEVEL2",
        symbols[Group1]= [ Escape,     ISO_Next_Group ]
    };
};

PC_CONTROL_LEVEL2 сообщает, что второй символ для этого ключа получен с помощью Control (вместо Shift).

и в локальном файле раскладки (например:; ~/.xkb/keymap/mykbdвы можете создать его с помощью setxkbmap "us,se" ; setxkbmap -print > ~/.xkb/keymap/mykbd) измените строку xkb_symbols, добавив «mysymbols (ctr_esc_toggle)», так что вы получите что-то вроде:

xkb_symbols   { include "pc+us+se:2+inet(evdev)+terminate(ctrl_alt_bksp)+compose(rwin)+mysymbols(ctr_esc_toggle)"   };

(обратите внимание на «se: 2», «: 2» ​​говорит загружать определения символов «se» как Group2; вы можете составлять различные группы).

теперь вы можете загрузить его с помощью: xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY тогда Ctrl-Esc будет переключаться между макетами «us» и «se».

Обратите внимание, что вам нужно нажать Ctrl (и удерживать) перед Esc; с другой стороны, это не работает (это потребует определения виртуального модификатора для Escape, и я не знаю, как это сделать)

Пабло Саратчага
источник
1
Как бы leftwin+leftalt+spaceвыглядело?
Хотчке
@Hotschke, спасибо{ include "pc+us+ru:2+inet(evdev)+group(win_space_toggle)" };
contributorpw