diff --git a/src/Ide/Arguments.hs b/src/Ide/Arguments.hs
index a7c5433ff53c7f475e1991d964ebbc15084638b5..39ced77cd2b87a126b07cbe22b7cdfe27368a508 100644
--- a/src/Ide/Arguments.hs
+++ b/src/Ide/Arguments.hs
@@ -30,6 +30,7 @@ import System.Environment
data Arguments
= VersionMode PrintVersion
| ProbeToolsMode
+ | ListPluginsMode
| BiosMode BiosAction
| Ghcide GhcideArguments
| VSCodeExtensionSchemaMode
@@ -64,6 +65,7 @@ getArguments exeName plugins = execParser opts
opts = info ((
VersionMode <$> printVersionParser exeName
<|> probeToolsParser exeName
+ <|> listPluginsParser
<|> BiosMode <$> biosParser
<|> Ghcide <$> arguments plugins
)
@@ -90,6 +92,11 @@ probeToolsParser exeName =
flag' ProbeToolsMode
(long "probe-tools" <> help ("Show " ++ exeName ++ " version and other tools of interest"))
+listPluginsParser :: Parser Arguments
+listPluginsParser =
+ flag' ListPluginsMode
+ (long "list-plugins" <> help "List all avaliable plugins")
+
arguments :: IdePlugins IdeState -> Parser GhcideArguments
arguments plugins = GhcideArguments
<$> (commandP plugins <|> lspCommand <|> checkCommand)
diff --git a/src/Ide/Main.hs b/src/Ide/Main.hs
index 54a6e7af3fe554dd1db7bdcdff4f3069952376e6..b54a7986033dc34698788dc1a0b640857db260d1 100644
--- a/src/Ide/Main.hs
+++ b/src/Ide/Main.hs
@@ -13,6 +13,7 @@ import Control.Monad.Extra
import qualified Data.Aeson.Encode.Pretty as A
import qualified Data.ByteString.Lazy.Char8 as LBS
import Data.Default
+import Data.List (sort)
import qualified Data.Text as T
import Development.IDE.Core.Rules
import Development.IDE.Graph (ShakeOptions (shakeThreads))
@@ -25,7 +26,8 @@ import Ide.Arguments
import Ide.Logger
import Ide.Plugin.ConfigUtils (pluginsToDefaultConfig,
pluginsToVSCodeExtensionSchema)
-import Ide.Types (IdePlugins, ipMap)
+import Ide.Types (IdePlugins, PluginId (PluginId),
+ ipMap)
import Ide.Version
import qualified Language.LSP.Server as LSP
import qualified System.Directory.Extra as IO
@@ -51,6 +53,12 @@ defaultMain args idePlugins = do
VersionMode PrintNumericVersion ->
putStrLn haskellLanguageServerNumericVersion
+ ListPluginsMode -> do
+ let pluginNames = sort
+ $ map ((\(PluginId t) -> T.unpack t) . fst)
+ $ ipMap idePlugins
+ mapM_ putStrLn pluginNames
+
BiosMode PrintCradleType -> do
dir <- IO.getCurrentDirectory
hieYaml <- Session.findCradle def dir