Difference between revisions of "Xmonad/Config archive/Template xmonad.hs (darcs)"
m (Xmonad/Config archive/Template xmonad.hs (0.8) moved to Xmonad/Config archive/Template xmonad.hs (darcs)) |
(correct field name) |
||
(18 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
+ | If you want a good configuration to start from, it's quite simple. |
||
− | <haskell> |
||
− | -- |
||
− | -- xmonad example config file for xmonad-0.8 |
||
− | -- |
||
− | -- A template showing all available configuration hooks, |
||
− | -- and how to override the defaults in your own xmonad.hs conf file. |
||
− | -- |
||
− | -- Normally, you'd only override those defaults you care about. |
||
− | -- |
||
− | </haskell> |
||
− | <haskell> |
||
− | {-# OPTIONS -fno-warn-missing-signatures #-} |
||
− | ----------------------------------------------------------------------------- |
||
− | -- | |
||
− | -- Module : XMonad.Config |
||
− | -- Copyright : (c) Spencer Janssen 2007 |
||
− | -- License : BSD3-style (see LICENSE) |
||
− | -- |
||
− | -- Maintainer : dons@galois.com |
||
− | -- Stability : stable |
||
− | -- Portability : portable |
||
− | -- |
||
− | -- This module specifies the default configuration values for xmonad. |
||
− | -- |
||
− | -- DO NOT MODIFY THIS FILE! It won't work. You may configure xmonad |
||
− | -- by providing your own @~\/.xmonad\/xmonad.hs@ that overrides |
||
− | -- specific fields in 'defaultConfig'. For a starting point, you can |
||
− | -- copy the @xmonad.hs@ found in the @man@ directory, or look at |
||
− | -- examples on the xmonad wiki. |
||
− | -- |
||
− | ------------------------------------------------------------------------ |
||
+ | A very basic configuration, which will work for things like simple terminals but not so well for many modern applications such as web browsers: |
||
− | module XMonad.Config (defaultConfig) where |
||
+ | <pre> |
||
− | -- |
||
+ | import XMonad |
||
− | -- Useful imports |
||
− | -- |
||
− | import XMonad.Core as XMonad hiding |
||
− | (workspaces,manageHook,numlockMask,keys,logHook,startupHook,borderWidth,mouseBindings |
||
− | ,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor,focusFollowsMouse) |
||
− | import qualified XMonad.Core as XMonad |
||
− | (workspaces,manageHook,numlockMask,keys,logHook,startupHook,borderWidth,mouseBindings |
||
− | ,layoutHook,modMask,terminal,normalBorderColor,focusedBorderColor,focusFollowsMouse) |
||
+ | main = xmonad defaultConfig |
||
− | import XMonad.Layout |
||
+ | </pre> |
||
− | import XMonad.Operations |
||
− | import XMonad.ManageHook |
||
− | import qualified XMonad.StackSet as W |
||
− | import Data.Bits ((.|.)) |
||
− | import qualified Data.Map as M |
||
− | import System.Exit |
||
− | import Graphics.X11.Xlib |
||
+ | A more modern and more easily customized, yet still minimal, configuration (requires xmonad-contrib). '''Use this config if you plan to run Chromium; recent versions do ''not'' work correctly if you do not have desktop support enabled!''' |
||
− | -- | The default number of workspaces (virtual screens) and their names. |
||
− | -- By default we use numeric strings, but any string may be used as a |
||
− | -- workspace name. The number of workspaces is determined by the length |
||
− | -- of this list. |
||
− | -- |
||
− | -- A tagging example: |
||
− | -- |
||
− | -- > workspaces = ["web", "irc", "code" ] ++ map show [4..9] |
||
− | -- |
||
− | workspaces :: [WorkspaceId] |
||
− | workspaces = map show [1 .. 9 :: Int] |
||
+ | <pre> |
||
− | -- | modMask lets you specify which modkey you want to use. The default |
||
+ | import XMonad |
||
− | -- is mod1Mask ("left alt"). You may also consider using mod3Mask |
||
+ | import XMonad.Config.Desktop |
||
− | -- ("right alt"), which does not conflict with emacs keybindings. The |
||
− | -- "windows key" is usually mod4Mask. |
||
− | -- |
||
− | defaultModMask :: KeyMask |
||
− | defaultModMask = mod1Mask |
||
+ | baseConfig = desktopConfig |
||
− | -- | The mask for the numlock key. Numlock status is "masked" from the |
||
− | -- current modifier status, so the keybindings will work with numlock on or |
||
− | -- off. You may need to change this on some systems. |
||
− | -- |
||
− | -- You can find the numlock modifier by running "xmodmap" and looking for a |
||
− | -- modifier with Num_Lock bound to it: |
||
− | -- |
||
− | -- > $ xmodmap | grep Num |
||
− | -- > mod2 Num_Lock (0x4d) |
||
− | -- |
||
− | -- Set numlockMask = 0 if you don't have a numlock key, or want to treat |
||
− | -- numlock status separately. |
||
− | -- |
||
− | numlockMask :: KeyMask |
||
− | numlockMask = mod2Mask |
||
+ | main = xmonad baseConfig |
||
− | -- | Width of the window border in pixels. |
||
+ | </pre> |
||
− | -- |
||
− | borderWidth :: Dimension |
||
− | borderWidth = 1 |
||
+ | In this one, if you want to add things to various hooks (anything that ends with <code>Hook</code>, except <code>layoutHook</code> which is handled specially), you should prepend <code>hookName baseConfig <+></code> to the new value. (You may also make it the first item in a <code>composeAll</code> for the <code>manageHook</code>, or use Haskell's <code>do</code> notation for most other hooks.) |
||
− | -- | Border colors for unfocused and focused windows, respectively. |
||
− | -- |
||
− | normalBorderColor, focusedBorderColor :: String |
||
− | normalBorderColor = "gray" -- "#dddddd" |
||
− | focusedBorderColor = "red" -- "#ff0000" don't use hex, not <24 bit safe |
||
+ | <pre> |
||
− | ------------------------------------------------------------------------ |
||
+ | import XMonad |
||
− | -- Window rules |
||
+ | import XMonad.Config.Desktop |
||
+ | import XMonad.Util.SpawnOnce |
||
+ | baseConfig = desktopConfig |
||
− | -- | Execute arbitrary actions and WindowSet manipulations when managing |
||
− | -- a new window. You can use this to, for example, always float a |
||
− | -- particular program, or have a client always appear on a particular |
||
− | -- workspace. |
||
− | -- |
||
− | -- To find the property name associated with a program, use |
||
− | -- xprop | grep WM_CLASS |
||
− | -- and click on the client you're interested in. |
||
− | -- |
||
− | manageHook :: ManageHook |
||
− | manageHook = composeAll |
||
− | [ className =? "MPlayer" --> doFloat |
||
− | , className =? "Gimp" --> doFloat ] |
||
+ | main = xmonad baseConfig { |
||
− | ------------------------------------------------------------------------ |
||
+ | focusedBorderColor = "#ff2037" -- not a hook |
||
− | -- Logging |
||
+ | ,startupHook = startupHook baseConfig <+> spawnOnce "urxvt" |
||
+ | } |
||
+ | </pre> |
||
+ | This ensures that you don't skip any hooks needed by the base configuration. If you want to do this with <code>layoutHook</code>, use <code>(|||)</code> instead: |
||
− | -- | Perform an arbitrary action on each internal state change or X event. |
||
− | -- Examples include: |
||
− | -- |
||
− | -- * do nothing |
||
− | -- |
||
− | -- * log the state to stdout |
||
− | -- |
||
− | -- See the 'DynamicLog' extension for examples. |
||
− | -- |
||
− | logHook :: X () |
||
− | logHook = return () |
||
+ | <pre> |
||
− | -- | Perform an arbitrary action at xmonad startup. |
||
+ | layoutHook = myTall ||| layoutHook baseConfig |
||
− | startupHook :: X () |
||
+ | </pre> |
||
− | startupHook = return () |
||
+ | The consistent use of <code>baseConfig</code> means you only need to change the definition of <code>baseConfig</code> in order to switch to a different base, e.g. <code>defaultConfig</code> for basic ICCCM compliance or <code>xfceConfig</code> to integrate with an existing XFCE session. |
||
− | ------------------------------------------------------------------------ |
||
− | -- Extensible layouts |
||
− | -- |
||
− | -- You can specify and transform your layouts by modifying these values. |
||
− | -- If you change layout bindings be sure to use 'mod-shift-space' after |
||
− | -- restarting (with 'mod-q') to reset your layout state to the new |
||
− | -- defaults, as xmonad preserves your old layout settings by default. |
||
− | -- |
||
+ | If you plan to use <code>XMonad.Util.EZConfig.additionalKeys</code>, or define your own hooks or commands, you may wish to put non-hooks in the definition of <code>baseConfig</code> so that you can refer to your <code>modMask</code> etc. later: |
||
− | -- | The available layouts. Note that each layout is separated by |||, which |
||
− | -- denotes layout choice. |
||
− | layout = tiled ||| Mirror tiled ||| Full |
||
− | where |
||
− | -- default tiling algorithm partitions the screen into two panes |
||
− | tiled = Tall nmaster delta ratio |
||
+ | <pre> |
||
− | -- The default number of windows in the master pane |
||
+ | import XMonad |
||
− | nmaster = 1 |
||
+ | import XMonad.Config.Desktop |
||
+ | import XMonad.Util.EZConfig |
||
+ | baseConfig = desktopConfig { |
||
− | -- Default proportion of screen occupied by master pane |
||
− | + | modMask = mod4Mask |
|
+ | , focusedBorderColor = "#ff2037" |
||
+ | } |
||
+ | main = xmonad $ baseConfig { |
||
− | -- Percent of screen to increment by when resizing panes |
||
+ | startupHook = startupHook baseConfig <+> myHook |
||
− | delta = 3/100 |
||
+ | } |
||
+ | `additionalKeys` |
||
+ | [((modMask baseConfig,xK_F1), spawn "firefox")) |
||
+ | ] |
||
+ | myHook = {- ... -} |
||
− | ------------------------------------------------------------------------ |
||
+ | </pre> |
||
− | -- Key bindings: |
||
+ | See [http://xmonad.org/xmonad-docs/xmonad-contrib/XMonad-Doc-Configuring.html XMonad.Doc.Configuring] for more information on customizing an xmonad configuration. |
||
− | -- | The preferred terminal program, which is used in a binding below and by |
||
− | -- certain contrib modules. |
||
− | terminal :: String |
||
− | terminal = "xterm" |
||
− | |||
− | -- | Whether focus follows the mouse pointer. |
||
− | focusFollowsMouse :: Bool |
||
− | focusFollowsMouse = True |
||
− | |||
− | -- | The xmonad key bindings. Add, modify or remove key bindings here. |
||
− | -- |
||
− | -- (The comment formatting character is used when generating the manpage) |
||
− | -- |
||
− | keys :: XConfig Layout -> M.Map (KeyMask, KeySym) (X ()) |
||
− | keys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ |
||
− | -- launching and killing programs |
||
− | [ ((modMask .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf) -- %! Launch terminal |
||
− | , ((modMask, xK_p ), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"") -- %! Launch dmenu |
||
− | , ((modMask .|. shiftMask, xK_p ), spawn "gmrun") -- %! Launch gmrun |
||
− | , ((modMask .|. shiftMask, xK_c ), kill) -- %! Close the focused window |
||
− | |||
− | , ((modMask, xK_space ), sendMessage NextLayout) -- %! Rotate through the available layout algorithms |
||
− | , ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf) -- %! Reset the layouts on the current workspace to default |
||
− | |||
− | , ((modMask, xK_n ), refresh) -- %! Resize viewed windows to the correct size |
||
− | |||
− | -- move focus up or down the window stack |
||
− | , ((modMask, xK_Tab ), windows W.focusDown) -- %! Move focus to the next window |
||
− | , ((modMask .|. shiftMask, xK_Tab ), windows W.focusUp ) -- %! Move focus to the previous window |
||
− | , ((modMask, xK_j ), windows W.focusDown) -- %! Move focus to the next window |
||
− | , ((modMask, xK_k ), windows W.focusUp ) -- %! Move focus to the previous window |
||
− | , ((modMask, xK_m ), windows W.focusMaster ) -- %! Move focus to the master window |
||
− | |||
− | -- modifying the window order |
||
− | , ((modMask, xK_Return), windows W.swapMaster) -- %! Swap the focused window and the master window |
||
− | , ((modMask .|. shiftMask, xK_j ), windows W.swapDown ) -- %! Swap the focused window with the next window |
||
− | , ((modMask .|. shiftMask, xK_k ), windows W.swapUp ) -- %! Swap the focused window with the previous window |
||
− | |||
− | -- resizing the master/slave ratio |
||
− | , ((modMask, xK_h ), sendMessage Shrink) -- %! Shrink the master area |
||
− | , ((modMask, xK_l ), sendMessage Expand) -- %! Expand the master area |
||
− | |||
− | -- floating layer support |
||
− | , ((modMask, xK_t ), withFocused $ windows . W.sink) -- %! Push window back into tiling |
||
− | |||
− | -- increase or decrease number of windows in the master area |
||
− | , ((modMask , xK_comma ), sendMessage (IncMasterN 1)) -- %! Increment the number of windows in the master area |
||
− | , ((modMask , xK_period), sendMessage (IncMasterN (-1))) -- %! Deincrement the number of windows in the master area |
||
− | |||
− | -- toggle the status bar gap |
||
− | --, ((modMask , xK_b ), modifyGap (\i n -> let x = (XMonad.defaultGaps conf ++ repeat (0,0,0,0)) !! i in if n == x then (0,0,0,0) else x)) -- %! Toggle the status bar gap |
||
− | |||
− | -- quit, or restart |
||
− | , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess)) -- %! Quit xmonad |
||
− | , ((modMask , xK_q ), restart "xmonad" True) -- %! Restart xmonad |
||
− | ] |
||
− | ++ |
||
− | -- mod-[1..9] %! Switch to workspace N |
||
− | -- mod-shift-[1..9] %! Move client to workspace N |
||
− | [((m .|. modMask, k), windows $ f i) |
||
− | | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9] |
||
− | , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]] |
||
− | ++ |
||
− | -- mod-{w,e,r} %! Switch to physical/Xinerama screens 1, 2, or 3 |
||
− | -- mod-shift-{w,e,r} %! Move client to screen 1, 2, or 3 |
||
− | [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f)) |
||
− | | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..] |
||
− | , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] |
||
− | |||
− | -- | Mouse bindings: default actions bound to mouse events |
||
− | -- |
||
− | mouseBindings :: XConfig Layout -> M.Map (KeyMask, Button) (Window -> X ()) |
||
− | mouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $ |
||
− | -- mod-button1 %! Set the window to floating mode and move by dragging |
||
− | [ ((modMask, button1), (\w -> focus w >> mouseMoveWindow w |
||
− | >> windows W.shiftMaster)) |
||
− | -- mod-button2 %! Raise the window to the top of the stack |
||
− | , ((modMask, button2), (\w -> focus w >> windows W.shiftMaster)) |
||
− | -- mod-button3 %! Set the window to floating mode and resize by dragging |
||
− | , ((modMask, button3), (\w -> focus w >> mouseResizeWindow w |
||
− | >> windows W.shiftMaster)) |
||
− | -- you may also bind events to the mouse scroll wheel (button4 and button5) |
||
− | ] |
||
− | |||
− | -- | And, finally, the default set of configuration values itself |
||
− | defaultConfig = XConfig |
||
− | { XMonad.borderWidth = borderWidth |
||
− | , XMonad.workspaces = workspaces |
||
− | , XMonad.layoutHook = layout |
||
− | , XMonad.terminal = terminal |
||
− | , XMonad.normalBorderColor = normalBorderColor |
||
− | , XMonad.focusedBorderColor = focusedBorderColor |
||
− | , XMonad.numlockMask = numlockMask |
||
− | , XMonad.modMask = defaultModMask |
||
− | , XMonad.keys = keys |
||
− | , XMonad.logHook = logHook |
||
− | , XMonad.startupHook = startupHook |
||
− | , XMonad.mouseBindings = mouseBindings |
||
− | , XMonad.manageHook = manageHook |
||
− | , XMonad.focusFollowsMouse = focusFollowsMouse } |
||
− | </haskell> |
Latest revision as of 17:06, 11 January 2018
If you want a good configuration to start from, it's quite simple.
A very basic configuration, which will work for things like simple terminals but not so well for many modern applications such as web browsers:
import XMonad main = xmonad defaultConfig
A more modern and more easily customized, yet still minimal, configuration (requires xmonad-contrib). Use this config if you plan to run Chromium; recent versions do not work correctly if you do not have desktop support enabled!
import XMonad import XMonad.Config.Desktop baseConfig = desktopConfig main = xmonad baseConfig
In this one, if you want to add things to various hooks (anything that ends with Hook
, except layoutHook
which is handled specially), you should prepend hookName baseConfig <+>
to the new value. (You may also make it the first item in a composeAll
for the manageHook
, or use Haskell's do
notation for most other hooks.)
import XMonad import XMonad.Config.Desktop import XMonad.Util.SpawnOnce baseConfig = desktopConfig main = xmonad baseConfig { focusedBorderColor = "#ff2037" -- not a hook ,startupHook = startupHook baseConfig <+> spawnOnce "urxvt" }
This ensures that you don't skip any hooks needed by the base configuration. If you want to do this with layoutHook
, use (|||)
instead:
layoutHook = myTall ||| layoutHook baseConfig
The consistent use of baseConfig
means you only need to change the definition of baseConfig
in order to switch to a different base, e.g. defaultConfig
for basic ICCCM compliance or xfceConfig
to integrate with an existing XFCE session.
If you plan to use XMonad.Util.EZConfig.additionalKeys
, or define your own hooks or commands, you may wish to put non-hooks in the definition of baseConfig
so that you can refer to your modMask
etc. later:
import XMonad import XMonad.Config.Desktop import XMonad.Util.EZConfig baseConfig = desktopConfig { modMask = mod4Mask , focusedBorderColor = "#ff2037" } main = xmonad $ baseConfig { startupHook = startupHook baseConfig <+> myHook } `additionalKeys` [((modMask baseConfig,xK_F1), spawn "firefox")) ] myHook = {- ... -}
See XMonad.Doc.Configuring for more information on customizing an xmonad configuration.