yi-core-0.13: src/Yi/Command/Help.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
-- |
-- Module : Yi.Command.Help
-- License : GPL-2
-- Maintainer : yi-devel@googlegroups.com
-- Stability : experimental
-- Portability : portable
--
-- Help command support
-- This module uses Yi.Eval.describeNamedAction to
-- show whatever information about particular action is available
-- from current evaluator (ghciEvaluator currently presents only type.)
-- TODO: Would be nice to show excerpt from Haddock documentation in the future.
--
-- If given no arguments, the help index is shown (using @getAllNamesInScope@).
--
-- Please do not try to show descriptions for the whole index,
-- as our interface to GHCi is too slow.
module Yi.Command.Help(displayHelpFor) where
import Data.Binary (Binary)
import Data.Default (Default)
import qualified Data.Text as T (Text, pack, unlines, unpack)
import Data.Typeable (Typeable)
import Yi.Buffer (BufferId (MemBuffer), BufferRef)
import Yi.Editor
import Yi.Eval (describeNamedAction, getAllNamesInScope)
import Yi.Keymap (YiM)
import Yi.Monad (maybeM)
import qualified Yi.Rope as R (fromText)
import Yi.Types (YiVariable)
-- | Displays help for a given name, or help index, if no name is given
displayHelpFor :: T.Text -> YiM ()
displayHelpFor name = helpFor name >>= displayHelpBuffer
-- | Finds help text to display, given a command argument
helpFor :: T.Text -> YiM T.Text
helpFor "" = (T.unlines . map T.pack) <$> getAllNamesInScope
helpFor name = T.pack <$> describeNamedAction (T.unpack name)
-- * To make help buffer unique:
-- | Dynamic YiVariable to store the help buffer reference.
newtype HelpBuffer = HelpBuffer { helpBuffer :: Maybe BufferRef }
deriving (Default, Typeable, Binary)
instance YiVariable HelpBuffer
-- | Display help buffer with a given text...
displayHelpBuffer :: T.Text -> YiM ()
displayHelpBuffer text = withEditor $ withOtherWindow $ do
maybeM deleteBuffer =<< helpBuffer <$> getEditorDyn
b <- newBufferE (MemBuffer "*help*") $ R.fromText text
putEditorDyn $ HelpBuffer $ Just b