# \[ANN\] TerminalPager.jl: REPL inline help added

**URL:** https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131
**Category:** Package Announcements
**Created:** [October 14, 2025, 7:25am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131 "2025-10-14T07:25:59Z")
**Posts on this page:** 17
**Page:** 3

<div class="post-metadata">

### Author: ![matthias314](https://avatars.discourse-cdn.com/v4/letter/m/a88e4f/32.png) [@matthias314](https://discourse.julialang.org/u/matthias314)
#### Post date: [October 24, 2025, 9:29pm UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/41 "2025-10-24T21:29:01Z")

</div>

> [@PatrickHaecker](#):
>
> only the third method seems plausible after the comma has been entered

I think that both displayed methods are valid. Similar to tuples, there can be a trailing comma after a non-empty argument list:

```julia-auto
julia> abs(-1,)
1

```

---

<div class="post-metadata">

### Author: ![PatrickHaecker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/patrickhaecker/32/222891_2.png) [@PatrickHaecker](https://discourse.julialang.org/u/PatrickHaecker)
#### Post date: [October 25, 2025, 4:50am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/42 "2025-10-25T04:50:57Z")

</div>

> [@matthias314](#):
>
> Similar to tuples, there can be a trailing comma after a non-empty argument list

Thanks, I didn’t know this. Hmm, I wonder whether this is a feature or an anti-feature. I understand why we have it for tuples and arrays as you might have your elements in separate lines and just want to add another line without caring whether it is the last line.  
However, for callables, this only seem to make sense for varargs, which are the exception and not the norm, as otherwise you hardly add or remove some arguments.

Does anyone use this syntax in the REPL and would expect help for the single-argument method after writing the comma?

---

<div class="post-metadata">

### Author: ![cjdoris](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cjdoris/32/213133_2.png) [@cjdoris](https://discourse.julialang.org/u/cjdoris)
#### Post date: [October 25, 2025, 7:25am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/43 "2025-10-25T07:25:56Z")

</div>

> [@PatrickHaecker](#):
>
> Does anyone use this syntax in the REPL and would expect help for the single-argument method after writing the comma?

No I think if you’ve typed `f('a',` and then press TAB it’s reasonable for help to assume you want at least 2 arguments.

---

<div class="post-metadata">

### Author: ![danielwe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/danielwe/32/35657_2.png) [@danielwe](https://discourse.julialang.org/u/danielwe)
#### Post date: [October 25, 2025, 3:28pm UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/44 "2025-10-25T15:28:13Z")

</div>

> [@PatrickHaecker](#):
>
> Hmm, I wonder whether this is a feature or an anti-feature.

Definitely a feature. You want to be able to add and remove lines from calls like this:

```julia-auto
foo(
    bar,
    baz,
)

```

Lua has the rule that you can’t have a trailing comma in function calls and it’s awful.

Besides, as the [manual says](https://docs.julialang.org/en/v1/manual/types/#Tuple-Types)

> Tuples are an abstraction of the arguments of a function – without the function itself.

so it would be weird if their syntax were incompatible.

That’s not to say anything about what the REPL help mode should do, I don’t have a strong opinion on that.

---

<div class="post-metadata">

### Author: ![PatrickHaecker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/patrickhaecker/32/222891_2.png) [@PatrickHaecker](https://discourse.julialang.org/u/PatrickHaecker)
#### Post date: [October 25, 2025, 3:35pm UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/45 "2025-10-25T15:35:10Z")

</div>

The reason that the arguments are effectively a `Tuple` and if it is supported there, it should also be supported for callables, is a strong one.

Could you provide a real-life example for `foo` where you actually use it? As adding an element changes the method, I would really only expect it to be used for Varargs methods.

---

<div class="post-metadata">

### Author: ![danielwe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/danielwe/32/35657_2.png) [@danielwe](https://discourse.julialang.org/u/danielwe)
#### Post date: [October 25, 2025, 3:42pm UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/46 "2025-10-25T15:42:44Z")

</div>

Most commonly when there are optional keyword args, which is perhaps less relevant for the help mode discussion (though keyword only-methods do exist). Also when iterating on my own code and signatures change (also less relevant for help mode).

---

<div class="post-metadata">

### Author: ![PatrickHaecker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/patrickhaecker/32/222891_2.png) [@PatrickHaecker](https://discourse.julialang.org/u/PatrickHaecker)
#### Post date: [January 21, 2026, 7:29am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/47 "2026-01-21T07:29:52Z")

</div>

> [@PatrickHaecker](#):
>
> Yes, understood, with this proposal both `<F1>` and `<alt> + <h>` (and maybe more to cover Mac users) would be extended help. We could not identify any relevant benefits in the linked issue above to provide the regular help when using a pager.

This is implemented in the newly released version 0.6.7 of TerminalPager.jl. So you will always get the extended help with `<F1>` and `<alt> + <h>`.

---

<div class="post-metadata">

### Author: ![digital\_carver](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/digital_carver/32/33818_2.png) [@digital\_carver](https://discourse.julialang.org/u/digital_carver)
#### Post date: [January 30, 2026, 1:31am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/48 "2026-01-30T01:31:16Z")

</div>

Does this have to be enabled somehow, or have some known limitations? When I do `using TerminalPager`, then type `IOContext` (for example), and press Alt-h, it does nothing (this is on Windows, on both the Terminal app and on Wezterm). Pressing `F1` for some reason types an `A` at that location.

I can open an issue if needed, just wanted to make sure I’m not misunderstanding something or running into known limitations.

---

<div class="post-metadata">

### Author: ![PatrickHaecker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/patrickhaecker/32/222891_2.png) [@PatrickHaecker](https://discourse.julialang.org/u/PatrickHaecker)
#### Post date: [January 30, 2026, 9:01am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/49 "2026-01-30T09:01:22Z")

</div>

It should be enabled after you loaded the package. We already had reports of working correctly on Windows, so it should work.

Is your text cursor above or at the very end of `IOContext` when you hit `<Alt>+<h>` (i.e. not after a trailing space)?

Which version of TerminalPager.jl do you currently use (`TerminalPager |> pkgversion`)?

---

<div class="post-metadata">

### Author: ![digital\_carver](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/digital_carver/32/33818_2.png) [@digital\_carver](https://discourse.julialang.org/u/digital_carver)
#### Post date: [January 30, 2026, 10:41pm UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/50 "2026-01-30T22:41:51Z")

</div>

`Alt+h` not working was indeed a vesion issue. I had an older locally checked out version of TerminalPager added, so it hadn’t been updated with the other packages. Now after adding the registry version, `Alt+h` works great.

`F1` still produces an `A` at the location (whether at the end of the text or in the middle of it), both on Wezterm and Terminal.

The `Alt-h` is a great usability improvement btw, a major step forward for the Julia REPL and makes TerminalPager.jl an even more essential part of the REPL for me. Thank you for adding it.

---

<div class="post-metadata">

### Author: ![PatrickHaecker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/patrickhaecker/32/222891_2.png) [@PatrickHaecker](https://discourse.julialang.org/u/PatrickHaecker)
#### Post date: [January 31, 2026, 5:39am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/51 "2026-01-31T05:39:04Z")

</div>

Great that you have found and fixed the main issue. I am glad that you like the functionality.

Regarding `<F1>`: Could it be that your keyboard is sending the multimedia keycode instead of the `<F1>` keycode? Could you try using `<Fn>`+`<F1>` and report what this is doing?

I think for everyone with advanced typing skills, `<alt>`+`<h>` is the superior solution (at least on a Linux and Windows keyboard), but `<F1>` is the more common shortcut and therefore more discoverable. Therefore it would still nice to understand why that one is not working, although not strictly necessary.

---

<div class="post-metadata">

### Author: ![digital\_carver](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/digital_carver/32/33818_2.png) [@digital\_carver](https://discourse.julialang.org/u/digital_carver)
#### Post date: [January 31, 2026, 8:18pm UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/52 "2026-01-31T20:18:09Z")

</div>

It’s `F1` on an external keyboard that does this (and `Fn+F1` on the main laptop keyboard also leads to `A`). It seems to be a general Julia REPL thing btw, happens without TerminalPager loaded too. Searching it up, I found an old obscure issue [Function keys i.e. F5 and F6 input random characters on windows console · Issue #28799 · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/issues/28799) so it looks like this has been this way since Julia pre-1.0 days!

There’s a lot going on in [julia/stdlib/REPL/src/LineEdit.jl at master · JuliaLang/julia · GitHub](https://github.com/JuliaLang/julia/blob/master/stdlib/REPL/src/LineEdit.jl) and I’m guessing somewhere in there, some part of the input codes generated for `F1`-`F5` keys on Windows is getting gobbled up, leaving only an `A` (or `B` `C` `D` or `E`) behind - probably something unintentionally written with Linux assumptions early on.

---

<div class="post-metadata">

### Author: ![digital\_carver](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/digital_carver/32/33818_2.png) [@digital\_carver](https://discourse.julialang.org/u/digital_carver)
#### Post date: [January 31, 2026, 9:03pm UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/53 "2026-01-31T21:03:50Z")

</div>

I’ve updated the issue #28799 with a bit more detail.

Meanwhile, I’ll see if `F10` or something can be made to work on Windows as a temporary alternative until this is fixed - `F6` and above don’t have this particular issue, but I don’t know if the REPL code is still processing them incorrectly in some other way, but I’ll give it a try sometime in the next week.

---

<div class="post-metadata">

### Author: ![PatrickHaecker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/patrickhaecker/32/222891_2.png) [@PatrickHaecker](https://discourse.julialang.org/u/PatrickHaecker)
#### Post date: [February 1, 2026, 3:42am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/54 "2026-02-01T03:42:17Z")

</div>

Thanks for nailing it down to a general Julia Windows problem.  
So this is beyond what we can fix in TerminalPager.jl.

Let’s see whether someone has fun (or is being payed for) fixing the problem for a proprietary system. I assume that [`escape_defaults`](https://github.com/JuliaLang/julia/blob/78e95d2e67f2460cc48d13263f1d3709c7264c17/stdlib/REPL/src/LineEdit.jl#L2071) and [`default_keymap`](https://github.com/JuliaLang/julia/blob/78e95d2e67f2460cc48d13263f1d3709c7264c17/stdlib/REPL/src/LineEdit.jl#L2565) might be good starting points.

---

<div class="post-metadata">

### Author: ![digital\_carver](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/digital_carver/32/33818_2.png) [@digital\_carver](https://discourse.julialang.org/u/digital_carver)
#### Post date: [February 6, 2026, 12:52pm UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/55 "2026-02-06T12:52:41Z")

</div>

I updated the [issue thread](https://github.com/JuliaLang/julia/issues/28799#issuecomment-3854639604) on this, but basically it looks like this was fixed a few months ago (possibly inadvertently, while fixing pasting) and will work fine in the 1.13 Julia release.

Meanwhile, for 1.12, LTS, etc., I have this in my startup.jl to make `F10` work like `F1` was supposed to (since the original issue only affects `F1`-`F5` keys, not the rest of them):

> **startup.jl**
>
> ```julia-auto
> module Startup
> 
> # Configure F10 as pager-help key since F1 doesn't work on Windows on Julia 1.12 or lower
> if isinteractive()
> F10_MAPPED::Bool = false
> # This section of the code is largely from BasicAutoloads.jl
> is_repl_ready() = isdefined(Base, :active_repl_backend) && isdefined(Base.active_repl_backend, :ast_transforms)
> function register_ast_transform_when_ready()
> iter = 0
> while !is_repl_ready() && iter < 120
> iter += 1
> sleep(0.02 * iter)
> end
> if is_repl_ready()
> push!(Base.active_repl_backend.ast_transforms, map_f10_pager)
> else
> @warn "Timed out waiting for `Base.active_repl_backend.ast_transforms` to become available. F10 for paged help will not work."
> end
> end
> 
> function map_f10_pager(ast)
> if !F10_MAPPED && isdefined(Main, :TerminalPager) && Main.TerminalPager isa Module &&
> isdefined(Main.TerminalPager, :_show_pager_extended_help)
> LE = Base.REPL_MODULE_REF[].LineEdit
> main_modes = filter(Base.active_repl.interface.modes) do m
> m isa LE.Prompt && LE.prompt_string(m) in ["julia> ", "pager> "]
> end
> for m in main_modes
> escapes = m.keymap_dict['\e']
> escapes['[']['2']['1'] = Dict{Char,Any}()
> escapes['[']['2']['1']['~'] = Main.TerminalPager._show_pager_extended_help # <F10>
> end
> global F10_MAPPED = true
> end
> return ast
> end
> 
> @async register_ast_transform_when_ready()
> end
> 
> end
> 
> ```

Kinda hacky to use `ast_transforms` for this (among other internals), but that’s the best way I could think of and it seems to work reliably.

---

<div class="post-metadata">

### Author: ![PatrickHaecker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/patrickhaecker/32/222891_2.png) [@PatrickHaecker](https://discourse.julialang.org/u/PatrickHaecker)
#### Post date: [February 9, 2026, 5:16am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/56 "2026-02-09T05:16:10Z")

</div>

Version 0.6.8 of TerminalPager.jl adds an inline `about` functionality close in spirit to the inline `help` of this Discourse topic.

After loading both About.jl and TerminalPager.jl (e.g. in your startup) and positioning your REPL text cursor on any identifier you cannot only get help with `<alt>`+`<h>`, but you get the output from `about` with `<alt>`+`<a>`. It’s both shown in a pager, so you get back to where you were after pressing `<q>`.

If, for example, you want to use a lazy iterator, you might be tempted to enter `Iterators` followed by `<alt>`+`<h>` just to be disappointed by this return

```julia
search: Iterators Base.IteratorSize numerator iterate Base.IteratorEltype Base.Generator

  Methods for working with Iterators.

```

which creates appetite for more, but can’t satisfy it.

You could have entered `Iterators.` followed by `<tab>`, but then you get

```julia
julia> Iterators.

Accumulate Base Count Cycle
Drop DropWhile Enumerate Filter
Flatten IterableStatePairs IterationCutShort PartitionIterator
ProductIterator Repeated Rest Reverse
Stateful Take TakeWhile Zip
_approx_iter_type _diff_length _flatten_iteratorsize _flatteneltype
_min_length _only _pairs_elt _pisdone
_piterate _piterate1 _prod_axes1 _prod_eltype
_prod_indices _prod_size _prod_size1 _promote_tuple_shape
_zip_any_isdone _zip_isdone _zip_iterate_all _zip_iterate_interleave
_zip_iterate_some _zip_lengths_finite_equal _zip_min_length accumulate
and_iteratoreltype and_iteratorsize approx_iter_type convert
countfrom cycle doiterate drop
drop_iteratorsize dropwhile enumerate filter
flatmap flatten flatten_iteratorsize flatten_length
map only partition partition_iteratorsize
peel prod_iteratorsize product repeated
reset! rest rest_iteratorsize reverse
take take_iteratorsize takewhile zip
zip_iteratoreltype zip_iteratorsize

```

which

- is hard to grasp due to the amount of information
- contains a lot of internal helper functions which should rarely be useful to the user
- does not show what is public API
- will typically scroll at least parts or your previous session out of view.

I think it’s better to enter `Iterators` followed by `<alt>`+`<a>` to get this:

```julia
Module Base.Iterators

Re-exports 21 names (from Base):
• Iterators • drop • flatmap • peel • reverse • Stateful
• accumulate • dropwhile • flatten • product • take     
• countfrom • enumerate • map • repeated • takewhile
• cycle • filter • partition • rest • zip

```

This does not even do it justice, as in the REPL it will be nicely formatted and colored.

You can, of course, use it on all the other things About.jl supports, which is basically everything in Julia.

Technically, I implemented it as a package extension for About.jl inside of TerminalPager.jl using a bit of glue code to connect the functionality of both.

Thanks to @tecosaur and to @Ronis_BR for creating great packages with About.jl and TerminalPager.jl, respectively, doing the majority of the work!

---

<div class="post-metadata">

### Author: ![Ronis\_BR](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ronis_br/32/50999_2.png) [@Ronis\_BR](https://discourse.julialang.org/u/Ronis_BR)
#### Post date: [February 9, 2026, 8:27am UTC](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131/57 "2026-02-09T08:27:48Z")

</div>

Thank you for the amazing work @PatrickHaecker ! TerminalPager.jl is way more useful now after your contributions!

[Previous page](https://discourse.julialang.org/t/ann-terminalpager-jl-repl-inline-help-added/133131.md?page=2)
