如何从 GHCi 中的 "target list" 中删除模块
How to remove module from "target list" in GHCi
在 GHCI 中,您可以使用 :add module
从当前项目添加模块,或者使用 :module + module
将模块添加到当前范围。使用:add
加载的模块将在您使用:reload
命令时自动重新加载,但必须是源模块,不能来自外部包。
如果您不小心使用 :add
而不是 :module +
来尝试加载模块,以后的重新加载总是会失败,并显示一条错误消息,指出该模块是包模块而不是源模块。如何删除模块以便重新加载可以再次成功使用,而无需通过 :load
?
重置整个源模块列表
不幸的是,:load
(或:cd
)是摆脱目标列表的唯一方法。更改目标列表的唯一其他功能是 :add
,如您所知,它只会添加其他目标。
但是,judging by the source,修复应该不会那么难。如果你愿意重新编译 GHC,像这样的东西应该可以工作:
ghciCommands :: [Command]
ghciCommands = map mkCmd [
...
("rem", keepGoingPaths removeModule, completeFilename),
...
-- | @:rem@ command
removeModule :: [FilePath] -> InputT GHCi ()
removeModule files = do
lift revertCAFs
files' <- mapM expandPath files
targets <- mapM (\m -> GHC.guessTarget m Nothing) files'
mapM_ GHC.removeTarget targets
_ <- doLoadAndCollectInfo False LoadAllTargets
return ()
话虽如此,我还没有尝试过。此外,这可能值得 ticket on the official tracker.
在 GHCI 中,您可以使用 :add module
从当前项目添加模块,或者使用 :module + module
将模块添加到当前范围。使用:add
加载的模块将在您使用:reload
命令时自动重新加载,但必须是源模块,不能来自外部包。
如果您不小心使用 :add
而不是 :module +
来尝试加载模块,以后的重新加载总是会失败,并显示一条错误消息,指出该模块是包模块而不是源模块。如何删除模块以便重新加载可以再次成功使用,而无需通过 :load
?
不幸的是,:load
(或:cd
)是摆脱目标列表的唯一方法。更改目标列表的唯一其他功能是 :add
,如您所知,它只会添加其他目标。
但是,judging by the source,修复应该不会那么难。如果你愿意重新编译 GHC,像这样的东西应该可以工作:
ghciCommands :: [Command]
ghciCommands = map mkCmd [
...
("rem", keepGoingPaths removeModule, completeFilename),
...
-- | @:rem@ command
removeModule :: [FilePath] -> InputT GHCi ()
removeModule files = do
lift revertCAFs
files' <- mapM expandPath files
targets <- mapM (\m -> GHC.guessTarget m Nothing) files'
mapM_ GHC.removeTarget targets
_ <- doLoadAndCollectInfo False LoadAllTargets
return ()
话虽如此,我还没有尝试过。此外,这可能值得 ticket on the official tracker.