Spec-Zone.ru › Julia 1.11

The Julia REPL

Julia поставляется с полным интерактивным командным интерпретатором REPL (чтение-вычисление-печать-цикл), встроенным в исполняемый файл julia. Помимо быстрой и легкой оценки операторов Julia, он обладает поисковой историей, автодополнением, множеством полезных сочетаний клавиш и специализированными режимами помощи и оболочки. REPL можно запустить, просто вызвав julia без аргументов или дважды щелкнув по исполняемому файлу:

$ julia

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.11.2 (2024-12-01)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |


julia>

Чтобы выйти из интерактивной сессии, введите ^D – клавишу управления вместе с клавишей d на пустой строке – или введите exit(), после чего нажмите клавишу возврата или ввода. REPL приветствует вас баннером и julia> приглашением.

Разные режимы приглашения

Режим Julian

REPL имеет пять основных режимов работы. Первый и наиболее распространенный — это режим Julian. Он является режимом по умолчанию; каждая новая строка изначально начинается с julia>. Именно здесь вы можете вводить выражения Julia. Нажатие клавиш возврата или ввода после ввода полного выражения приведет к его оценке и отображению результата последнего выражения.

julia> string(1 + 2)
"3"

Существует ряд полезных функций, уникальных для интерактивной работы. Помимо отображения результата, REPL также связывает результат с переменной ans. Завершающая точка с запятой в строке может использоваться как флаг для подавления отображения результата.

julia> string(3 * 4);

julia> ans
"12"

В режиме Julia REPL поддерживает так называемое вставку приглашений. Это активируется при вставке текста, начинающегося с julia> в REPL. В этом случае анализируются только выражения, начинающиеся с julia> (а также другие приглашения режима REPL: shell>, help?>, pkg> ), а другие удаляются. Это позволяет вставить фрагмент текста, скопированный из сессии 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

Режим Pkg

Режим менеджера пакетов принимает специализированные команды для загрузки и обновления пакетов. Он вызывается нажатием клавиши ] в приглашении Julian REPL и выходит нажатием клавиш CTRL-C или Backspace в начале строки. Приглашение для этого режима — pkg>. Он поддерживает собственный режим помощи, который вызывается нажатием клавиши ? в начале строки приглашения pkg> . Режим менеджера пакетов документирован в руководстве Pkg, доступном по адресу https://julialang.github.io/Pkg.jl/v1/.

Режимы поиска

Во всех вышеперечисленных режимах исполненные строки сохраняются в файле истории, по которому можно производить поиск. Для запуска инкрементного поиска в предыдущей истории введите ^R – клавишу управления вместе с клавишей 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 или Option вместе с нажатой клавишей для отправки клавиши мета (или могут быть настроены для этого), или нажав Esc, а затем клавишу.

Сочетание клавиш Описание
Управление программой
^D Выход (если буфер пуст)
^C Прервать или отменить
^L Очистить консоль
Возврат/Ввод, ^J Новая строка, выполнение, если она завершена
meta-Возврат/Ввод Вставить новую строку без выполнения
? или ; Открыть справку или режим командной строки (в начале строки)
^R, ^S Инкрементальный поиск по истории, как описано выше
Движение курсора
Стрелка вправо, ^F Переместить вправо на один символ
Стрелка влево, ^B Переместить влево на один символ
ctrl-Вправо, meta-F Переместить вправо на одно слово
ctrl-Влево, meta-B Переместить влево на одно слово
Начало, ^A Переместиться к началу строки
Конец, ^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. Ключи этого словаря могут быть символами или строками. Ключ '*' относится к стандартному действию. Сочетания клавиш «Управление» плюс символ x указаны как "^x". «Meta» плюс x можно записать как "\\M-x" или "\ex", а «Управление» плюс 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 для получения доступных действий при вводе с клавиатуры.

Автодополнение по вводу

В режимах REPL Julia, pkg и help можно ввести первые несколько символов функции или типа, а затем нажать клавишу Tab, чтобы получить список всех совпадений:

julia> x[TAB]
julia> xor

В некоторых случаях автодополнение заполняет только часть имени до следующей неоднозначности:

julia> mapf[TAB]
julia> mapfold

Если вы нажмёте Tab ещё раз, то получите список возможных завершений:

julia> mapfold[TAB]
mapfoldl mapfoldr

Когда доступен единственный результат автодополнения в конце строки ввода и введено 2 или более символов, подсказка автодополнения отобразится светлее. Это можно отключить с помощью Base.active_repl.options.hint_tab_completes = false.

Подсказка автодополнения по вводу была добавлена в Julia 1.11

Как и другие компоненты 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> α="α"

Полный список автодополнения можно найти в разделе «Ввод 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/

Ключи словарей также можно автозаполнять:

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

Автодополнение также может помочь в автозаполнении полей:

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

Автодополнение полей вывода функций использует вывод типа, и может предлагать поля только в том случае, если функция является стабильной по типу.

Автодополнение может помочь в исследовании доступных методов, соответствующих входным аргументам:

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, когда курсор находится на имени модуля (Esc-m на macOS). Нажатие сочетания клавиш на пустом приглашении переключает контекст между ранее активным модулем, не являющимся Main, и Main. Активный модуль отображается в приглашении (если это не Main):

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> <Alt-m> # going back to Main via keybinding

julia>

julia> <Alt-m> # going back to previously-active Core via keybinding

(Core) 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

Нумерованный пригласительный знак

Можно получить интерфейс, похожий на REPL IPython и 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 — символ, печатаемый для обозначения варианта, который будет выбран нажатием «Ввод». Значения по умолчанию — '>' или '→', в зависимости от 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–2024 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.11/stdlib/REPL/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API