Spec-Zone.ru › Julia 1.5

The Julia REPL

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

$ julia

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


julia>

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

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

Режим Julia

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

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.

Режим помощи можно выйти, нажав клавишу 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

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

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

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

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

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

END_OF_DOCUMENT_MARKER
Комбинация клавиш Описание
Управление программой
^D Выход (если буфер пустой)
^C Прерывание или отмена
^L Очистка экрана консоли
Ввод/Enter, ^J Новая строка, выполнение, если она полная
meta-Ввод/Enter Вставка новой строки без выполнения
? или ; Вызов справки или режима командной строки (если в начале строки)
^R, ^S Инкрементный поиск в истории, описанный выше
Перемещение курсора
Стрелка вправо, ^F Переместить курсор вправо на один символ
Стрелка влево, ^B Переместить курсор влево на один символ
ctrl-Вправо, meta-F Переместить курсор вправо на одно слово
ctrl-Влево, meta-B Переместить курсор влево на одно слово
Home, ^A Переместить курсор в начало строки
End, ^E Переместить курсор в конец строки
Стрелка вверх, ^P Переместить курсор на строку вверх (или перейти к предыдущей записи истории, которая соответствует тексту перед курсором)
Стрелка вниз, ^N Переместить курсор на строку вниз (или перейти к следующей записи истории, которая соответствует тексту перед курсором)
Shift-Стрелка Переместить курсор в соответствии с направлением стрелки, активируя область ("выделение с помощью сдвига")
Page-Up, meta-P Перейти к предыдущей записи истории
Page-Down, meta-N Перейти к следующей записи истории
meta-< Перейти к первой записи истории (текущей сессии, если она находится до текущей позиции в истории)
meta-> Перейти к последней записи истории
^-Space Установить "метку" в области редактирования (и деактивировать область, если она активна)
^-Space ^-Space Установить "метку" в области редактирования и сделать область "активной", т.е. выделенной
^G Деактивировать область (т.е. сделать ее не выделенной)
^X^X Поменять текущую позицию с меткой
Редактирование
Backspace, ^H Удалить предыдущий символ или всю область, если она активна
Delete, ^D Удалить следующий символ (если буфер содержит текст)
meta-Backspace Удалить предыдущее слово
meta-d Удалить следующее слово
^W Удалить текст до ближайшего пробела
meta-w Скопировать текущую область в буфер обмена
meta-W Удалить текущую область, поместив текст в буфер обмена
^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 Julia и справки можно ввести первые несколько символов функции или типа, а затем нажать клавишу Tab, чтобы получить список всех совпадений:

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

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

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

julia> import UUIDs

julia> UUIDs.uuid[TAB]
uuid1        uuid4         uuid_version

Поля вывода из функций также могут быть дополнены:

julia> split("","")[1].[TAB]
lastindex  offset  string

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

Ключи словарей также могут быть дополнены с помощью клавиши 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 и 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

Настройка

Вся настройка интерфейса выполняется с помощью функции TerminalMenus.config() с использованием только ключевых слов.

Аргументы

  • charset::Symbol=:na: символы интерфейса (:ascii или :unicode); переопределяется другими аргументами
  • cursor::Char='>'|'→': символ для курсора
  • up_arrow::Char='^'|'↑': символ для стрелки вверх
  • down_arrow::Char='v'|'↓': символ для стрелки вниз
  • checked::String="[X]"|"✓": строка для выбранного пункта
  • unchecked::String="[ ]"|"⬚"): строка для невыбранного пункта
  • scroll::Symbol=:na: Если :wrap, то курсор будет "зацикливаться" сверху вниз, если :nowrap курсор не "зацикливается"
  • supress_output::Bool=false: Для тестирования. Если True, меню не будет выводиться в консоль.
  • ctrl_c_interrupt::Bool=true: Если false, то при нажатии ^C будет возвращено пустое значение, если true при нажатии ^C будет выброшено исключение InterruptException()

Примеры

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
Set([4, 2])

julia> TerminalMenus.config(charset=:unicode)

julia> request(menu)
[press: d=done, a=all, n=none]
   ⬚ apple
   ✓ orange
   ⬚ grape
 → ✓ strawberry
↓  ⬚ blueberry
Set([4, 2])

julia> TerminalMenus.config(checked="YEP!", unchecked="NOPE", cursor='⧐')

julia> request(menu)
[press: d=done, a=all, n=none]
   NOPE apple
   YEP! orange
   NOPE grape
 ⧐ YEP! strawberry
↓  NOPE blueberry
Set([4, 2])

Ссылки

Base.atreplinitФункция

atreplinit(f)

Регистрирует одноаргументную функцию, которая вызывается перед инициализацией интерфейса REPL в интерактивных сессиях; это полезно для настройки интерфейса. Аргумент функции f — объект REPL. Эта функция должна вызываться внутри файла инициализации .julia/config/startup.jl.

исходный код

© 2009–2020 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.5.3/stdlib/REPL/

Spec-Zone.ru

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