如何在XMonad中重新配置1..9工作区键盘快捷键?

时间:2013-10-15 14:01:26

标签: haskell xmonad

我一直是XMonad的长期用户,直到我切换到符合人体工程学的键盘布局,即Bépo(http://bepo.fr/wiki/Accueil)。

直到那时我才使用XMonad.Config.Azerty模块作为我的键盘。但是由于布局改变,键盘shorcuts被打破了 更准确地说是工作空间切换的工作空间(home + 1 = workspace1,home + 2 = workspace2等...) 然后我切换回默认配置但不是更好。

我显然不再需要defaultAzerty功能了 有人知道我应该做些什么来重新映射home + 1..9 combinaison以便它们起作用。

编辑:更新配置

这是我的配置:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE Arrows #-}

import XMonad
import Graphics.X11.ExtraTypes.XF86
import qualified Data.Map as M
import qualified XMonad.StackSet as W
import XMonad.Hooks.DynamicLog
--
import XMonad.Layout.NoBorders
--
import Data.Ratio
import XMonad.Layout.PerWorkspace
import XMonad.Layout.Spacing
import XMonad.Layout.Grid
import XMonad.Layout.IM

main :: IO ()
main = xmonad =<< xmobar myConf

-- |Main configuration, override the defaults to your liking.
myConf = defaultConfig
   { modMask = mod4Mask
   , terminal = "urxvt"
   , layoutHook = smartBorders $ myLayout
   , workspaces = myWorkspaces
   , keys = myKeys }

-- | Keyboard keys
homeMask :: KeyMask
homeMask =  133 -- from the xev data

keysToAdd x =
    [ ((mod4Mask, xK_F4 ), kill)
    , ((0, xF86XK_Calculator ), spawn "mate-calculator")
    , ((0, xF86XK_WWW ), spawn "firefox")
    , ((0, xF86XK_HomePage ), spawn "caja")
    , ((0, xK_Print ), spawn "mate-screenshot")
    , ((mod4Mask, xK_z ), spawn "emacs") ]
    ++
    [((m .|. homeMask, k), windows $ f i) 
       | (i, k) <- zip (XMonad.workspaces defaultConfig) [10 .. 19]
       , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)] ]

keysToDel x = [((mod4Mask .|. shiftMask), xK_c)] -- to delete the unused keys

myKeys x = foldr M.delete (keysToAdd' x) (keysToDel x)
  where
    -- to include new keys to existing keys
    keysToAdd' x = M.union (keys defaultConfig x) (M.fromList (keysToAdd x))

-- |Workspaces listing
myWorkspaces = ["1:main", "2:edit", "3:web", "4:browse", "5:irc", "6:pidgin"]

-- |Default layout
myLayout = pidgin $ Mirror tiled ||| tiled ||| Full
    where
        -- pidgin conf
        pidgin = onWorkspace "6:pidgin" pidginLayout
        pidginLayout = withIM (18/100) (Role "buddy_list") gridLayout
        gridLayout = spacing 8 $ Grid

        -- default tiling algorithm partitions the screen into two panes
        tiled = spacing 2 $ Tall nmaster delta ratio
        -- The default number of windows in the master pane
        nmaster = 1
        -- Default proportion of screen occupied by master pane
        ratio = 2/3
        -- Percent of screen to increment by when resizing panes
        delta = 5/100

我也看到那篇文章,但我不知道这是不是我想要的:Switching workspaces in xmonad using programmer dvorak keyboard layout (shifted numbers)

我对haskell语言没有问题,但XMonad API很大。

EDIT2:按照这里写的http://blacketernal.wordpress.com/set-up-key-mappings-with-xmodmap/,我的主页键已经是修饰符

这是最后一行的转储:

  

xmodmap:每个修饰符最多4个键,(括号中的键码):

     

移位Shift_L(0x32),Shift_R(0x3e)锁定Caps_Lock   (0x42)控制Control_L(0x25),Control_R(0x69)mod1
  Alt_L(0x40),Meta_L(0xcd)mod2 Num_Lock(0x4d)mod3
  mod4 Super_L(0x85),Super_R(0x86),Super_L(0xce),Hyper_L   (0xcf)mod5 ISO_Level3_Shift(0x5c),Mode_switch(0xcb)

1 个答案:

答案 0 :(得分:1)

我使用的基本方法是启动xev,键入要执行某项操作的组合键,并注意键盘显示的内容。如果我理解正确,你想输入Home + 1来带你到工作区1.当我尝试这个时,我得到以下内容,但你的结果可能不同

KeyRelease event, serial 33, synthetic NO, window 0x2600001,
    root 0x1dc, subw 0x0, time 255407786, (1090,771), root:(1093,774),
    state 0x0, keycode 10 (keysym 0x31, 1), same_screen YES,
    XLookupString gives 1 bytes: (31) "1"
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x2600001,
    root 0x1dc, subw 0x0, time 255407938, (1090,771), root:(1093,774),
    state 0x0, keycode 110 (keysym 0xff50, Home), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

接下来,将适当的挂钩添加到xmonad。看看你引用的帖子,也许这样的东西会起作用吗?

homeMask              :: KeyMask
homeMask              =  110 -- from the xev data

[((m .|. homeMask, k), windows $ f i)
    | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
    , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]

编辑:在你进行太多调试之前,或许更简单的测试是为了确保我们正确地捕获了Home键。将以下内容添加到您的配置中:

homeMask              :: KeyMask
homeMask              =  110 -- from the xev data

并将其放入配置中的keysToAdd

, ((homeMask, xK_z                    ), spawn "emacs")

现在重启XMonad并查看Home + z是否启动了emacs。