aboutsummaryrefslogtreecommitdiffstats
path: root/ShellPrompt.hs
diff options
context:
space:
mode:
authorSpencer Janssen <sjanssen@cse.unl.edu>2007-11-01 21:10:59 +0100
committerSpencer Janssen <sjanssen@cse.unl.edu>2007-11-01 21:10:59 +0100
commit4866f2e367dfcf22a9591231ba40948826a1b438 (patch)
tree7a245caee3f146826b267d773b7eaa80386a818e /ShellPrompt.hs
parent47589e1913fb9530481caedb543978a30d4323ea (diff)
downloadXMonadContrib-4866f2e367dfcf22a9591231ba40948826a1b438.tar.gz
XMonadContrib-4866f2e367dfcf22a9591231ba40948826a1b438.tar.xz
XMonadContrib-4866f2e367dfcf22a9591231ba40948826a1b438.zip
Hierarchify
darcs-hash:20071101201059-a5988-fc1f1262bec1b69e13ba18ae7cefeafc8c4471d4.gz
Diffstat (limited to 'ShellPrompt.hs')
-rw-r--r--ShellPrompt.hs127
1 files changed, 0 insertions, 127 deletions
diff --git a/ShellPrompt.hs b/ShellPrompt.hs
deleted file mode 100644
index 756b216..0000000
--- a/ShellPrompt.hs
+++ /dev/null
@@ -1,127 +0,0 @@
------------------------------------------------------------------------------
--- |
--- Module : XMonadContrib.ShellPrompt
--- Copyright : (C) 2007 Andrea Rossato
--- License : BSD3
---
--- Maintainer : andrea.rossato@unibz.it
--- Stability : unstable
--- Portability : unportable
---
--- A shell prompt for XMonad
---
------------------------------------------------------------------------------
-
-module XMonadContrib.ShellPrompt (
- -- * Usage
- -- $usage
- shellPrompt
- , getShellCompl
- , split
- , prompt
- , safePrompt
- ) where
-
-import System.Environment
-import Control.Monad
-import Data.List
-import System.Directory
-import System.IO
-import XMonadContrib.Run
-import XMonad
-import XMonadContrib.XPrompt
-
--- $usage
---
--- 1. In Config.hs add:
---
--- > import XMonadContrib.XPrompt
--- > import XMonadContrib.ShellPrompt
---
--- 2. In your keybindings add something like:
---
--- > , ((modMask .|. controlMask, xK_x), shellPrompt defaultXPConfig)
---
-
--- %import XMonadContrib.XPrompt
--- %import XMonadContrib.ShellPrompt
--- %keybind , ((modMask .|. controlMask, xK_x), shellPrompt defaultXPConfig)
-
-data Shell = Shell
-
-instance XPrompt Shell where
- showXPrompt Shell = "Run: "
-
-shellPrompt :: XPConfig -> X ()
-shellPrompt c = do
- cmds <- io $ getCommands
- mkXPrompt Shell c (getShellCompl cmds) spawn
-
--- | See safe and unsafeSpawn. prompt is an alias for safePrompt;
--- safePrompt and unsafePrompt work on the same principles, but will use
--- XPrompt to interactively query the user for input; the appearance is
--- set by passing an XPConfig as the second argument. The first argument
--- is the program to be run with the interactive input.
--- You would use these like this:
---
--- > , ((modMask, xK_b ), safePrompt "firefox" greenXPConfig)
--- > , ((modMask .|. shiftMask, xK_c ), prompt ("xterm" ++ " -e") greenXPConfig)
---
--- Note that you want to use safePrompt for Firefox input, as Firefox
--- wants URLs, and unsafePrompt for the XTerm example because this allows
--- you to easily start a terminal executing an arbitrary command, like
--- 'top'.
-prompt, unsafePrompt, safePrompt :: FilePath -> XPConfig -> X ()
-prompt = unsafePrompt
-safePrompt c config = mkXPrompt Shell config (getShellCompl [c]) run
- where run = safeSpawn c
-unsafePrompt c config = mkXPrompt Shell config (getShellCompl [c]) run
- where run a = unsafeSpawn $ c ++ " " ++ a
-
-getShellCompl :: [String] -> String -> IO [String]
-getShellCompl cmds s | s == "" || last s == ' ' = return []
- | otherwise = do
- f <- fmap lines $ runProcessWithInput "bash" [] ("compgen -A file " ++ s ++ "\n")
- return . map escape . uniqSort $ f ++ commandCompletionFunction cmds s
-
-commandCompletionFunction :: [String] -> String -> [String]
-commandCompletionFunction cmds str | '/' `elem` str = []
- | otherwise = filter (isPrefixOf str) cmds
-
-getCommands :: IO [String]
-getCommands = do
- p <- getEnv "PATH" `catch` const (return [])
- let ds = split ':' p
- fp d f = d ++ "/" ++ f
- es <- forM ds $ \d -> do
- exists <- doesDirectoryExist d
- if exists
- then getDirectoryContents d >>= filterM (isExecutable . fp d)
- else return []
- return . uniqSort . concat $ es
-
-isExecutable :: FilePath ->IO Bool
-isExecutable f = do
- fe <- doesFileExist f
- if fe
- then fmap executable $ getPermissions f
- else return False
-
-split :: Eq a => a -> [a] -> [[a]]
-split _ [] = []
-split e l =
- f : split e (rest ls)
- where
- (f,ls) = span (/=e) l
- rest s | s == [] = []
- | otherwise = tail s
-
-escape :: String -> String
-escape [] = ""
-escape (' ':xs) = "\\ " ++ escape xs
-escape (x:xs)
- | isSpecialChar x = '\\' : x : escape xs
- | otherwise = x : escape xs
-
-isSpecialChar :: Char -> Bool
-isSpecialChar = flip elem "\\@\"'#?$*()[]{};"