Let’s say I want to clear my terminal programmatically, i.e. not with Ctrl+l, but by running Julia code. I can do the following:
import REPL
julia> t = REPL.Terminals.TTYTerminal(string(), stdin, stdout, stderr)
REPL.Terminals.clear(t); # ; to supress some integer return value
Also,
julia> REPL.Terminals.TTYTerminal <: REPL.Terminals.UnixTerminal
true
, which makes me wonder - would this not work on windows?
My question is: Are there no simpler ways to get a handle to the terminal, the one I bind to t
, than to construct a TTYTerminal
, which I don’t even know what is? I imagine a function like REPL.current_repl()
, or something to that effect. It is possible this exists, because there is a lot of undocumented stuff going on inside the REPL module.
1 Like
A solution is to define something like the following
import REPL
function current_terminal()
if Sys.isunix()
return REPL.Terminals.TTYTerminal("TerminalType (what should go here?)", stdin, stdout, stderr)
#elseif Sys.isapple()
# Please help
#elseif Sys.iswindows()
else
error("`current_terminal` is not implemented for your operating system (=$(Base.BinaryPlatforms.os())).")
end
end
Would a function like this (with better messages and more platform support) be welcome into the REPL stdlib? I for one would love to have it, and it would also make it simpler to add docstrings to show usage of e.g. the family of functions starting with REPL.Terminals.cmove
, which I would like to take a crack at documenting.
The function name is akin to current_figure
and current_axis
, inspired by Makie. Naming suggestions are also welcome.
I am also quite unsure about non-unix systems, because of the type tree below:
AbstractTerminal only has TextTerminal as subtype, which only has UnixTerminal as subtype. What about other operating systems?
I just discovered, by unrelatedly digging into the internals of RemoteREPL.jl
, that there is a variable Base.active_repl
, which almost is what I want. Specifically, Base.active_repl
is a subtype of REPL.AbstractREPL
, while I need a subtype of REPL.Terminals.AbstractTerminal
. Fortunately, Base.activeREPL
has a field t
, which fits the bill:
julia> Base.active_repl.t isa REPL.Terminals.AbstractTerminal
true
So to clear the terminal, one can use
REPL.Terminals.clear(Base.active_repl.t);
, where the semi-colon supresses the 7 returned from write
.
2 Likes