Spec-Zone.ru › Julia 1.8

Интерактивная оболочка Julia REPL

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

$ julia

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


julia>

Чтобы выйти из интерактивной сессии, введите ^D – клавишу Ctrl вместе с клавишей 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

Режим менеджера пакетов

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

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

Во всех вышеперечисленных режимах выполненные строки сохраняются в файле истории, который можно искать. Для начала инкрементального поиска по предыдущей истории введите ^R – клавишу Ctrl вместе с клавишей r . Приглашение изменится на (reverse-i-search)`':, и при наборе поискового запроса он появится в кавычках. Самый последний результат, соответствующий запросу, будет динамически обновляться справа от двоеточия по мере набора. Чтобы найти более ранний результат с тем же запросом, просто снова введите ^R.

Так же как ^R — это обратный поиск, ^S — это прямой поиск с приглашением (i-search)`':. Их можно использовать совместно для перемещения по предыдущим или последующим совпадающим результатам соответственно.

Все выполненные команды в REPL Julia регистрируются в ~/.julia/logs/repl_history.jl вместе со временем выполнения и текущим режимом REPL, в котором они были выполнены. Запросы в режиме поиска обращаются к этому файлу журнала, чтобы найти команды, которые вы ранее выполняли. Это можно отключить во время запуска, передав флаг --history-file=no в Julia.

Сочетания клавиш

REPL Julia активно использует сочетания клавиш. Некоторые сочетания с клавишами Ctrl уже были представлены выше (^D для выхода, ^R и ^S для поиска), но их гораздо больше. Помимо клавиш Ctrl, также существуют сочетания клавиш Meta. Они больше зависят от платформы, но большинство терминалов по умолчанию используют нажатую клавишу Alt или Option вместе с другой клавишей для отправки клавиши Meta (или могут быть настроены для этого), или нажатие Esc, а затем нужной клавиши.

Сочетание клавиш Описание
Управление программой
^D Выход (когда буфер пуст)
^C Прерывание или отмена
^L Очистить экран консоли
Возврат/Ввод, ^J Новая строка, выполнение, если она завершена
meta-Возврат/Ввод Вставить новую строку без выполнения
? или ; Открыть справку или режим командной строки (в начале строки)
^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 "Удалить" текущую область, помещая текст в цикл обмена
^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-. Вставить последнее слово из предыдущей записи истории

Настройка сочетаний клавиш

Сочетания клавиш 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 для выявления доступных действий при нажатии клавиш.

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

В обоих режимах REPL (Julian и Help) можно ввести первые несколько символов функции или типа, а затем нажать клавишу 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» руководства (Ввод 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

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

julia> x = 3 + 4im;

julia> 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

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: d=done, a=all, n=none]
   [ ] 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: d=done, a=all, n=none]
   [ ] apple
   [X] orange
   [ ] grape
 > [X] strawberry
v  [ ] blueberry

вместо этого можно отобразить с помощью символов Юникода для выбора и навигации с помощью

julia> menu = MultiSelectMenu(options, pagesize=5, charset=:unicode);

julia> request(menu)
[press: d=done, a=all, n=none]
   ⬚ 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: d=done, a=all, n=none]
   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.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, указывает, что этот элемент находится в текущей позиции курсора (тот, который будет выбран нажатием «Ввод»).

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

Spec-Zone.ru

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