Spec-Zone.ru › Julia 1.3

Взаимодействующая оболочка Julia (REPL)

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

$ julia

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


julia>

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

Режим помощи

Когда курсор находится в начале строки, режим приглашения можно изменить на режим помощи, введя ?. 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 (или могут быть настроены таким образом).

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

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

Сочетания клавиш REPL Julia могут быть полностью настроены под предпочтения пользователя, передав словарь функции REPL.setup_interface. Ключи этого словаря могут быть символами или строками. Ключ '*' относится к действию по умолчанию. Сочетания клавиш Control плюс символ x обозначены как "^x". Meta плюс x можно записать как "\\Mx". Значения пользовательской карты сочетаний клавиш должны быть 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, Julian и справки, можно ввести несколько первых символов функции или типа, а затем нажать клавишу 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 Input.

Автозаполнение путей работает для строк и режима командной строки 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

Радиоменю позволяет пользователю выбрать один вариант из списка. Функция 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!

Многовыборное меню

Многовыборное меню позволяет пользователям выбрать несколько вариантов из списка.

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

Spec-Zone.ru

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