XMonad: как привязать Super (клавиша Win) + пробел к переключателю раскладки клавиатуры?

Раньше я переключал раскладку клавиатуры, нажимая ❖ win+пробел в Windows 8 и +пробел в OS X. .

Однако в Linux у меня есть ключ ❖ win, выделенный для XMonad в качестве ключа-модификатора. Итак, для переключения между раскладками я должен использовать alt+⇧ shift.

Это не было проблемой, пока я не установил Emacs. Теперь я могу использовать все комбинации клавиш meta+shift, потому что у меня есть alt как meta (⎋ escape может помочь, но это очень неудобно).

Я думаю, что самый простой обходной путь для этого случая — настроить комбинацию ❖ win+space для переключения макета. Хотя XMonad по умолчанию использует эту комбинацию для переключения раскладок, я редко переключаю раскладки в обоих направлениях, поэтому я буду счастлив иметь ❖ win+пробел для переключения раскладки клавиатуры и < kbd>❖ win+shift+пробел для переключения раскладки XMonad. Если бы я мог сделать такую ​​конфигурацию, я бы смог использовать ключ alt как meta в Emacs.

Однако я не знаю, как заставить XMonad использовать ❖ win+space в качестве комбинации клавишных переключателей, точнее, я не знаю, возможно ли это вообще.


person Geradlus_RU    schedule 07.02.2015    source источник
comment
Небольшое замечание: -- bla для однострочных комментариев, {- bla -} для многострочных комментариев.   -  person deshtop    schedule 08.02.2015
comment
(: конечно, лично я редко пользуюсь многострочными комментариями, а вот я пытался заставить SO-фронтенд отображать комментарий как комментарий (ожидал светло-серого цвета), но это очень упрямо. -- blah отображается черным цветом, это вызывает двусмысленность, вы видите это (++ ++ -- ++)? исправлено сейчас (;   -  person Geradlus_RU    schedule 08.02.2015
comment
@deshtop, кстати, спасибо и mhwombat   -  person Geradlus_RU    schedule 08.02.2015
comment
По моему мнению, вы должны вырезать и вставить свое решение из вопроса в ответ.   -  person dfeuer    schedule 13.02.2015
comment
@dfeuer, я никогда не видел, чтобы я мог редактировать ответ! Хорошая идея. Кстати, в этом решении есть одна оговорка: обе последовательности клавиш rWin и Win+Space вызывают изменение раскладки. Если вы (случайно) нажали rWin, макет изменится; затем, если вы нажмете Win+Space и макет снова изменится, но привязки XMonad (я использую клавишу Win в качестве модификатора XMonad) не работают, вам нужно снова нажать rWin, чтобы иметь возможность использовать ключи XMonad. Я все еще пытаюсь выяснить, как лучше всего изменить макет. Возможно, плагин Xkb должен стать решением.   -  person Geradlus_RU    schedule 14.02.2015
comment
Также я пытаюсь найти почти идентичную конфигурацию для своих клавиш на macbook и linux машине, поэтому я полагаю изменить мод XMonad — ключ на левый Ctrl. В идеале я хочу знать, как вызвать изменение раскладки клавиатуры (метода ввода) только с помощью указанной комбинации клавиш (например, Win + Space). Кажется, для XkbOption такой опции нет, в этом случае я предпочитаю вообще не иметь привязки клавиш на стороне Xkb (например, настроить привязку клавиш только в конфигурации XMonad).   -  person Geradlus_RU    schedule 14.02.2015


Ответы (2)


Все, что вам нужно сделать, это отменить привязку Win-Space (используя removeKeys) и создать привязки для переключения раскладки xmonad и переключения раскладки клавиатуры (используя additionalKeys или additionalKeysP). Подробности и примеры в документации. Команду переключения раскладки клавиатуры можно запустить с помощью spawn из основной библиотеки.

person deshtop    schedule 07.02.2015
comment
@destop, я знаю о функциях, которые вы упомянули выше, и я действительно пришел к предложенному вами решению, хотя и не смог его реализовать. Мне не хватает команды для создания, т.е. я не знаю точной команды для переключения макета в Linux. Я пытался создать setkbdmap, но это не то, что мне нужно. Можете ли вы указать мне такую ​​​​команду? - person Geradlus_RU; 08.02.2015
comment
Я думаю, что вам нужна команда setxkbmap. Просмотрите справочные страницы и поэкспериментируйте с командной строкой, чтобы точно определить нужную команду, а затем добавьте команду spawn в файл xmonad.hs. - person mhwombat; 08.02.2015
comment
Я добавил свое решение в тело вопроса, хотя оно работает так, как ожидалось. Я обнаружил, что наличие единственного права Win в качестве переключателя макета является неплохой альтернативой любой комбинации Win+Space. Ваше здоровье! - person Geradlus_RU; 08.02.2015

Я смог сделать это с помощью сценария оболочки (zsh), сохраненного на моем пути как cycle-keyboard-layout:

#!/usr/bin/env zsh

total_layouts="${#@}"
current_layout=$(setxkbmap -query | awk '/layout:/{ print $2 }')
current_index="${@[(i)$current_layout]}"
next_index="$((current_index % total_layouts + 1))"
next_layout="${@[$next_index]}"

setxkbmap "$next_layout"

Затем в файле xmonad.hs я включаю:

import XMonad.Util.CustomKeys (customKeys)

altMask = mod1Mask

main =
  xmonad $ defaultConfig
    { keys = customKeys delkeys inskeys
    , modMask = mod4Mask
    }

inskeys :: XConfig l -> [((KeyMask, KeySym), X ())]
inskeys conf@XConfig {modMask = modMask} =
  [ -- modMask + alt + space
  , ((modMask .|. altMask, xK_space),
        spawn "cycle-keyboard-layout dvorak us")
  ]

delkeys :: XConfig l -> [(KeyMask, KeySym)]
delkeys XConfig {} = []

А теперь +alt+пробел (я использую +пробел для других вещи) переключает мою раскладку между dvorak и us qwerty. Чтобы использовать другие макеты, просто замените dvorak us списком макетов, разделенным пробелами, который можно установить с помощью setxkbmap layout.

Мои полные скелеты xmonad.hs находятся по адресу https://github.com/schlueter/xmonad-config/blob/master/xmonad.hs.

person bschlueter    schedule 25.12.2017