Интерактивная оболочка 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/