Interactive Utilities
InteractiveUtils
模块提供了用于 Julia 交互式使用的工具,例如代码 introspection 和剪贴板访问。它旨在用于交互式工作,并在 interactive mode 中自动加载。
Base.Docs.apropos
— Functionapropos([io::IO=stdout], pattern::Union{AbstractString,Regex})
搜索可用的文档字符串,查找包含 pattern
的条目。
当 pattern
是一个字符串时,忽略大小写。结果将打印到 io
。
可以通过在 REPL 的帮助模式中将查询用双引号括起来来调用 apropos
:
help?> "pattern"
InteractiveUtils.varinfo
— Functionvarinfo(m::Module=Main, pattern::Regex=r""; all=false, imported=false, recursive=false, sortby::Symbol=:name, minsize::Int=0)
返回一个 Markdown 表格,提供有关模块中公共全局变量的信息,选项上可以限制为匹配 pattern
的变量。
内存消耗估计是对象内部结构大小的近似下限。
all
: 还列出模块中定义的非公共对象、已弃用对象和编译器生成的对象。imported
: 还列出从其他模块显式导入的对象。recursive
: 递归包含子模块中的对象,在每个子模块中遵循相同的设置。sortby
: 用于排序结果的列。选项为:name
(默认)、:size
和:summary
。minsize
: 仅包括大小至少为minsize
字节的对象。默认为0
。
varinfo
的输出仅用于显示目的。另请参见 names
以获取模块中定义的符号数组,适合进行更一般的操作。
InteractiveUtils.versioninfo
— Functionversioninfo(io::IO=stdout; verbose::Bool=false)
打印有关正在使用的 Julia 版本的信息。输出由布尔关键字参数控制:
verbose
:打印所有附加信息
此函数的输出可能包含敏感信息。在共享输出之前,请检查输出并删除任何不应公开共享的数据。
另请参见:VERSION
.
InteractiveUtils.methodswith
— Functionmethodswith(typ[, module or function]; supertypes::Bool=false])
返回一个包含类型为 typ
的参数的方法数组。
可选的第二个参数将搜索限制在特定的模块或函数(默认是所有顶级模块)。
如果关键字 supertypes
为 true
,还会返回具有父类型 typ
的参数,排除类型 Any
。
另见: methods
.
InteractiveUtils.subtypes
— Functionsubtypes(T::DataType)
返回数据类型 T
的直接子类型列表。请注意,所有当前加载的子类型都包括在内,包括那些在当前模块中不可见的子类型。
另请参见 supertype
, supertypes
, methodswith
。
示例
julia> subtypes(Integer)
3-element Vector{Any}:
Bool
Signed
Unsigned
InteractiveUtils.supertypes
— Functionsupertypes(T::Type)
返回一个元组 (T, ..., Any)
,其中包含 T
及其所有超类型,这些超类型通过对 supertype
函数的连续调用确定,按 <:
的顺序列出,并以 Any
结束。
另请参见 subtypes
。
示例
julia> supertypes(Int)
(Int64, Signed, Integer, Real, Number, Any)
InteractiveUtils.edit
— Methodedit(path::AbstractString, line::Integer=0, column::Integer=0)
编辑一个文件或目录,可以选择提供一个行号以在该行编辑文件。退出编辑器时返回到 julia
提示符。可以通过设置环境变量 JULIA_EDITOR
、VISUAL
或 EDITOR
来更改编辑器。
column
参数至少需要 Julia 1.9。
InteractiveUtils.edit
— Methodedit(function, [types])
edit(module)
编辑函数的定义,选项上可以指定一个类型元组以指示要编辑哪个方法。对于模块,打开主源文件。模块需要先通过 using
或 import
加载。
对模块使用 edit
至少需要 Julia 1.1。
为了确保可以在给定行打开文件,您可能需要先调用 InteractiveUtils.define_editor
。
InteractiveUtils.@edit
— MacroInteractiveUtils.define_editor
— Functiondefine_editor(fn, pattern; wait=false)
定义一个新的编辑器,匹配 pattern
,可以使用 fn
打开一个文件(可能在给定的行号处)。
fn
参数是一个函数,用于确定如何使用给定的编辑器打开文件。它应该接受四个参数,如下所示:
cmd
- 编辑器的基本命令对象path
- 要打开的源文件的路径line
- 要在其处打开编辑器的行号column
- 要在其处打开编辑器的列号
无法通过命令打开特定行或特定列的编辑器可以忽略 line
和/或 column
参数。fn
回调必须返回一个适当的 Cmd
对象以打开文件,或者返回 nothing
表示它们无法编辑此文件。使用 nothing
表示该编辑器不适合当前环境,应该尝试另一个编辑器。可以通过直接将回调推送到向量 EDITOR_CALLBACKS
来添加更通用的编辑钩子,而不需要生成外部命令。
pattern
参数是一个字符串、正则表达式或字符串和正则表达式的数组。为了调用 fn
,必须有一个模式与 EDITOR
、VISUAL
或 JULIA_EDITOR
的值匹配。对于字符串,该字符串必须等于编辑器命令的第一个单词的 basename
,并去掉其扩展名(如果有的话)。例如,“vi”不匹配“vim -g”,但匹配“/usr/bin/vi -m”;它也匹配 vi.exe
。如果 pattern
是正则表达式,则它与所有编辑器命令作为 shell 转义字符串进行匹配。数组模式如果其任何项匹配则匹配。如果多个编辑器匹配,则使用最近添加的那个。
默认情况下,julia 不会等待编辑器关闭,而是在后台运行它。然而,如果编辑器是基于终端的,您可能希望设置 wait=true
,julia 将在恢复之前等待编辑器关闭。
如果设置了其中一个编辑器环境变量,但没有编辑器条目与之匹配,则调用默认编辑器条目:
(cmd, path, line, column) -> `$cmd $path`
请注意,许多编辑器已经定义。以下所有命令应该已经可以工作:
- emacs
- emacsclient
- vim
- nvim
- nano
- micro
- kak
- helix
- textmate
- mate
- kate
- subl
- atom
- notepad++
- Visual Studio Code
- open
- pycharm
- bbedit
示例
以下定义了基于终端的 emacs
的用法:
define_editor(
r"\bemacs\b.*\s(-nw|--no-window-system)\b", wait=true) do cmd, path, line
`$cmd +$line $path`
end
define_editor
是在 Julia 1.4 中引入的。
InteractiveUtils.less
— Methodless(file::AbstractString, [line::Integer])
使用默认的分页器显示文件, optionally 提供一个起始行号。退出分页器时返回到 julia
提示符。
InteractiveUtils.less
— Methodless(function, [types])
使用默认的分页器显示函数的定义, 可选地指定一个类型元组以指示要查看哪个方法。
InteractiveUtils.@less
— MacroInteractiveUtils.@which
— Macro@which
应用于函数或宏调用时,它会评估指定调用的参数,并返回将为这些参数调用的方法的 Method
对象。应用于变量时,它返回绑定该变量的模块。它调用 which
函数。
InteractiveUtils.@functionloc
— Macro@functionloc
应用于函数或宏调用时,它会评估指定调用的参数,并返回一个元组 (filename,line)
,提供将为这些参数调用的方法的位置。它会调用 functionloc
函数。
InteractiveUtils.@code_lowered
— Macro@code_lowered
评估函数或宏调用的参数,确定它们的类型,并在结果表达式上调用 code_lowered
。
另请参见:code_lowered
,@code_warntype
,@code_typed
,@code_llvm
,@code_native
。
InteractiveUtils.@code_typed
— Macro@code_typed
评估函数或宏调用的参数,确定它们的类型,并在结果表达式上调用 code_typed
。使用可选参数 optimize
进行控制
@code_typed optimize=true foo(x)
是否应用额外的优化,例如内联。
另请参见:code_typed
,@code_warntype
,@code_lowered
,@code_llvm
,@code_native
。
InteractiveUtils.code_warntype
— Functioncode_warntype([io::IO], f, types; debuginfo=:default)
打印与给定的泛型函数和类型签名匹配的方法的降低和类型推断的 AST,io
默认为 stdout
。AST 被注释为强调可能对性能有问题的“非叶”类型(如果可用颜色,则以红色显示)。这作为潜在类型不稳定的警告。
并非所有非叶类型对性能都特别有问题,特定类型的性能特征是编译器的实现细节。code_warntype
会倾向于将可能影响性能的类型标记为红色,因此某些类型即使不影响性能也可能被标记为红色。小的具体类型联合通常不是问题,因此这些会以黄色突出显示。
关键字参数 debuginfo
可以是 :source
或 :none
(默认),用于指定代码注释的详细程度。
有关更多信息,请参见手册中性能提示页面的 @code_warntype
部分。
另请参见:@code_warntype
,code_typed
,code_lowered
,code_llvm
,code_native
。
InteractiveUtils.@code_warntype
— Macro@code_warntype
评估函数或宏调用的参数,确定它们的类型,并在结果表达式上调用 code_warntype
。
另见:code_warntype
,@code_typed
,@code_lowered
,@code_llvm
,@code_native
。
InteractiveUtils.code_llvm
— Functioncode_llvm([io=stdout,], f, types; raw=false, dump_module=false, optimize=true, debuginfo=:default)
打印为运行与给定的泛型函数和类型签名匹配的方法生成的 LLVM 位码到 io
。
如果未设置 optimize
关键字,则代码将在 LLVM 优化之前显示。所有元数据和 dbg.* 调用都将从打印的位码中移除。要获取完整的 IR,请将 raw
关键字设置为 true。要转储封装函数的整个模块(包括声明),请将 dump_module
关键字设置为 true。关键字参数 debuginfo
可以是 source(默认)或 none,以指定代码注释的详细程度。
另请参见: @code_llvm
, code_warntype
, code_typed
, code_lowered
, code_native
。
InteractiveUtils.@code_llvm
— Macro@code_llvm
评估函数或宏调用的参数,确定它们的类型,并在结果表达式上调用 code_llvm
。通过将可选关键字参数 raw
、dump_module
、debuginfo
、optimize
及其值放在函数调用之前来设置它们,如下所示:
@code_llvm raw=true dump_module=true debuginfo=:default f(x)
@code_llvm optimize=false f(x)
optimize
控制是否应用额外的优化,例如内联。raw
使所有元数据和 dbg.* 调用可见。debuginfo
可以是 :source
(默认)或 :none
,以指定代码注释的详细程度。dump_module
打印封装该函数的整个模块。
另请参见:code_llvm
,@code_warntype
,@code_typed
,@code_lowered
,@code_native
。
InteractiveUtils.code_native
— Functioncode_native([io=stdout,], f, types; syntax=:intel, debuginfo=:default, binary=false, dump_module=true)
打印为运行与给定泛型函数和类型签名匹配的方法生成的本地汇编指令到 io
。
- 通过将
syntax
设置为:intel
(默认)以使用 intel 语法或:att
以使用 AT&T 语法来设置汇编语法。 - 通过将
debuginfo
设置为:source
(默认)或:none
来指定代码注释的详细程度。 - 如果
binary
为true
,还将打印每条指令的二进制机器代码,并在前面加上缩略地址。 - 如果
dump_module
为false
,则不打印元数据,如 rodata 或指令。 - 如果
raw
为false
,则省略不重要的指令(如 safepoint 函数序言)。
另请参见: @code_native
, code_warntype
, code_typed
, code_lowered
, code_llvm
。
InteractiveUtils.@code_native
— Macro@code_native
评估函数或宏调用的参数,确定它们的类型,并在结果表达式上调用 code_native
。
通过在函数调用之前放置可选的关键字参数 syntax
、debuginfo
、binary
或 dump_module
来设置它们,例如:
@code_native syntax=:intel debuginfo=:default binary=true dump_module=false f(x)
- 通过将
syntax
设置为:intel
(默认)来设置汇编语法以使用 Intel 语法,或设置为:att
以使用 AT&T 语法。 - 通过将
debuginfo
设置为:source
(默认)或:none
来指定代码注释的详细程度。 - 如果
binary
为true
,还会打印每条指令的二进制机器代码,并在前面加上缩略地址。 - 如果
dump_module
为false
,则不打印元数据,例如 rodata 或指令。
另请参见:code_native
、@code_warntype
、@code_typed
、@code_lowered
、@code_llvm
。
Base.@time_imports
— Macro@time_imports
一个宏,用于执行一个表达式并生成任何导入包及其依赖项所花费时间的报告。任何编译时间将以百分比形式报告,以及其中有多少是重新编译(如果有的话)。
每个包或包扩展都会打印一行。显示的持续时间是导入该包本身所需的时间,不包括加载其任何依赖项的时间。
在 Julia 1.9+ 中,包扩展 将显示为 Parent → Extension。
在加载过程中,一个包会顺序导入其所有依赖项,而不仅仅是其直接依赖项。
julia> @time_imports using CSV
50.7 ms Parsers 17.52% compilation time
0.2 ms DataValueInterfaces
1.6 ms DataAPI
0.1 ms IteratorInterfaceExtensions
0.1 ms TableTraits
17.5 ms Tables
26.8 ms PooledArrays
193.7 ms SentinelArrays 75.12% compilation time
8.6 ms InlineStrings
20.3 ms WeakRefStrings
2.0 ms TranscodingStreams
1.4 ms Zlib_jll
1.8 ms CodecZlib
0.8 ms Compat
13.1 ms FilePathsBase 28.39% compilation time
1681.2 ms CSV 92.40% compilation time
此宏至少需要 Julia 1.8
InteractiveUtils.clipboard
— Functionclipboard(x)
将 x
的打印形式发送到操作系统剪贴板(“复制”)。
clipboard() -> String
返回一个包含操作系统剪贴板内容的字符串(“粘贴”)。