2012-04-03 64 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郵件列表,我在等待反饋...)