增加ghci的"宽度"

Sté*_*ent 16 haskell ghci

当GHCI中的输出线太长时,它会被破坏:

> :i bar
bar :: Lens' (Foo a0) Int   -- Defined at NewType_makeLenses.hs:7:1
> :i baz
baz :: Lens (Foo a0) (Foo a1) a0 a1
    -- Defined at NewType_makeLenses.hs:7:1
Run Code Online (Sandbox Code Playgroud)

有没有办法设置线的最大长度?

Zet*_*eta 21

控制漂亮打印有三个选项:

-dppr-debug         Turn on debug printing (more verbose)
-dppr-user-length   Set the depth for printing expressions in error msgs    
-dppr-cols?N?       Set the width of debugging output. For example -dppr-cols200
Run Code Online (Sandbox Code Playgroud)

你在找-dppr-cols.它的默认值是100.您可以将其设置为任何其他值,无论是在调用GHCi时还是使用:set.

比较选项

没有 -dppr-cols

$ ghci NewType_makeLenses.hs
[1 of 1] Compiling Main             ( NewType_makeLenses.hs, interpreted )  
Ok, modules loaded: Main.                                                   
> :i bar                                                                    
bar :: Lens' (Foo a0) Int       -- Defined at NewType_makeLenses.hs:9:1     
> :i baz                                                                    
baz :: Lens (Foo a0) (Foo a1) a0 a1                                         
        -- Defined at NewType_makeLenses.hs:10:1   
Run Code Online (Sandbox Code Playgroud)

-dppr-cols140

$ ghci -dppr-cols140 NewType_makeLenses.hs
[1 of 1] Compiling Main             ( NewType_makeLenses.hs, interpreted )
Ok, modules loaded: Main.
> :i bar
bar :: Lens' (Foo a0) Int       -- Defined at NewType_makeLenses.hs:9:1
> :i baz
baz :: Lens (Foo a0) (Foo a1) a0 a1     -- Defined at NewType_makeLenses.hs:10:1
Run Code Online (Sandbox Code Playgroud)

:set -dppr-cols140

$ ghci NewType_makeLenses.hs
[1 of 1] Compiling Main             ( NewType_makeLenses.hs, interpreted )
Ok, modules loaded: Main.
> :set -dppr-cols140
> :i bar
bar :: Lens' (Foo a0) Int       -- Defined at NewType_makeLenses.hs:9:1
> :i baz
baz :: Lens (Foo a0) (Foo a1) a0 a1     -- Defined at NewType_makeLenses.hs:10:1
Run Code Online (Sandbox Code Playgroud)

额外奖励:我怎么找到这个?

我没有看过旗帜,相反,我查看了GHC的源代码:

$ git clone --depth=1 https://github.com/ghc/ghc.git && cd ghc
Run Code Online (Sandbox Code Playgroud)

接下来,我寻找以下列开头的字符串"Defined:

$ grep -C2 "\"Defined" -r . --exclude-dir=testsuite
./compiler/basicTypes/Name.hs-ppr_z_occ_name occ = ztext (zEncodeFS (occNameFS occ))
./compiler/basicTypes/Name.hs-
./compiler/basicTypes/Name.hs:-- Prints (if mod information is available) "Defined at <loc>" or
./compiler/basicTypes/Name.hs:--  "Defined in <mod>" information for a Name.
./compiler/basicTypes/Name.hs-pprDefinedAt :: Name -> SDoc
./compiler/basicTypes/Name.hs:pprDefinedAt name = text "Defined" <+> pprNameDefnLoc name
./compiler/basicTypes/Name.hs-
./compiler/basicTypes/Name.hs-pprNameDefnLoc :: Name -> SDoc
Run Code Online (Sandbox Code Playgroud)

SDoc 看起来很有趣

$ grep "data SDoc" -r . --exclude-dir=testsuite
./compiler/utils/Outputable.hs:data SDocContext = SDC
./compiler/utils/Outputable.hs-boot:data SDoc
Run Code Online (Sandbox Code Playgroud)

Outputable.hs包括printForUser,pprCol dflagsprintDocfrom 一起使用Pretty.printDoc被定义为

printDoc :: Mode -> Int -> Handle -> Doc -> IO ()
-- printDoc adds a newline to the end
printDoc mode cols hdl doc = printDoc_ mode cols hdl (doc $$ text "")
Run Code Online (Sandbox Code Playgroud)

并且pprCol定义在compiler/main/DynFlags.hs,它对应于-dppr-cols.你可以grep通过GHC :).