Spec-Zone.ru › Julia 1.2

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

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

$ julia

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.2.0 (2019-08-20)
 _/ |\__'_|_|_|\__'_|  |  
|__/                   |


julia>

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

Режим справки

Когда курсор находится в начале строки, режим приглашения можно изменить на режим справки, набрав ?. 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 — клавишу Ctrl вместе с клавишей r . Приглашение изменится на (reverse-i-search)`':, и по мере ввода запроса строка поиска появится в кавычках. Последний результат, соответствующий запросу, будет динамически обновляться справа от двоеточия по мере ввода. Чтобы найти более ранний результат с тем же запросом, просто наберите ^R ещё раз.

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

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

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

Сочетание клавиш Описание
Управление программой
^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: Для тестирования. Если истинно, меню не будет выведено в консоль.
  • 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–2019 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.2.0/stdlib/REPL/

Spec-Zone.ru

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