aboutsummaryrefslogtreecommitdiffstats
path: root/XMonad/Util
diff options
context:
space:
mode:
Diffstat (limited to 'XMonad/Util')
-rw-r--r--XMonad/Util/Search.hs60
1 files changed, 31 insertions, 29 deletions
diff --git a/XMonad/Util/Search.hs b/XMonad/Util/Search.hs
index 03e6992..31b0496 100644
--- a/XMonad/Util/Search.hs
+++ b/XMonad/Util/Search.hs
@@ -15,28 +15,23 @@
--------------------------------------------------------------------------- -}
module XMonad.Util.Search ( -- * Usage
-- $usage
- google,
- googleSelection,
- googleSearch,
- wayback,
- waybackSelection,
- waybackSearch,
- wikipedia,
- wikipediaSelection,
- wikipediaSearch,
+ google, googleSelection, googleSearch,
+ wayback, waybackSelection, waybackSearch,
+ wikipedia, wikipediaSelection, wikipediaSearch,
promptSearch,
search
) where
+import Control.Monad.Trans (MonadIO()) -- for select's type signature
+import Data.Char (chr, ord, isAlpha, isMark, isDigit)
+import Numeric (showIntAtBase)
import XMonad (io, X())
-import XMonad.Util.Run (safeSpawn)
-import XMonad.Prompt.Shell (getShellCompl)
import XMonad.Prompt (XPrompt(showXPrompt), mkXPrompt, XPConfig())
+import XMonad.Prompt.Shell (getShellCompl)
+import XMonad.Util.Run (safeSpawn)
import XMonad.Util.XSelection (getSelection)
-import Data.Char (chr, ord, isAlpha, isMark, isDigit)
-import Numeric (showIntAtBase)
--- A customized prompt
+-- A customized prompt.
data Search = Search
instance XPrompt Search where
showXPrompt Search = "Search: "
@@ -46,14 +41,12 @@ instance XPrompt Search where
-- but then that'd be hard enough to copy-and-paste we'd need to depend on 'network'.
escape :: String -> String
escape = escapeURIString (\c -> isAlpha c || isDigit c || isMark c)
- where
+ where -- Copied from Network.URI.
escapeURIString ::
- (Char -> Bool) -- ^ a predicate which returns 'False'
- -- if the character should be escaped
- -> String -- ^ the string to process
- -> String -- ^ the resulting URI string
+ (Char -> Bool) -- a predicate which returns 'False' if should escape
+ -> String -- the string to process
+ -> String -- the resulting URI string
escapeURIString p s = concatMap (escapeURIChar p) s
-
escapeURIChar :: (Char->Bool) -> Char -> String
escapeURIChar p c
| p c = [c]
@@ -73,31 +66,40 @@ escape = escapeURIString (\c -> isAlpha c || isDigit c || isMark c)
search :: String -> FilePath -> String -> IO ()
search site browser query = safeSpawn browser $ site ++ escape query
-promptSearch :: (String -> String -> IO ()) -> String -> XPConfig -> X ()
-promptSearch engine browser config = mkXPrompt Search config (getShellCompl []) $ io . (engine browser)
-
-- The engines
googleSearch, waybackSearch, wikipediaSearch :: String -> String -> IO ()
googleSearch = search "http://www.google.com/search?num=100&q="
wikipediaSearch = search "https://secure.wikimedia.org/wikipedia/en/wiki/Special:Search?go=Go&search="
+waybackSearch = search "http://web.archive.org/"
{- This doesn't seem to work, but nevertheless, it seems to be the official
method at <http://web.archive.org/collections/web/advanced.html> to get the
latest backup. -}
-waybackSearch = search "http://web.archive.org/"
+
+-- | Like 'search', but in this case, the string is not specified but grabbed
+-- from the user's response to a prompt.
+promptSearch :: (String -> String -> IO ()) -> String -> XPConfig -> X ()
+promptSearch searchEngine browser config = mkXPrompt Search config (getShellCompl []) $ io . (searchEngine browser)
-- | Search the particular site; these are suitable for binding to a key. Use them like this:
--
-- > , ((modm, xK_g ), google "firefox" defaultXPConfig)
--
--- First argument is the browser you want to use, the second the prompt configuration
+-- First argument is the browser you want to use, the second the prompt configuration.
google, wayback, wikipedia :: String -> XPConfig -> X ()
google = promptSearch googleSearch
wikipedia = promptSearch wikipediaSearch
wayback = promptSearch waybackSearch
--- | See previous. Like google\/wikipedia, but one less argument - the query is
+-- | Like search, but for use with the X selection; it grabs the selection,
+-- passes it to a given searchEngine and opens it in a browser. The various
+-- *Selection functions specialize this to a particular search engine to make
+-- things easier.
+select :: (Control.Monad.Trans.MonadIO m) => (t -> String -> IO a) -> t -> m a
+select browser searchEngine = io $ browser searchEngine =<< getSelection
+
+-- | Like the google\/wikipedia functions, but one less argument - the query is
-- extracted from the copy-paste buffer of X Windows.
googleSelection, waybackSelection, wikipediaSelection :: String -> X ()
-googleSelection browser = io $ googleSearch browser =<< getSelection
-wikipediaSelection browser = io $ wikipediaSearch browser =<< getSelection
-waybackSelection browser = io $ waybackSearch browser =<< getSelection
+googleSelection = select googleSearch
+wikipediaSelection = select wikipediaSearch
+waybackSelection = select waybackSearch