xmonad.hs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. -- ИМПОРТ МОДУЛЕЙ
  2. import XMonad
  3. import Data.Monoid
  4. import System.Exit
  5. import qualified XMonad.StackSet as W
  6. import qualified Data.Map as M
  7. import System.IO
  8. -- Автозапуск:
  9. import XMonad.Util.SpawnOnce
  10. -- Модуль для запуска xmobar
  11. import XMonad.Util.Run
  12. -- ЭМУЛЯТОР ТЕРМИНАЛА
  13. myTerminal = "st"
  14. -- СЛЕДУЕТ ЛИ ФОКУС ЗА КУРСОРОМ МЫШИ
  15. myFocusFollowsMouse :: Bool
  16. myFocusFollowsMouse = True
  17. -- БУДЕТ ЛИ ЦЕЛЧОК ПО ОКНУ ДЛЯ ФОКУСИРОВКИ ТАК ЖЕ ПЕРЕДОВАТЬ ЩЕЛЧОК ОКНУ
  18. myClickJustFocuses :: Bool
  19. myClickJustFocuses = False
  20. -- ТОЛЦИНА РАМКИ В ПИКСЕЛЯХ
  21. myBorderWidth = 1
  22. -- КЛАВИША МОДИФИКАТОР mod1Mask - ЛЕВЫЙ АЛЬТ, mod3Mask - ПРАВЫЙ АЛЬТ, mod4Mask - WIN
  23. myModMask = mod4Mask
  24. -- ВОРКСПЕЙСЫ
  25. myWorkspaces = ["1","2","3","4","5","6","7","8","9"]
  26. -- ЦВЕТ РАМКИ ОКОН
  27. myNormalBorderColor = "#1e1e2e"
  28. myFocusedBorderColor = "#d9e0ee"
  29. ------------------------------------------------------------------------
  30. -- ХОТКЕИ
  31. ------------------------------------------------------------------------
  32. myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
  33. -- ТЕРМИНАЛ
  34. [ ((modm, xK_Return), spawn $ XMonad.terminal conf)
  35. -- DMENU
  36. , ((modm, xK_d ), spawn "dmenu_run")
  37. -- GMRUN
  38. , ((modm .|. shiftMask, xK_p ), spawn "gmrun")
  39. -- ЗАКРЫТЬ АКТИВНОЕ ОКНО
  40. , ((modm, xK_c ), kill)
  41. -- ИЗМЕНИТЬ КОМПАНОВКУ ОКОН
  42. , ((modm, xK_space ), sendMessage NextLayout)
  43. -- ВЕРНУТЬ КОМПАНОВКУ ОКОН ВЗАД
  44. , ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
  45. -- Resize viewed windows to the correct size
  46. , ((modm, xK_n ), refresh)
  47. -- ПЕРЕКЛЮЧЕНИЕ МЕЖДУ ОКНАМИ
  48. , ((modm, xK_Tab ), windows W.focusDown)
  49. -- ПЕРЕКЛЮЧИТЬ ФОКУС НА СЛЕДУЮЩЕЕ ОКНО
  50. , ((modm, xK_Left ), windows W.focusDown)
  51. -- ПЕРЕКЛЮЧИТЬ ФОКУС НА ПРЕДЫДУЩЕЕ ОКНО
  52. , ((modm, xK_Right ), windows W.focusUp )
  53. -- ПЕРЕКЛЮЧИТЬ ФОКУС НА МАСТЕР ОКНО
  54. , ((modm, xK_m ), windows W.focusMaster )
  55. -- ПОМЕНЯТЬ МЕСТАМИ МАСТЕР ОКНО И ТЕКУЩЕЕ ОКНО
  56. , ((modm .|. shiftMask, xK_Return), windows W.swapMaster)
  57. -- ПОМЕНЯТЬ МЕСТАМИ ТЕКУЩЕЕ ОКНО И СЛЕДУЮЩЕ ЗА НИМ ОКНО
  58. , ((modm .|. shiftMask, xK_Left ), windows W.swapDown )
  59. -- ПОМЕНЯТЬ МЕСТАМИ ТЕКУЩЕЕ ОКНО И ПРЕДШЕСТВУЮЩЕЕ ЕМУ ОКНО
  60. , ((modm .|. shiftMask, xK_Right ), windows W.swapUp )
  61. -- УМЕНЬШИТЬ МАСТЕР ОКНО
  62. , ((modm, xK_h ), sendMessage Shrink)
  63. -- УВЕЛИЧИТЬ МАСТЕР ОКНО
  64. , ((modm, xK_l ), sendMessage Expand)
  65. -- СДЕЛАТЬ ОКНО ТАЙЛОВЫМ, ЕСЛИ ОНО БЫЛО ПЛАВАЮЩИМ
  66. , ((modm, xK_t ), withFocused $ windows . W.sink)
  67. -- УВЕЛИЧИТЬ КОЛИЧЕСТВО МАСТЕР ОКОН
  68. , ((modm , xK_comma ), sendMessage (IncMasterN 1))
  69. -- УМЕНЬШИТЬ КОЛИЧЕСТВО МАСТЕР ОКОН
  70. , ((modm , xK_period), sendMessage (IncMasterN (-1)))
  71. -- Toggle the status bar gap
  72. -- Use this binding with avoidStruts from Hooks.ManageDocks.
  73. -- See also the statusBar function from Hooks.DynamicLog.
  74. --
  75. -- , ((modm , xK_b ), sendMessage ToggleStruts)
  76. -- ВЫЙТИ
  77. , ((modm .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
  78. -- ПЕРЕЗАПУСТИТЬ
  79. , ((modm , xK_q ), spawn "xmonad --recompile; xmonad --restart")
  80. -- ПОКАЗАТЬ СПРАВКУ ПО ХОТКЕЯМ, У МЕНЯ НЕ РАБОТАЕТ, Я НЕ ПЫТАЛСЯ ЭТО ИСПРАВИТЬ.
  81. , ((modm .|. shiftMask, xK_slash ), spawn ("echo \"" ++ help ++ "\" | xmessage -file -"))
  82. ]
  83. ++
  84. -- MOD+1...9 ПЕРЕКЛЮЧИТСЯ НА ВОРКСПЕЙС, MOD+SHIFT+1...9 ПЕРЕМЕСТИТЬ ОКНО НА ВОРКСПЕЙС
  85. [((m .|. modm, k), windows $ f i)
  86. | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
  87. , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
  88. ++
  89. -- MOD+W,E,R ПЕРЕКЛЮЧИТСЯ НА 2Й ИЛИ 3Й МОНИТОР, MOD+SHIFT+W,E,R ПЕРЕМЕСТИТЬ ОКНО НА 2Й ИЛИ 3Й МОНИТОР
  90. [((m .|. modm, key), screenWorkspace sc >>= flip whenJust (windows . f))
  91. | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..]
  92. , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]]
  93. ------------------------------------------------------------------------
  94. -- НАСТРОЙКА КЛАВИШЬ МЫШИ
  95. ------------------------------------------------------------------------
  96. myMouseBindings (XConfig {XMonad.modMask = modm}) = M.fromList $
  97. -- mod-button1, СДЕЛАТЬ ОКНО ПЛАВАЮЩИМ
  98. [ ((modm, button1), (\w -> focus w >> mouseMoveWindow w
  99. >> windows W.shiftMaster))
  100. -- mod-button2, ПОДНЯТЬ ОКНО НА ВЕРШИНУ СТЕКА
  101. , ((modm, button2), (\w -> focus w >> windows W.shiftMaster))
  102. -- mod-button3, СДЕЛАТЬ ОКНО ПЛАВАЮЩИМ И ИЗМЕНИТЬ ЕГО РАЗМЕР
  103. , ((modm, button3), (\w -> focus w >> mouseResizeWindow w
  104. >> windows W.shiftMaster))
  105. -- you may also bind events to the mouse scroll wheel (button4 and button5)
  106. ]
  107. ------------------------------------------------------------------------
  108. -- МАКЕТЫ
  109. ------------------------------------------------------------------------
  110. myLayout = avoidStruts (tiled ||| Mirror tiled ||| Full)
  111. where
  112. -- РЕЖИМ ТАЙЛИНГА
  113. tiled = Tall nmaster delta ratio
  114. -- КОЛИЧЕСТВО МАСТЕР ОКОН ПО ДЕФОЛТУ
  115. nmaster = 1
  116. -- ПРОПОРЦИИ ЭКРАНА МЕЖДУ МАСТЕР ОКНОМ И ОСТАЛЬНЫМИ
  117. ratio = 1/2
  118. -- ШАГ В ПРОЦЕНТАХ ПРИ РЕСАЙЗЕ ОКНА
  119. delta = 3/100
  120. ------------------------------------------------------------------------
  121. -- ПРАВИЛА ОКОН
  122. ------------------------------------------------------------------------
  123. -- ДЛЯ ТОГО ЧТО БЫ УЗНПТЬ КЛАСС ОКНА НУЖНО ЗАЮЗАТЬ xprop | grep WM_CLASS
  124. -- ПО МИМО КЛАССА МОЖНО ЮЗАТЬ 'title', 'className' И 'resource'
  125. myManageHook = composeAll
  126. [ className =? "MPlayer" --> doFloat
  127. , className =? "Gimp" --> doFloat
  128. , resource =? "desktop_window" --> doIgnore
  129. , resource =? "kdesktop" --> doIgnore ]
  130. ------------------------------------------------------------------------
  131. -- Event handling
  132. ------------------------------------------------------------------------
  133. -- * EwmhDesktops users should change this to ewmhDesktopsEventHook
  134. --
  135. -- Defines a custom handler function for X Events. The function should
  136. -- return (All True) if the default handler is to be run afterwards. To
  137. -- combine event hooks use mappend or mconcat from Data.Monoid.
  138. --
  139. myEventHook = mempty
  140. ------------------------------------------------------------------------
  141. -- Status bars and logging
  142. ------------------------------------------------------------------------
  143. -- Perform an arbitrary action on each internal state change or X event.
  144. -- See the 'XMonad.Hooks.DynamicLog' extension for examples.
  145. --
  146. myLogHook = return ()
  147. ------------------------------------------------------------------------
  148. -- АВТОЗАПУСК
  149. ------------------------------------------------------------------------
  150. myStartupHook = do
  151. spawnOnce "nitrogen --restore &"
  152. spawnOnce "firefox"
  153. ------------------------------------------------------------------------
  154. -- Now run xmonad with all the defaults we set up.
  155. -- Run xmonad with the settings you specify. No need to modify this.
  156. --
  157. main = do
  158. xmproc0 <- spawnPipe "xmobar -x 0 ~/.config/xmobar/xmobarrc"
  159. xmonad $ docks defaults
  160. -- A structure containing your configuration settings, overriding
  161. -- fields in the default config. Any you don't override, will
  162. -- use the defaults defined in xmonad/XMonad/Config.hs
  163. --
  164. -- No need to modify this.
  165. --
  166. defaults = def {
  167. -- simple stuff
  168. terminal = myTerminal,
  169. focusFollowsMouse = myFocusFollowsMouse,
  170. clickJustFocuses = myClickJustFocuses,
  171. borderWidth = myBorderWidth,
  172. modMask = myModMask,
  173. workspaces = myWorkspaces,
  174. normalBorderColor = myNormalBorderColor,
  175. focusedBorderColor = myFocusedBorderColor,
  176. -- key bindings
  177. keys = myKeys,
  178. mouseBindings = myMouseBindings,
  179. -- hooks, layouts
  180. layoutHook = myLayout,
  181. manageHook = myManageHook,
  182. handleEventHook = myEventHook,
  183. logHook = myLogHook,
  184. startupHook = myStartupHook
  185. }
  186. -- | ПО ХОДУ ЭТО И ЕСТЬ ТА САМАЯ СПРАВКА КОТОРУЮ Я НЕ СМОГ ЗАПУСТИТЬ.
  187. help :: String
  188. help = unlines ["The default modifier key is 'alt'. Default keybindings:",
  189. "",
  190. "-- launching and killing programs",
  191. "mod-Shift-Enter Launch xterminal",
  192. "mod-p Launch dmenu",
  193. "mod-Shift-p Launch gmrun",
  194. "mod-Shift-c Close/kill the focused window",
  195. "mod-Space Rotate through the available layout algorithms",
  196. "mod-Shift-Space Reset the layouts on the current workSpace to default",
  197. "mod-n Resize/refresh viewed windows to the correct size",
  198. "",
  199. "-- move focus up or down the window stack",
  200. "mod-Tab Move focus to the next window",
  201. "mod-Shift-Tab Move focus to the previous window",
  202. "mod-j Move focus to the next window",
  203. "mod-k Move focus to the previous window",
  204. "mod-m Move focus to the master window",
  205. "",
  206. "-- modifying the window order",
  207. "mod-Return Swap the focused window and the master window",
  208. "mod-Shift-j Swap the focused window with the next window",
  209. "mod-Shift-k Swap the focused window with the previous window",
  210. "",
  211. "-- resizing the master/slave ratio",
  212. "mod-h Shrink the master area",
  213. "mod-l Expand the master area",
  214. "",
  215. "-- floating layer support",
  216. "mod-t Push window back into tiling; unfloat and re-tile it",
  217. "",
  218. "-- increase or decrease number of windows in the master area",
  219. "mod-comma (mod-,) Increment the number of windows in the master area",
  220. "mod-period (mod-.) Deincrement the number of windows in the master area",
  221. "",
  222. "-- quit, or restart",
  223. "mod-Shift-q Quit xmonad",
  224. "mod-q Restart xmonad",
  225. "mod-[1..9] Switch to workSpace N",
  226. "",
  227. "-- Workspaces & screens",
  228. "mod-Shift-[1..9] Move client to workspace N",
  229. "mod-{w,e,r} Switch to physical/Xinerama screens 1, 2, or 3",
  230. "mod-Shift-{w,e,r} Move client to screen 1, 2, or 3",
  231. "",
  232. "-- Mouse bindings: default actions bound to mouse events",
  233. "mod-button1 Set the window to floating mode and move by dragging",
  234. "mod-button2 Raise the window to the top of the stack",
  235. "mod-button3 Set the window to floating mode and resize by dragging"]