Spec-Zone.ru › Julia 1.4

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.4.2 (2020-05-23)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |


julia>

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

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

Режим Julia

REPL имеет четыре основных режима работы. Первый и наиболее распространённый – режим Julia. Это режим по умолчанию; каждая новая строка по умолчанию начинается с julia>. Именно здесь вы можете вводить выражения Julia. Нажатие 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

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

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

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

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

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

Команда Описание
Управление программой
^D Выход (когда буфер пуст)
^C Прерывание или отмена
^L Очистка экрана консоли
Возврат/Ввод, ^J Новая строка, выполнение, если она завершена
meta-Возврат/Ввод Вставка новой строки без её выполнения
? или ; Вызов справки или режима командной строки (в начале строки)
^R, ^S Поиск в истории с использованием инкрементального поиска, описанного выше
Движение курсора
Стрелка вправо, ^F Перемещение вправо на один символ
Стрелка влево, ^B Перемещение влево на один символ
ctrl-Вправо, meta-F Перемещение вправо на одно слово
ctrl-Влево, meta-B Перемещение влево на одно слово
Начало, ^A Перемещение к началу строки
Конец, ^E Перемещение к концу строки
Стрелка вверх, ^P Перемещение вверх на одну строку (или переход к предыдущей записи истории, соответствующей тексту перед курсором)
Стрелка вниз, ^N Перемещение вниз на одну строку (или переход к следующей записи истории, соответствующей тексту перед курсором)
Shift-Стрелка Перемещение курсора в соответствии с направлением стрелки, при активации области ("выделение области")
Page-вверх, meta-P Переход к предыдущей записи истории
Page-вниз, 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 Преобразование следующего слова в заголовок (titlecase)
meta-l Преобразование следующего слова в нижний регистр
^/, ^_ Отмена предыдущего действия редактирования
^Q Введите число в REPL и нажмите ^Q для открытия редактора в соответствующей стековой рамке или методе
meta-Left Arrow Отступ текущей строки слева
meta-Right Arrow Отступ текущей строки справа
meta-. Вставка последнего слова из предыдущей записи истории

Настройка команд

Команды 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_up(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» руководства Ввод 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

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

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

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 выбросит исключение InterruptException() при нажатии ^C

Примеры

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.4.2/stdlib/REPL/

Spec-Zone.ru

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