Haskell 重新启动时的XMonad确认
我是Haskell的初学者,我正在使用xmonad。我试图在退出之前让它提示我,因为我偶尔会意外地碰到mod+q。我找到了两种方法,但我肯定做错了什么,因为这两种方法都不适合我: http://comments.gmane.org/gmane.comp.lang.haskell.xmonad/11699 这是我的圣诞礼物:Haskell 重新启动时的XMonad确认,haskell,xmonad,Haskell,Xmonad,我是Haskell的初学者,我正在使用xmonad。我试图在退出之前让它提示我,因为我偶尔会意外地碰到mod+q。我找到了两种方法,但我肯定做错了什么,因为这两种方法都不适合我: http://comments.gmane.org/gmane.comp.lang.haskell.xmonad/11699 这是我的圣诞礼物: import XMonad import XMonad.Config.Gnome import XMonad.Actions.Plane import XMonad.Util
import XMonad
import XMonad.Config.Gnome
import XMonad.Actions.Plane
import XMonad.Util.EZConfig
import XMonad.Util.Run(spawnPipe)
import qualified Data.Map as M
import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.UrgencyHook
import System.IO(Handle, hPutStrLn)
import System.Exit
import Control.Monad
import XMonad
import XMonad.Util.EZConfig
import XMonad.Util.Dmenu
import XMonad.Util.Run
workspaces' = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
quit_confirm :: X ()
quit_confirm = do
let m = "confirm restart"
s <- dmenu [m]
when (m == s) (spawn "xmonad --restart")
conf_quit = do
response <- runProcessWithInput "dmenu" ["-p", "Quit?"] "yes\nno\n"
when (response == "yes") (spawn "xmonad --restart")
main = do
dzen2Pipe <- spawnPipe "dzen2 -w 1200 -xs 1 -ta l -fn '-*-terminus-*-*-*-*-16-*-*-*-*-*-*-*' -bg black -fg #d3d7cf "
dzen2Right <- spawnPipe "~/.xmonad/status-dzen.sh"
startupProgs <- spawnPipe "~/.xmonad/startups.sh"
xmonad $ defaultConfig
{
workspaces = workspaces'
, manageHook = manageHook' <+> manageHook defaultConfig
, modMask = mod4Mask
, terminal = "gnome-terminal"
, layoutHook = layoutHook'
, logHook = logHook' dzen2Pipe
}
`additionalKeysP`
[ -- Lock Screen
("M-S-l", spawn "gnome-screensaver-command -l")
-- Sleep
, ("M-S-;", spawn "gnome-screensaver-command -l; pmi action suspend")
-- wireless
, ("M-S-C-w", spawn "~/.xmonad/wireless.sh")
-- 1 screen reconf
, ("M-S-C-1", spawn "~/.xmonad/1-screen.sh")
-- 2 screen reconf
, ("M-S-C-2", spawn "~/.xmonad/2-screen.sh")
-- confirm for quit
, ("M-q", conf_quit)
]
`additionalKeys`
M.toList (planeKeys mod4Mask GConf Finite)
layoutHook' = avoidStruts $ layoutHook defaultConfig
logHook' = dynamicLogWithPP . dzenPP'
dzenPP' h = defaultPP
{
ppOutput = hPutStrLn h
}
manageHook' = composeAll
[ className =? "Pidgin" --> doShift "1" ,
className =? "Firefox" --> doShift "2" ,
className =? "Thunderbird" --> doShift "3" ,
className =? "OpenOffice.org 3.2" --> doShift "4",
manageDocks ]
导入XMonad
导入XMonad.Config.Gnome
导入XMonad.Actions.Plane
导入XMonad.Util.EZConfig
导入XMonad.Util.Run(spawnPipe)
导入符合条件的数据。映射为M
导入XMonad.Hooks.DynamicLog
导入XMonad.Hooks.ManageDocks
导入XMonad.Hooks.UrgencyHook
导入System.IO(句柄,hPutStrLn)
导入系统。退出
进口管制
导入XMonad
导入XMonad.Util.EZConfig
导入XMonad.Util.Dmenu
导入XMonad.Util.Run
工作区“=[“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“0”]
退出确认::X()
退出
让m=“确认重新启动”
s您说您想要退出确认,但您的代码执行重新启动确认。
如果这是您想要的重新启动,我已测试并确认退出
有效
您最可能错过的是重新编译xmonad以查看新配置。
试试这个:
quit_confirm :: X ()
quit_confirm = do
let m = "confirm restart"
s <- dmenu [m]
when (m == s) (spawn "xmonad recompile && xmonad --restart")
退出确认::X()
退出
让m=“确认重新启动”
s将密钥绑定更改为
("M-q", confirm "Confirm restart?" $ restart "xmonad" True)
并添加使用dmenu的常规确认操作
confirm :: String -> X () -> X ()
confirm msg f = do
a <- dmenu [msg,"y","n"]
when (a=="y") f
confirm::String->X()->X()
确认消息f=do
a其他人给出的答案遗漏了dmenu
似乎在返回的字符串末尾添加了额外的空格。您只需执行以下操作,它对我很有用:
confirm :: String -> X () -> X ()
confirm m f = do
result <- dmenu [m]
when (init result == m) f
或
我编写了以下模块,它不需要安装dmenu
:
-----------------------------------------------------------------------------
-- |
-- Module : XMonad.Prompt
-- Copyright : (C) 2015 Antoine Beaupré
-- License : BSD3
--
-- Maintainer : Antoine Beaupré <anarcat@debian.org>
-- Stability : unstable
-- Portability : unportable
--
-- A module for setting up simple confirmation prompts for keybindings.
--
-----------------------------------------------------------------------------
module XMonad.Prompt.ConfirmPrompt (confirmPrompt
-- * Usage
-- $usage
, module XMonad.Prompt
-- * Use case: confirming exit
-- $tip
, EnterPrompt
) where
import XMonad (X)
import XMonad.Prompt (XPConfig, XPrompt, showXPrompt, mkXPrompt, mkComplFunFromList)
{- $usage
This module makes it easy to add a confirmation prompt for specific
actions. Instead of just running the action, a simple confirmation
prompt will be created using 'XMonad.Prompt' primitives. The action
will then run normally if the user confirms.
-}
{- $tip
This should be used something like this:
> ...
> , ((modm , xK_l), confirmPrompt defaultXPConfig "exit" $ io (exitWith ExitSuccess))
> ...
-}
{- | Customized 'XPrompt' prompt that will ask to confirm the given string -}
data EnterPrompt = EnterPrompt String
instance XPrompt EnterPrompt where
showXPrompt (EnterPrompt n) = "Confirm " ++ n ++ " (esc/ENTER)"
{- | Prompt the user to confirm a given action. We offer no completion
and simply ask to confirm (ENTER) or cancel (ESCAPE). The actual key
handling is done by mkXPrompt.-}
confirmPrompt :: XPConfig -> String -> X() -> X()
confirmPrompt config app func = mkXPrompt (EnterPrompt app) config (mkComplFunFromList []) $ const func
-----------------------------------------------------------------------------
-- |
--模块:XMonad.Prompt
--版权所有:(C)2015年Antoine Beaupré
--许可证:BSD3
--
--维护者:Antoine Beaupré将此信息发送到XMonad邮件列表,我正在等待反馈…嗨。不幸的是,它没有起作用。将显示菜单,但它似乎没有执行生成过程。我想可能是wither丢失了一个钩子,或者是x丢失了一个配置。试着生成一些你知道可以工作的其他东西,比如wireless.sh。这是一样的,.xsession错误似乎没有任何用处。你将其命名为conf\u quit
,但它会重新启动。您希望它在成功确认后退出还是重新启动?我已经完成了这两个步骤,但它不执行生成过程。我开始认为我的问题来自其他地方,因为代码为其他人工作。到底发生了什么?是什么让你认为繁殖没有发生?当您将密钥绑定到比生成(比如实际退出)更明显的东西时会发生什么?你能检查一下你的xmonad可执行文件是否在xmonad的路径中(这可能不同于你的终端的路径和你的控制台的路径)吗?嗨,我试过了,但还是没用。菜单显示了,但似乎没有执行,并且我在.xsession错误中找不到任何相关信息,尽管我在尝试重新启动xmonad时有时遇到问题,解决方案是重新启动X会话,而不是重新加载xmonad(例如,重新启动gdm)。现在我自己尝试了,我的代码正在使用xmonad0.10-2(debian包)。
confirm "Exit" $ io (exitWith ExitSuccess)
-----------------------------------------------------------------------------
-- |
-- Module : XMonad.Prompt
-- Copyright : (C) 2015 Antoine Beaupré
-- License : BSD3
--
-- Maintainer : Antoine Beaupré <anarcat@debian.org>
-- Stability : unstable
-- Portability : unportable
--
-- A module for setting up simple confirmation prompts for keybindings.
--
-----------------------------------------------------------------------------
module XMonad.Prompt.ConfirmPrompt (confirmPrompt
-- * Usage
-- $usage
, module XMonad.Prompt
-- * Use case: confirming exit
-- $tip
, EnterPrompt
) where
import XMonad (X)
import XMonad.Prompt (XPConfig, XPrompt, showXPrompt, mkXPrompt, mkComplFunFromList)
{- $usage
This module makes it easy to add a confirmation prompt for specific
actions. Instead of just running the action, a simple confirmation
prompt will be created using 'XMonad.Prompt' primitives. The action
will then run normally if the user confirms.
-}
{- $tip
This should be used something like this:
> ...
> , ((modm , xK_l), confirmPrompt defaultXPConfig "exit" $ io (exitWith ExitSuccess))
> ...
-}
{- | Customized 'XPrompt' prompt that will ask to confirm the given string -}
data EnterPrompt = EnterPrompt String
instance XPrompt EnterPrompt where
showXPrompt (EnterPrompt n) = "Confirm " ++ n ++ " (esc/ENTER)"
{- | Prompt the user to confirm a given action. We offer no completion
and simply ask to confirm (ENTER) or cancel (ESCAPE). The actual key
handling is done by mkXPrompt.-}
confirmPrompt :: XPConfig -> String -> X() -> X()
confirmPrompt config app func = mkXPrompt (EnterPrompt app) config (mkComplFunFromList []) $ const func