2012-04-03 65 views
4

我是一名Haskell初学者,我正在使用xmonad。我试图在退出之前提醒我,因为偶尔偶然碰到mod + q。我发现了两种方法,但我必须做错事,因为它们都不适合我: https://bbs.archlinux.org/viewtopic.php?id=120298 http://comments.gmane.org/gmane.comp.lang.haskell.xmonad/11699重新启动时XMonad确认

这里是我的xmonad.hs:

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 ] 

谢谢!

编辑:显示菜单,但生成过程似乎不起作用。

+0

你把它命名为'conf_quit',但它重新启动。您想在成功确认后退出或重新启动吗? – 2012-04-03 15:59:16

+0

我经历了两次,但它不执行产卵过程。自从代码适用于其他人以来,我开始认为我的问题来自其他地方。 – 2012-04-03 16:34:43

+0

究竟发生了什么?是什么让你认为'spawn'没有发生?当你把钥匙绑定到一个比产卵更明显的东西时会发生什么,比如实际退出?你能检查你的xmonad可执行文件是否在xmonad的'PATH'中(它可能与你的终端的'PATH'和你的控制台的PATH有所不同)? – 2012-04-03 16:49:53

回答

2

的回答别人都给错过了dmenu似乎添加一个通用的确认动作多余的空格到它返回的字符串的末尾。你只需要做到以下几点,它为我的作品:

confirm :: String -> X() -> X() 
confirm m f = do 
    result <- dmenu [m] 
    when (init result == m) f 

然后,当@mariop建议兼用

confirm "Restart" $ spawn "xmonad --recompile && xmonad --restart" 

confirm "Exit" $ io (exitWith ExitSuccess) 
0

你说你想要一个退出确认,但你的代码重新确认。 如果这是您想要的重新启动,我测试了并且quit_confirm工作。

你最可能错过的是重新编译xmonad来查看你的新配置。 试试这个:

quit_confirm :: X() 
quit_confirm = do 
    let m = "confirm restart" 
    s <- dmenu [m] 
    when (m == s) (spawn "xmonad recompile && xmonad --restart") 
+0

嗨。不幸的是它没有奏效。该菜单显示,但它似乎并没有执行产卵过程。我在想,这可能会导致我错过了一个钩子或一个x miss-configuration。 – 2012-04-03 14:37:38

+0

尝试产生你知道可以工作的其他东西,比如wireless.sh。 – 2012-04-03 14:55:45

+0

这是一样的。xsession-errors似乎没有任何用处。 – 2012-04-03 16:21:58

1

更改键绑定到

("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 
+0

嗨,我试过了,但仍然没有工作。显示菜单,但似乎没有执行,我找不到任何与我的.xsession-errors有关的任何内容 – 2012-04-03 16:20:45

+0

我有时尝试重新启动xmonad时遇到问题,解决方法是重新启动X会话,而不是重新加载Xmonad(例如,重新启动gdm)。现在我自己试了一下,我的代码正在使用xmonad 0.10-2(debian软件包)。 – mariop 2012-04-03 17:16:28

0

我写了下面模块,其中不需要安装dmenu

----------------------------------------------------------------------------- 
-- | 
-- Module  : XMonad.Prompt 
-- Copyright : (C) 2015 Antoine Beaupré 
-- License  : BSD3 
-- 
-- Maintainer : Antoine Beaupré <[email protected]> 
-- 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/lib/XMonad/Prompt目录中,并享受!

(我submitted这给XMonad邮件列表,我在等待反馈...)