Интерактивная оболочка Julia (REPL)
Julia поставляется с полнофункциональной интерактивной командной строкой REPL (read-eval-print loop), встроенной в исполняемый файл julia. Помимо возможности быстро и легко вычислять выражения Julia, она предоставляет возможность поиска в истории команд, автодополнения, множество полезных сочетаний клавиш, а также режимы помощи и командной строки. REPL можно запустить, просто вызвав julia без аргументов или дважды щелкнув по исполняемому файлу:
$ julia
_
_ _ _(_)_ | Documentation: https://docs.julialang.org
(_) | (_) (_) |
_ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 1.9.2 (2023-07-05)
_/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release
|__/ |
julia>
Чтобы выйти из интерактивной сессии, введите ^D – клавишу Control вместе с клавишей d на пустой строке – или введите exit() и нажмите клавишу Ввод. REPL приветствует вас баннером и приглашением julia>.
Разные режимы приглашения
Режим Julia
REPL имеет пять основных режимов работы. Первый и наиболее распространённый — это режим приглашения Julia. Это режим по умолчанию; каждая новая строка первоначально начинается с julia>. Именно здесь вы можете вводить выражения Julia. Нажатие клавиши Ввод после ввода полного выражения приведет к его оценке и отображению результата последнего выражения.
julia> string(1 + 2) "3"
Существует ряд полезных функций, уникальных для интерактивной работы. Помимо отображения результата, REPL также связывает результат с переменной ans. Конец строки с символом точки с запятой можно использовать в качестве флага для подавления отображения результата.
julia> string(3 * 4); julia> ans "12"
В режиме Julia REPL поддерживает так называемое вставку приглашений. Это активируется при вставке текста, начинающегося с julia> в REPL. В этом случае будут обработаны только выражения, начинающиеся с julia>, другие будут удалены. Это позволяет вставлять куски кода, скопированные из сессии REPL, не удаляя приглашения и выводы. Эта функция включена по умолчанию, но может быть отключена или включена по желанию с помощью REPL.enable_promptpaste(::Bool). Если она включена, вы можете попробовать её, вставив блок кода выше этого абзаца непосредственно в REPL. Эта функция не работает в стандартной командной строке Windows из-за её ограничений при обнаружении вставки.
Объекты выводятся в REPL с помощью функции show со специфическим IOContext. В частности, атрибут :limit устанавливается в значение true. Другие атрибуты могут получать в определённых show методах значение по умолчанию, если оно не задано, как :compact. В качестве экспериментальной функции можно указать атрибуты, используемые REPL, через словарь Base.active_repl.options.iocontext (сопоставляющий значения с атрибутами). Например:
julia> rand(2, 2)
2×2 Array{Float64,2}:
0.8833 0.329197
0.719708 0.59114
julia> show(IOContext(stdout, :compact => false), "text/plain", rand(2, 2))
0.43540323669187075 0.15759787870609387
0.2540832269192739 0.4597637838786053
julia> Base.active_repl.options.iocontext[:compact] = false;
julia> rand(2, 2)
2×2 Array{Float64,2}:
0.2083967319174056 0.13330606013126012
0.6244375177790158 0.9777957560761545
Для автоматической настройки значений этого словаря во время запуска можно использовать функцию atreplinit в файле ~/.julia/config/startup.jl, например:
atreplinit() do repl
repl.options.iocontext[:compact] = false
end
Режим помощи
Когда курсор находится в начале строки, режим приглашения можно изменить на режим помощи, набрав ?. Julia попытается отобразить справку или документацию для всего, что введено в режиме помощи:
julia> ? # upon typing ?, the prompt changes (in place) to: help?> help?> string search: string String Cstring Cwstring RevString randstring bytestring SubString string(xs...) Create a string from any values using the print function.
Также можно запросить макросы, типы и переменные:
help?> @time @time A macro to execute an expression, printing the time it took to execute, the number of allocations, and the total number of bytes its execution caused to be allocated, before returning the value of the expression. See also @timev, @timed, @elapsed, and @allocated. help?> Int32 search: Int32 UInt32 Int32 <: Signed 32-bit signed integer type.
Строковый или регулярный литерал ищет все строковые описания, используя apropos:
help?> "aprop" REPL.stripmd Base.Docs.apropos help?> r"ap..p" Base.:∘ Base.shell_escape_posixly Distributed.CachingPool REPL.stripmd Base.Docs.apropos
Ещё одной функцией режима помощи является возможность доступа к расширенным строковым описаниям. Это можно сделать, набрав что-то вроде ??Print вместо ?Print, что отобразит раздел # Extended help из документации исходного кода.
Режим помощи можно покинуть, нажав Backspace в начале строки.
Режим командной строки
Так же, как режим помощи полезен для быстрого доступа к документации, другой распространённой задачей является использование системной оболочки для выполнения системных команд. Так же, как ? переходит в режим помощи, когда находится в начале строки, точка с запятой (;) переведёт в режим командной строки. Выйти из него можно, нажав Backspace в начале строки.
julia> ; # upon typing ;, the prompt changes (in place) to: shell> shell> echo hello hello
Для пользователей Windows, режим командной строки Julia не предоставляет доступ к командам оболочки Windows. Поэтому данное действие завершится ошибкой:
julia> ; # upon typing ;, the prompt changes (in place) to: shell> shell> dir ERROR: IOError: could not spawn `dir`: no such file or directory (ENOENT) Stacktrace! .......
Однако, вы можете получить доступ к PowerShell следующим образом:
julia> ; # upon typing ;, the prompt changes (in place) to: shell> shell> powershell Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS C:\Users\elm>
... и к cmd.exe так (см. команду dir):
julia> ; # upon typing ;, the prompt changes (in place) to: shell> shell> cmd Microsoft Windows [version 10.0.17763.973] (c) 2018 Microsoft Corporation. All rights reserved. C:\Users\elm>dir Volume in drive C has no label Volume Serial Number is 1643-0CD7 Directory of C:\Users\elm 29/01/2020 22:15 <DIR> . 29/01/2020 22:15 <DIR> .. 02/02/2020 08:06 <DIR> .atom
Режим менеджера пакетов
Режим менеджера пакетов принимает специализированные команды для загрузки и обновления пакетов. Он вызывается нажатием клавиши ] в режиме приглашения Julia и выходит из него нажатием Ctrl+C или клавиши Backspace в начале строки. Приглашение для этого режима pkg>. Он поддерживает собственный режим помощи, который вызывается нажатием клавиши ? в начале строки режима pkg> Приглашения. Режим менеджера пакетов документирован в руководстве Pkg, доступном по адресу https://julialang.github.io/Pkg.jl/v1/.
Режимы поиска
Во всех вышеперечисленных режимах исполненные строки сохраняются в файле истории, по которому можно искать. Для инициирования инкрементного поиска по предыдущей истории введите ^R – клавишу Control вместе с клавишей r . Приглашение изменится на (reverse-i-search)`':, и по мере ввода запроса поиск будет отображаться в кавычках. Последний результат, соответствующий запросу, будет динамически обновляться справа от двоеточия по мере ввода. Чтобы найти более ранний результат, соответствующий тому же запросу, просто введите ^R ещё раз.
Так же как ^R — это обратный поиск, ^S — это прямой поиск, с приглашением (i-search)`':. Два режима можно использовать вместе, чтобы переходить к предыдущим или последующим соответствующим результатам соответственно.
Все выполненные команды в Julia REPL регистрируются в ~/.julia/logs/repl_history.jl вместе со временем выполнения и текущим режимом REPL. Запросы в режиме поиска обращаются к этому файлу журнала, чтобы найти команды, которые вы ранее выполняли. Это можно отключить при запуске, передав флаг --history-file=no в Julia.
Сочетания клавиш
Julia REPL широко использует сочетания клавиш. Некоторые сочетания клавиш со знаками управления были уже введены выше (^D для выхода, ^R и ^S для поиска), но их намного больше. Помимо клавиш управления, также есть сочетания клавиш с клавишей Alt. Они могут меняться в зависимости от платформы, но большинство терминалов по умолчанию используют клавишу Alt или Option вместе с другой клавишей для отправки клавиши Alt (или могут быть настроены для этого), или нажав Esc, а затем клавишу.
| Сочетание клавиш | Описание |
|---|---|
| Управление программой | |
^D |
Выход (если буфер пуст) |
^C |
Прерывание или отмена |
^L |
Очистка экрана консоли |
Возврат/Enter, ^J
|
Новая строка, выполнение, если она завершена |
| meta-Возврат/Enter | Вставка новой строки без выполнения |
? или ;
|
Вызов справки или режима командной строки (в начале строки) |
^R, ^S
|
Инкрементальный поиск в истории, описанный выше |
| Движение курсора | |
Стрелка вправо, ^F
|
Переместить вправо на один символ |
Стрелка влево, ^B
|
Переместить влево на один символ |
ctrl-Вправо, meta-F
|
Переместить вправо на одно слово |
ctrl-Влево, meta-B
|
Переместить влево на одно слово |
Home, ^A
|
Перейти к началу строки |
End, ^E
|
Перейти к концу строки |
Стрелка вверх, ^P
|
Переместиться на строку вверх (или изменить на предыдущую запись истории, соответствующую тексту перед курсором) |
Стрелка вниз, ^N
|
Переместиться на строку вниз (или изменить на следующую запись истории, соответствующую тексту перед курсором) |
| Shift-Клавиша со стрелкой | Переместить курсор в соответствии с направлением клавиши со стрелкой, активируя область ("выделение сдвигом") |
Page-Up, meta-P
|
Перейти к предыдущей записи истории |
Page-Down, meta-N
|
Перейти к следующей записи истории |
meta-< |
Перейти к первой записи истории (текущего сеанса, если она находится до текущей позиции в истории) |
meta-> |
Перейти к последней записи истории |
^-Space |
Установить "метку" в области редактирования (и деактивировать область, если она активна) |
^-Space ^-Space |
Установить "метку" в области редактирования и сделать область "активной", т.е. выделенной |
^G |
Деактивировать область (т.е. сделать её не выделенной) |
^X^X |
Поменять текущую позицию с меткой |
| Редактирование | |
Backspace, ^H
|
Удалить предыдущий символ или всю область, если она активна |
Delete, ^D
|
Удалить следующий символ (если в буфере есть текст) |
| meta-Backspace | Удалить предыдущее слово |
meta-d |
Удалить следующее слово |
^W |
Удалить предыдущий текст до ближайшего пробела |
meta-w |
Скопировать текущую область в буфер обмена |
meta-W |
Удалить текущую область, поместив текст в буфер обмена |
^U |
Удалить до начала строки, поместив текст в буфер обмена |
^K |
Удалить до конца строки, поместив текст в буфер обмена |
^Y |
Вставить текст из буфера обмена |
meta-y |
Заменить ранее вставленный текст более ранней записью из буфера обмена |
^T |
Переставить символы вокруг курсора |
meta-Up arrow |
Переставить текущую строку со строкой выше |
meta-Down arrow |
Переставить текущую строку со строкой ниже |
meta-u |
Преобразовать следующее слово в верхний регистр |
meta-c |
Преобразовать следующее слово в заголовок |
meta-l |
Преобразовать следующее слово в нижний регистр |
^/, ^_
|
Отменить предыдущее действие редактирования |
^Q |
Введите число в REPL и нажмите ^Q для открытия редактора в соответствующем стековом кадре или методе |
meta-Left Arrow |
Отступ текущей строки влево |
meta-Right Arrow |
Отступ текущей строки вправо |
meta-. |
Вставить последнее слово из предыдущей записи истории |
meta-e |
Редактировать текущий ввод в редакторе |
Настройка сочетаний клавиш
Сочетания клавиш REPL Julia могут быть полностью настроены по предпочтениям пользователя, передав словарь в REPL.setup_interface. Ключи этого словаря могут быть символами или строками. Ключ '*' относится к стандартному действию. Сочетания клавиш Control плюс символ x указаны как "^x". Meta плюс x могут быть записаны как "\\M-x" или "\ex", а Control плюс x могут быть записаны как "\\C-x" или "^x". Значения пользовательской карты клавиш должны быть nothing (указывая, что вход должен быть проигнорирован) или функциями, принимающими сигнатуру (PromptState, AbstractREPL, Char). Функция REPL.setup_interface должна вызываться до инициализации REPL, регистрируя операцию с atreplinit . Например, чтобы привязать клавиши со стрелками вверх и вниз к перемещению по истории без поиска по префиксу, можно поместить следующий код в ~/.julia/config/startup.jl.
import REPL
import REPL.LineEdit
const mykeys = Dict{Any,Any}(
# Up Arrow
"\e[A" => (s,o...)->(LineEdit.edit_move_up(s) || LineEdit.history_prev(s, LineEdit.mode(s).hist)),
# Down Arrow
"\e[B" => (s,o...)->(LineEdit.edit_move_down(s) || LineEdit.history_next(s, LineEdit.mode(s).hist))
)
function customize_keys(repl)
repl.interface = REPL.setup_interface(repl; extra_repl_keymap = mykeys)
end
atreplinit(customize_keys)
Пользователи должны обратиться к LineEdit.jl, чтобы узнать о доступных действиях при нажатии клавиш.
Автодополнение Tab
В обоих режимах REPL Julia и справки можно ввести первые несколько символов функции или типа, а затем нажать клавишу Tab, чтобы получить список всех совпадений:
julia> x[TAB] julia> xor
В некоторых случаях это дополняет только часть имени до следующей неоднозначности:
julia> mapf[TAB] julia> mapfold
Если нажать клавишу Tab еще раз, то вы получите список возможных дополнений:
julia> mapfold[TAB] mapfoldl mapfoldr
Как и другие компоненты REPL, поиск чувствителен к регистру:
julia> stri[TAB] stride strides string strip julia> Stri[TAB] StridedArray StridedMatrix StridedVecOrMat StridedVector String
Клавиша Tab также может использоваться для замены математических символов LaTeX их эквивалентами Unicode и получения списка совпадений LaTeX:
julia> \pi[TAB]
julia> π
π = 3.1415926535897...
julia> e\_1[TAB] = [1,0]
julia> e₁ = [1,0]
2-element Array{Int64,1}:
1
0
julia> e\^1[TAB] = [1 0]
julia> e¹ = [1 0]
1×2 Array{Int64,2}:
1 0
julia> \sqrt[TAB]2 # √ is equivalent to the sqrt function
julia> √2
1.4142135623730951
julia> \hbar[TAB](h) = h / 2\pi[TAB]
julia> ħ(h) = h / 2π
ħ (generic function with 1 method)
julia> \h[TAB]
\hat \hermitconjmatrix \hkswarow \hrectangle
\hatapprox \hexagon \hookleftarrow \hrectangleblack
\hbar \hexagonblack \hookrightarrow \hslash
\heartsuit \hksearow \house \hspace
julia> α="\alpha[TAB]" # LaTeX completion also works in strings
julia> α="α"
Полный список автодополнений Tab можно найти в разделе «Ввод Unicode» руководства.
Автодополнение путей работает для строк и режима командной строки Julia:
julia> path="/[TAB]" .dockerenv .juliabox/ boot/ etc/ lib/ media/ opt/ root/ sbin/ sys/ usr/ .dockerinit bin/ dev/ home/ lib64/ mnt/ proc/ run/ srv/ tmp/ var/ shell> /[TAB] .dockerenv .juliabox/ boot/ etc/ lib/ media/ opt/ root/ sbin/ sys/ usr/ .dockerinit bin/ dev/ home/ lib64/ mnt/ proc/ run/ srv/ tmp/ var/
Ключи словарей также могут быть дополнены с помощью Tab:
julia> foo = Dict("qwer1"=>1, "qwer2"=>2, "asdf"=>3)
Dict{String,Int64} with 3 entries:
"qwer2" => 2
"asdf" => 3
"qwer1" => 1
julia> foo["q[TAB]
"qwer1" "qwer2"
julia> foo["qwer
Автодополнение Tab также может помочь при дополнении полей:
julia> x = 3 + 4im; julia> x.[TAB][TAB] im re julia> import UUIDs julia> UUIDs.uuid[TAB][TAB] uuid1 uuid4 uuid5 uuid_version
Поля для вывода из функций также могут быть дополнены:
julia> split("","")[1].[TAB]
lastindex offset string
Автодополнение полей для вывода из функций использует выведение типов и может предлагать поля только если функция является типом стабильной.
Автодополнение Tab может помочь при исследовании доступных методов, соответствующих входным аргументам:
julia> max([TAB] # All methods are displayed, not shown here due to size of the list
julia> max([1, 2], [TAB] # All methods where `Vector{Int}` matches as first argument
max(x, y) in Base at operators.jl:215
max(a, b, c, xs...) in Base at operators.jl:281
julia> max([1, 2], max(1, 2), [TAB] # All methods matching the arguments.
max(x, y) in Base at operators.jl:215
max(a, b, c, xs...) in Base at operators.jl:281
Ключевые слова также отображаются в предлагаемых методах после ;, как показано ниже, где limit и keepempty являются ключевыми аргументами:
julia> split("1 1 1", [TAB]
split(str::AbstractString; limit, keepempty) in Base at strings/util.jl:302
split(str::T, splitter; limit, keepempty) where T<:AbstractString in Base at strings/util.jl:277
Автодополнение методов использует выведение типов и, следовательно, может увидеть, соответствуют ли аргументы, даже если аргументы являются результатом вызова функций. Функция должна быть типостабильной, чтобы автодополнение могло исключить несовпадающие методы.
Если вы хотите узнать, какие методы можно использовать с конкретными типами аргументов, используйте ? в качестве имени функции. Это показывает пример поиска функций в InteractiveUtils, которые принимают одну строку:
julia> InteractiveUtils.?("somefile")[TAB]
edit(path::AbstractString) in InteractiveUtils at InteractiveUtils/src/editless.jl:197
less(file::AbstractString) in InteractiveUtils at InteractiveUtils/src/editless.jl:266
Это перечисляет методы в модуле InteractiveUtils, которые можно вызывать для строки. По умолчанию это исключает методы, где все аргументы типизированы как Any, но вы можете увидеть их тоже, удерживая SHIFT-TAB вместо TAB:
julia> InteractiveUtils.?("somefile")[SHIFT-TAB]
apropos(string) in REPL at REPL/src/docview.jl:796
clipboard(x) in InteractiveUtils at InteractiveUtils/src/clipboard.jl:64
code_llvm(f) in InteractiveUtils at InteractiveUtils/src/codeview.jl:221
code_native(f) in InteractiveUtils at InteractiveUtils/src/codeview.jl:243
edit(path::AbstractString) in InteractiveUtils at InteractiveUtils/src/editless.jl:197
edit(f) in InteractiveUtils at InteractiveUtils/src/editless.jl:225
eval(x) in InteractiveUtils at InteractiveUtils/src/InteractiveUtils.jl:3
include(x) in InteractiveUtils at InteractiveUtils/src/InteractiveUtils.jl:3
less(file::AbstractString) in InteractiveUtils at InteractiveUtils/src/editless.jl:266
less(f) in InteractiveUtils at InteractiveUtils/src/editless.jl:274
report_bug(kind) in InteractiveUtils at InteractiveUtils/src/InteractiveUtils.jl:391
separate_kwargs(args...; kwargs...) in InteractiveUtils at InteractiveUtils/src/macros.jl:7
Вы также можете использовать ?("somefile")[TAB] и искать по всем модулям, но списки методов могут быть длинными.
Опуская закрывающую скобку, вы можете включить функции, которые могут потребовать дополнительных аргументов:
julia> using Mmap
help?> Mmap.?("file",[TAB]
Mmap.Anonymous(name::String, readonly::Bool, create::Bool) in Mmap at Mmap/src/Mmap.jl:16
mmap(file::AbstractString) in Mmap at Mmap/src/Mmap.jl:245
mmap(file::AbstractString, ::Type{T}) where T<:Array in Mmap at Mmap/src/Mmap.jl:245
mmap(file::AbstractString, ::Type{T}, dims::Tuple{Vararg{Integer, N}}) where {T<:Array, N} in Mmap at Mmap/src/Mmap.jl:245
mmap(file::AbstractString, ::Type{T}, dims::Tuple{Vararg{Integer, N}}, offset::Integer; grow, shared) where {T<:Array, N} in Mmap at Mmap/src/Mmap.jl:245
mmap(file::AbstractString, ::Type{T}, len::Integer) where T<:Array in Mmap at Mmap/src/Mmap.jl:251
mmap(file::AbstractString, ::Type{T}, len::Integer, offset::Integer; grow, shared) where T<:Array in Mmap at Mmap/src/Mmap.jl:251
mmap(file::AbstractString, ::Type{T}, dims::Tuple{Vararg{Integer, N}}) where {T<:BitArray, N} in Mmap at Mmap/src/Mmap.jl:316
mmap(file::AbstractString, ::Type{T}, dims::Tuple{Vararg{Integer, N}}, offset::Integer; grow, shared) where {T<:BitArray, N} in Mmap at Mmap/src/Mmap.jl:316
mmap(file::AbstractString, ::Type{T}, len::Integer) where T<:BitArray in Mmap at Mmap/src/Mmap.jl:322
mmap(file::AbstractString, ::Type{T}, len::Integer, offset::Integer; grow, shared) where T<:BitArray in Mmap at Mmap/src/Mmap.jl:322
Настройка цветов
Цвета, используемые Julia и REPL, также могут быть настроены. Чтобы изменить цвет подсказки Julia, добавьте что-то подобное в ваш файл ~/.julia/config/startup.jl, который должен находиться в домашнем каталоге:
function customize_colors(repl)
repl.prompt_color = Base.text_colors[:cyan]
end
atreplinit(customize_colors)
Доступные ключи цветов можно увидеть, набрав Base.text_colors в режиме справки REPL. Кроме того, целые числа от 0 до 255 могут использоваться в качестве ключей цветов для терминалов с поддержкой 256 цветов.
Вы также можете изменить цвета подсказок справки и командной строки, а также текст ввода и ответа, установив соответствующее поле repl в функции customize_colors выше (соответственно, help_color, shell_color, input_color, и answer_color). Для последних двух убедитесь, что поле envcolors также установлено в false.
Также возможно применение полужирного шрифта, используя Base.text_colors[:bold] в качестве цвета. Например, чтобы выводить ответы в полужирном формате, можно использовать следующее как ~/.julia/config/startup.jl:
function customize_colors(repl)
repl.envcolors = false
repl.answer_color = Base.text_colors[:bold]
end
atreplinit(customize_colors)
Вы также можете настроить цвет, используемый для отображения предупреждений и информационных сообщений, установив соответствующие переменные окружения. Например, чтобы отобразить ошибки, предупреждения и информационные сообщения соответственно в пурпурном, желтом и сине-зелёном цветах, добавьте следующее в ваш файл ~/.julia/config/startup.jl:
ENV["JULIA_ERROR_COLOR"] = :magenta ENV["JULIA_WARN_COLOR"] = :yellow ENV["JULIA_INFO_COLOR"] = :cyan
Изменение контекстного модуля, активного в REPL
При вводе выражений в REPL они по умолчанию вычисляются в модуле Main;
julia> @__MODULE__ Main
Изменить этот контекстный модуль можно с помощью функции REPL.activate(m), где m является Module, или набрав имя модуля в REPL и нажав сочетание клавиш Alt-m (курсор должен быть на имени модуля). Активный модуль отображается в подсказке:
julia> using REPL julia> REPL.activate(Base) (Base) julia> @__MODULE__ Base (Base) julia> using REPL # Need to load REPL into Base module to use it (Base) julia> REPL.activate(Main) julia> julia> Core<Alt-m> # using the keybinding to change module (Core) julia> (Core) julia> Main<Alt-m> # going back to Main via keybinding julia>
Функции, принимающие необязательный аргумент модуля, часто используют контекстный модуль REPL по умолчанию. Например, вызов varinfo() покажет переменные текущего активного модуля:
julia> module CustomMod
export var, f
var = 1
f(x) = x^2
end;
julia> REPL.activate(CustomMod)
(Main.CustomMod) julia> varinfo()
name size summary
––––––––– ––––––– ––––––––––––––––––––––––––––––––––
CustomMod Module
f 0 bytes f (generic function with 1 method)
var 8 bytes Int64
Нумерованная подсказка
Возможно получить интерфейс, похожий на IPython REPL и Mathematica notebook, с нумерованными подсказками ввода и префиксами вывода. Это делается путем вызова REPL.numbered_prompt!(). Если вы хотите включить эту функцию при запуске, добавьте
atreplinit() do repl
@eval import REPL
if !isdefined(repl, :interface)
repl.interface = REPL.setup_interface(repl)
end
REPL.numbered_prompt!(repl)
end
в ваш файл startup.jl . В нумерованной подсказке переменная Out[n] (где n целое число) может использоваться для ссылки на предыдущие результаты:
In [1]: 5 + 3
Out[1]: 8
In [2]: Out[1] + 5
Out[2]: 13
In [3]: Out
Out[3]: Dict{Int64, Any} with 2 entries:
2 => 13
1 => 8
Поскольку все выводы из предыдущих вычислений REPL сохраняются в переменной Out, следует быть осторожным, если возвращаются многочисленные большие объекты в памяти, такие как массивы, так как они будут защищены от сборки мусора до тех пор, пока ссылка на них остается в Out. Если вам нужно удалить ссылки на объекты в Out, вы можете очистить всю историю, которую она хранит, с помощью empty!(Out), или очистить отдельную запись с помощью Out[n] = nothing.
TerminalMenus
TerminalMenus — это подмодуль Julia REPL, который позволяет создавать небольшие, малозаметные интерактивные меню в терминале.
Примеры
import REPL
using REPL.TerminalMenus
options = ["apple", "orange", "grape", "strawberry",
"blueberry", "peach", "lemon", "lime"]
RadioMenu
RadioMenu позволяет пользователю выбрать один вариант из списка. Функция request отображает интерактивное меню и возвращает индекс выбранного варианта. Если пользователь нажмет 'q' или ctrl-c, request вернет -1.
# `pagesize` is the number of items to be displayed at a time.
# The UI will scroll if the number of options is greater
# than the `pagesize`
menu = RadioMenu(options, pagesize=4)
# `request` displays the menu and returns the index after the
# user has selected a choice
choice = request("Choose your favorite fruit:", menu)
if choice != -1
println("Your favorite fruit is ", options[choice], "!")
else
println("Menu canceled.")
end
Вывод:
Choose your favorite fruit: ^ grape strawberry > blueberry v peach Your favorite fruit is blueberry!
MultiSelectMenu
MultiSelectMenu позволяет пользователю выбрать несколько вариантов из списка.
# here we use the default `pagesize` 10
menu = MultiSelectMenu(options)
# `request` returns a `Set` of selected indices
# if the menu us canceled (ctrl-c or q), return an empty set
choices = request("Select the fruits you like:", menu)
if length(choices) > 0
println("You like the following fruits:")
for i in choices
println(" - ", options[i])
end
else
println("Menu canceled.")
end
Вывод:
Select the fruits you like: [press: Enter=toggle, a=all, n=none, d=done, q=abort] [ ] apple > [X] orange [X] grape [ ] strawberry [ ] blueberry [X] peach [ ] lemon [ ] lime You like the following fruits: - orange - grape - peach
Настройка/Конфигурация
Подтипы ConfiguredMenu
Начиная с Julia 1.6, рекомендуемый способ настройки меню — через конструктор. Например, стандартное меню с множественным выбором
julia> menu = MultiSelectMenu(options, pagesize=5); julia> request(menu) # ASCII is used by default [press: Enter=toggle, a=all, n=none, d=done, q=abort] [ ] apple [X] orange [ ] grape > [X] strawberry v [ ] blueberry
вместо этого можно отобразить с помощью символов Unicode для выбора и навигации с помощью
julia> menu = MultiSelectMenu(options, pagesize=5, charset=:unicode); julia> request(menu) [press: Enter=toggle, a=all, n=none, d=done, q=abort] ⬚ apple ✓ orange ⬚ grape → ✓ strawberry ↓ ⬚ blueberry
Также возможна более подробная настройка:
julia> menu = MultiSelectMenu(options, pagesize=5, charset=:unicode, checked="YEP!", unchecked="NOPE", cursor='⧐'); julia> request(menu) julia> request(menu) [press: Enter=toggle, a=all, n=none, d=done, q=abort] NOPE apple YEP! orange NOPE grape ⧐ YEP! strawberry ↓ NOPE blueberry
Помимо общего параметра charset, для RadioMenu настраиваемые параметры:
-
cursor::Char='>'|'→': символ, используемый для курсора -
up_arrow::Char='^'|'↑': символ, используемый для стрелки вверх -
down_arrow::Char='v'|'↓': символ, используемый для стрелки вниз -
updown_arrow::Char='I'|'↕': символ, используемый для стрелок вверх/вниз в однострочном меню -
scroll_wrap::Bool=false: необязательно, переходить к началу/концу меню -
ctrl_c_interrupt::Bool=true: Еслиfalse, возвращать пустое значение при ^C, еслиtrueбросать исключение InterruptException() при ^C
MultiSelectMenu добавляет:
-
checked::String="[X]"|"✓": строка, используемая для выделенного пункта -
unchecked::String="[ ]"|"⬚"): строка, используемая для невыделенного пункта
Вы можете создавать собственные типы меню. Типы, которые являются производными от TerminalMenus.ConfiguredMenu, настраивают параметры меню во время создания.
Старый интерфейс
До Julia 1.6 и поддерживаемый во всех версиях Julia 1.x, вы также можете настроить меню, вызвав TerminalMenus.config().
Ссылки
REPL
Base.atreplinitФункция
atreplinit(f)
Регистрирует функцию с одним аргументом, которая вызывается перед инициализацией интерфейса REPL в интерактивных сессиях; это полезно для настройки интерфейса. Аргументом функции f является объект REPL. Эта функция должна вызываться из файла инициализации .julia/config/startup.jl.
TerminalMenus
Меню
REPL.TerminalMenus.RadioMenuТип
RadioMenu
Меню, позволяющее пользователю выбрать один пункт из списка.
Пример вывода
julia> request(RadioMenu(options, pagesize=4)) Choose your favorite fruit: ^ grape strawberry > blueberry v peach Your favorite fruit is blueberry!
REPL.TerminalMenus.MultiSelectMenuТип
MultiSelectMenu
Меню, позволяющее пользователю выбрать несколько пунктов из списка.
Пример вывода
julia> request(MultiSelectMenu(options)) Select the fruits you like: [press: Enter=toggle, a=all, n=none, d=done, q=abort] [ ] apple > [X] orange [X] grape [ ] strawberry [ ] blueberry [X] peach [ ] lemon [ ] lime You like the following fruits: - orange - grape - peach
Настройка
REPL.TerminalMenus.ConfigТип
Config(; scroll_wrap=false, ctrl_c_interrupt=true, charset=:ascii, cursor::Char, up_arrow::Char, down_arrow::Char)
Настройка поведения меню выбора с помощью ключевых аргументов:
-
scroll_wrap, еслиtrue, вызывает перемотку меню при прокрутке выше первого или ниже последнего пункта -
ctrl_c_interrupt, еслиtrue, выброситInterruptExceptionесли пользователь нажмёт Ctrl-C во время выбора меню. Еслиfalse,TerminalMenus.requestвернёт результат по умолчанию изTerminalMenus.selected. -
charsetвлияет на значения по умолчанию дляcursor,up_arrow, иdown_arrow, и может быть:asciiили:unicode -
cursor— символ, печатаемый для указания пункта, который будет выбран нажатием "Enter". Значения по умолчанию — '>' или '→', в зависимости отcharset. -
up_arrow— символ, печатаемый, когда в отображении нет первого пункта. Значения по умолчанию — '^' или '↑', в зависимости отcharset. -
down_arrow— символ, печатаемый, когда в отображении нет последнего пункта. Значения по умолчанию — 'v' или '↓', в зависимости отcharset.
Подтипы ConfiguredMenu будут автоматически печатать cursor, up_arrow, и down_arrow, ваш метод writeline не должен их печатать.
Config доступен начиная с Julia 1.6. В более старых версиях используйте глобальную переменную CONFIG.
REPL.TerminalMenus.MultiSelectConfigТип
MultiSelectConfig(; charset=:ascii, checked::String, unchecked::String, kwargs...)
Настройка поведения меню множественного выбора с помощью ключевых аргументов:
-
checked— строка, печатаемая, когда пункт выбран. Значения по умолчанию — "[X]" или "✓", в зависимости отcharset. -
unchecked— строка, печатаемая, когда пункт не выбран. Значения по умолчанию — "[ ]" или "⬚", в зависимости отcharset.
Все остальные ключевые аргументы такие же, как описано для TerminalMenus.Config. checked и unchecked не печатаются автоматически, и должны печататься вашим методом writeline.
MultiSelectConfig доступен начиная с Julia 1.6. В более старых версиях используйте глобальную переменную CONFIG.
REPL.TerminalMenus.configФункция
config( <see arguments> )
Функция для конфигурации глобальных параметров меню, использующая только ключевые слова
Аргументы
-
charset::Symbol=:na: символы интерфейса (:asciiили:unicode); переопределяется другими аргументами -
cursor::Char='>'|'→': символ для курсора -
up_arrow::Char='^'|'↑': символ для стрелки вверх -
down_arrow::Char='v'|'↓': символ для стрелки вниз -
checked::String="[X]"|"✓": строка для обозначения выделенного элемента -
unchecked::String="[ ]"|"⬚"): строка для обозначения невыделенного элемента -
scroll::Symbol=:nowrap: если:wrapперематывать курсор по краям, если :nowrapне перематывать -
supress_output::Bool=false: устаревший аргумент, используйтеsuppress_outputкак ключевой аргумент дляrequest. -
ctrl_c_interrupt::Bool=true: еслиfalse, возвращать пустое значение при нажатии ^C, еслиtrueвыбрасывать InterruptException() при нажатии ^C
Начиная с Julia 1.6, config устарела. Используйте Config или MultiSelectConfig вместо неё.
Взаимодействие с пользователем
REPL.TerminalMenus.requestФункция
request(m::AbstractMenu; cursor=1)
Отображает меню и переходит в интерактивный режим. cursor указывает номер элемента, используемого для начальной позиции курсора. cursor может быть либо Int, либо RefValue{Int}. Последний вариант полезен для наблюдения и управления положением курсора извне.
Возвращает selected(m).
Аргумент cursor требует Julia 1.6 или более поздней версии.
request([term,] msg::AbstractString, m::AbstractMenu)
Сокращение для println(msg); request(m).
Интерфейс расширения AbstractMenu
Любой подтип AbstractMenu должен быть изменяемым и содержать поля pagesize::Int и pageoffset::Int. Любой подтип также должен реализовывать следующие функции:
REPL.TerminalMenus.pickФункция
pick(m::AbstractMenu, cursor::Int)
Определяет, что происходит, когда пользователь нажимает клавишу Enter, пока меню открыто. Если возвращается true, request() завершится. cursor индексирует позицию выбора.
REPL.TerminalMenus.cancelФункция
cancel(m::AbstractMenu)
Определяет, что происходит, когда пользователь отменяет ('q' или ctrl-c) меню. request() всегда завершится после вызова этой функции.
REPL.TerminalMenus.writelineФункция
writeline(buf::IO, m::AbstractMenu, idx::Int, iscursor::Bool)
Выводит опцию с индексом idx в buf. iscursor, если true, указывает, что этот элемент находится в текущей позиции курсора (тот, который будет выбран нажатием "Enter").
Если m является ConfiguredMenu, TerminalMenus будет выводить индикатор курсора. В противном случае предполагается, что вызывающий код обрабатывает подобную печать.
writeline требует Julia 1.6 или более поздней версии.
В более старых версиях Julia это было writeLine(buf::IO, m::AbstractMenu, idx, iscursor::Bool) и предполагалось, что m не настроено. Индикаторы выбора и курсора можно получить из TerminalMenus.CONFIG.
Эта более старая функция поддерживается во всех версиях Julia 1.x, но будет удалена в Julia 2.0.
Также необходимо реализовать либо options либо numoptions:
REPL.TerminalMenus.optionsФункция
options(m::AbstractMenu)
Возвращает список строк, которые будут отображаться как опции на текущей странице.
В качестве альтернативы, реализуйте numoptions, в этом случае options не требуется.
REPL.TerminalMenus.numoptionsФункция
numoptions(m::AbstractMenu) -> Int
Возвращает количество опций в меню m. По умолчанию возвращает length(options(m)).
Эта функция требует Julia 1.6 или более поздней версии.
Если у подтипа нет поля с именем selected, необходимо также реализовать
REPL.TerminalMenus.selectedФункция
selected(m::AbstractMenu)
Возвращает информацию о выбранной пользователем опции. По умолчанию возвращает m.selected.
Следующие элементы являются необязательными, но позволяют дополнительные настройки:
REPL.TerminalMenus.headerФункция
header(m::AbstractMenu) -> String
Возвращает заголовок строки, который будет напечатан над меню. По умолчанию возвращает "".
REPL.TerminalMenus.keypressФункция
keypress(m::AbstractMenu, i::UInt32) -> Bool
Обрабатывает любое нестандартное событие нажатия клавиши. Если возвращается true, TerminalMenus.request завершится. По умолчанию возвращает false.
© 2009–2023 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.9/stdlib/REPL/