Взаимодействующая оболочка 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/