Spec-Zone.ru › Julia 1.10

The Julia REPL

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

$ julia

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


julia>

Чтобы выйти из интерактивной сессии, введите ^D – клавишу управления вместе с клавишей 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: 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 Скопировать текущую область в буфер обмена (kill ring)
meta-W Удалить текущую область, помещая текст в kill ring
^U Удалить до начала строки, помещая текст в kill ring
^K Удалить до конца строки, помещая текст в kill ring
^Y Вставить текст из kill ring
meta-y Заменить ранее вставленный текст более ранней записью из kill ring
^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. Ключи этого словаря могут быть символами или строками. Ключ '*' относится к стандартному действию. Сочетания клавиш с Ctrl плюс символом x обозначены "^x". Сочетания с Meta плюс x могут быть записаны как "\\M-x" или "\ex", а сочетания с Ctrl плюс 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 — Джулии и справки — вы можете ввести первые несколько символов функции или типа, а затем нажать клавишу 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> α="α"

Полный список автодополнений можно найти в разделе «Ввод Unicode» руководства Ввод 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 (курсор должен находиться на имени модуля). Активный модуль отображается в приглашении:

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–2024 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.10/stdlib/REPL/

Spec-Zone.ru

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