Nvim :help
页面,生成 自 来源 使用 tree-sitter-vimdoc 解析器。
{name}
不是表达式,你不能使用作为函数引用的变量。你可以使用这个技巧来列出变量 "Funcref" 引用的函数let g:MyFuncref = Funcref func g:MyFuncref unlet g:MyFuncref:fu[nction] /{pattern} 列出名称与
{pattern}
匹配的函数。例如,列出所有以 "File" 结尾的函数:function /File$
:verbose function SetFileTypeSH function SetFileTypeSH(name) Last set from /usr/share/vim/vim-7.0/filetype.vim
{name}
([arguments]) [range] [abort] [dict] [closure] 使用名称 {name}
定义一个新函数。函数体在接下来的行中,直到匹配的 :endfunction。{arguments}
,请参阅 function-argument。:function! Foo() : let x = 0 : function! Bar() closure : let x += 1 : return x : endfunction : return funcref('Bar') :endfunction :let F = Foo() :echo F()
:echo F()
:echo F()
{name}
删除函数 {name}
。{name}
也可以是 字典 条目,它是 Funcref:delfunc dict.init
return 'some text' .. ' some more text'
return 'some text' \ .. ' some more text'
:function
声明的函数,不适用于 lambda 表达式 expr-lambda。function Something(key, value = 10) echo a:key .. ": " .. a:value endfunction call Something('empty') "empty: 10" call Something('key', 20) "key: 20"参数默认表达式是在函数调用时计算的,而不是在函数定义时计算的。因此,可以使用在函数定义时无效的表达式。只有当在调用期间未指定参数时,才会计算表达式。
:function Okay(mandatory, optional = a:mandatory) :endfunction无效的示例
:function NoGood(first = a:second, second = 10) :endfunction
:function Table(title, ...) : echohl Title : echo a:title : echohl None : echo a:0 .. " items:" : for s in a:000 : echon ' ' .. s : endfor :endfunction然后可以用以下命令调用此函数
call Table("Table", "line1", "line2") call Table("Empty Table")要返回多个值,请返回一个 列表
:function Compute(n1, n2) : if a:n2 == 0 : return ["fail", 0] : endif : return ["ok", a:n1 / a:n2] :endfunction然后可以用以下命令调用此函数
:let [success, div] = Compute(102, 6) :if success == "ok" : echo div :endif
{name}
([arguments]) 调用函数。函数名称及其参数如 :function
所指定。最多可以使用 20 个参数。返回值被丢弃。没有范围,并且对于接受范围的函数,该函数被调用一次。当给出范围时,光标在执行函数之前定位在第一行的开头。当给出范围且函数本身不处理它时,该函数会对范围内的每一行执行,光标位于该行的第一列。光标停留在最后一行(可能被最后一次函数调用移动)。参数针对每一行重新计算。因此,这可以工作:function-range-example:function Mynumber(arg) : echo line(".") .. " " .. a:arg :endfunction :1,5call Mynumber(getline("."))
:function Cont() range : execute (a:firstline + 1) .. "," .. a:lastline .. 's/^/\t\\ ' :endfunction :4,8call Cont()
:4,8call GetDict().method()
:eval
。它不支持范围,但允许方法链,例如eval GetList()->Filter()->append('$')函数也可以作为表达式求值的一部分被调用,或者当它用作方法时被调用
let x = GetList() let y = GetList()->Filter()
try
/ finally
块来完成,但在存在多个块时会变得复杂。defer
。它在函数返回时调度函数调用,无论是否发生错误。示例func Filter(text) abort call writefile(a:text, 'Tempfile') call system('filter < Tempfile > Outfile') call Handle('Outfile') call delete('Tempfile') call delete('Outfile') endfunc这里 'Tempfile' 和 'Outfile' 如果出现导致函数中止的错误,则不会被删除。
:defer
可以用来避免这种情况func Filter(text) abort call writefile(a:text, 'Tempfile') defer delete('Tempfile') defer delete('Outfile') call system('filter < Tempfile > Outfile') call Handle('Outfile') endfunc注意,删除 "Outfile" 在调用
system()
之前被调度,因为它即使在 system()
失败时也会被创建。func Useless() abort for s in range(3) defer execute('echomsg "number ' .. s .. '"') endfor endfunc现在
:messages
显示:number 2 number 1 number 0:finish
快速退出脚本。这样可以使 Vim 启动速度更快。autocommand 应该再次加载同一个文件,并设置一个变量来跳过 :finish
命令。:au FuncUndefined BufNet* source ~/vim/bufnetfuncs.vim然后,文件 "~/vim/bufnetfuncs.vim" 应该定义以 "BufNet" 开头的函数。另见 FuncUndefined.
:call filename#funcname()当调用这样的函数,并且它尚未定义时,Vim 将在 'runtimepath' 中的 "autoload" 目录中搜索名为 "filename.vim" 的脚本文件。例如 "~/.config/nvim/autoload/filename.vim"。该文件应该定义如下函数
function filename#funcname() echo "Done!" endfunction如果该文件不存在,Vim 还会在 'packpath'(在 "start" 下)中搜索,以允许从你的 vimrc 中调用包的函数,即使这些包尚未添加到 'runtimepath' 中(参见 packages)。
:call foo#bar#func()Vim 将在 'runtimepath' 中查找文件 "autoload/foo/bar.vim"。
:let l = foo#bar#lvar但是,如果 autoload 脚本已经加载,则不会为未知变量重新加载它。
:let foo#bar#toggle = 1 :call foo#bar#func()注意,如果你犯了一个错误,调用了一个应该在 autoload 脚本中定义的函数,但脚本实际上没有定义该函数,你将收到有关缺少函数的错误消息。如果你修复了 autoload 脚本,它不会被自动重新加载。要么重新启动 Vim,要么手动源代码脚本。