Vim库函数
Vim 脚本(Vimscript)提供了丰富的内置库函数,用于执行各种操作(如文件处理、字符串操作、数学计算等)。以下是常用库函数的分类介绍:
一、字符串处理函数
1. 字符串长度与子串
strlen(str) " 返回字符串长度
substitute(str, pattern, replace, flags) " 替换字符串(类似 :s 命令)
submatch(n) " 返回上次匹配的第 n 个捕获组
strpart(str, start, [length]) " 返回子串(从 start 开始,可选长度)
2. 字符串转换
toupper(str) " 转换为大写
tolower(str) " 转换为小写
escape(str, chars) " 转义指定字符(如 escape(filename, '.'))
3. 字符串查找与分割
match(str, pattern) " 返回匹配位置(失败返回 -1)
split(str, [pattern]) " 按模式分割字符串(默认按空白分割)
join(list, [sep]) " 连接列表为字符串(默认用空格连接)
二、文件与路径处理
1. 文件操作
readfile(filename) " 读取文件内容到列表
writefile(list, filename) " 将列表写入文件
filereadable(filename) " 检查文件是否可读
filewritable(filename) " 检查文件是否可写
2. 路径处理
expand(path) " 展开特殊字符(如 % 表示当前文件)
fnamemodify(path, flags) " 修改路径(如 :h 获取目录,:t 获取文件名)
getcwd() " 获取当前工作目录
chdir(dir) " 改变工作目录
三、列表与字典操作
1. 列表函数
len(list) " 返回列表长度
add(list, item) " 添加元素到列表末尾
remove(list, idx) " 删除并返回指定索引的元素
sort(list) " 对列表排序
reverse(list) " 反转列表顺序
2. 字典函数
keys(dict) " 返回字典的键列表
values(dict) " 返回字典的值列表
has_key(dict, key) " 检查字典是否包含某个键
四、缓冲区与窗口操作
1. 缓冲区函数
bufname(nr) " 返回缓冲区编号对应的文件名
bufexists(nr) " 检查缓冲区是否存在
getbufline(nr, lnum) " 获取缓冲区指定行的内容
setbufline(nr, lnum, text) " 设置缓冲区指定行的内容
2. 窗口函数
winnr() " 返回当前窗口编号
winwidth(nr) " 返回窗口宽度
winheight(nr) " 返回窗口高度
五、数学与逻辑函数
1. 基本数学运算
abs(n) " 绝对值
sqrt(n) " 平方根
round(n) " 四舍五入
floor(n) " 向下取整
ceil(n) " 向上取整
2. 随机数与时间
rand() " 返回 0 到 RAND_MAX 之间的随机数
srand(seed) " 设置随机数种子
localtime() " 返回当前时间戳
strftime(format, [time]) " 格式化时间
六、系统与环境函数
1. 系统命令执行
system(cmd) " 执行系统命令并返回输出
shellescape(str) " 转义字符串用于 shell 命令
2. 环境变量
getenv(name) " 获取环境变量值
setenv(name, value) " 设置环境变量值
七、其他常用函数
1. 类型检查
type(expr) " 返回表达式类型(0=数字,1=字符串,2=列表,3=字典)
isdirectory(path) " 检查路径是否为目录
2. 条件与循环辅助
empty(expr) " 检查表达式是否为空
exists(var) " 检查变量是否存在
eval(expr) " 执行表达式并返回结果
3. 错误处理
try " 异常处理...
catch /pattern/...
finally...
endtry
八、示例:Vimscript 函数使用
1. 获取当前文件名(不含路径)
let filename = fnamemodify(expand("%"), ":t")
echo "当前文件: " . filename
2. 读取文件内容并统计行数
let lines = readfile("example.txt")
echo "文件共有 " . len(lines) . " 行"
3. 生成随机数并写入文件
let random_num = rand() % 100
call writefile([random_num], "random.txt")
九、查看函数文档
在 Vim 中,可以使用 :help 函数名
查看详细文档:
:help strlen " 查看 strlen 函数帮助
:help file-functions " 查看文件相关函数
通过这些内置函数,Vimscript 可以实现复杂的自动化操作,如文件处理、文本分析、插件开发等。熟练掌握这些函数是编写高效 Vim 脚本的关键。
在命令模式调用库函数
Vim 的库函数可以在命令模式中直接使用,但需要通过 :call
或 :echo
命令来调用。以下是详细说明和示例:
一、在命令模式中调用函数的两种方式
1. 使用 :echo
打印函数返回值
:echo 函数名(参数)
示例:
:echo strlen("hello") " 输出字符串长度:5
:echo getcwd() " 输出当前工作目录
:echo expand("%") " 输出当前文件名
2. 使用 :call
执行无返回值的函数
:call 函数名(参数)
示例:
:call writefile(["line1", "line2"], "test.txt") " 写入文件
:call append(line("."), "new line") " 在当前行后追加内容
二、常用库函数在命令模式中的应用
1. 字符串处理
:echo toupper("hello") " 输出 "HELLO"
:echo substitute("foo bar", "bar", "baz", "") " 输出 "foo baz"
2. 文件操作
:echo readfile("example.txt") " 读取文件内容到列表
:call system("ls -l") " 执行系统命令
3. 缓冲区与窗口
:echo bufname(0) " 输出当前缓冲区文件名
:echo winwidth(0) " 输出当前窗口宽度
4. 数学计算
:echo sqrt(16) " 输出 4
:echo rand() % 10 " 生成 0-9 的随机数
三、结合命令使用函数返回值
1. 在替换命令中使用函数
:%s/old/\=strlen(submatch(0))/g " 将所有 "old" 替换为其长度(3)
\=
表示后面跟随一个表达式(此处调用strlen
函数)。
2. 在行范围中使用函数
:1,echo(line("$"))p " 打印第 1 行到最后一行(line("$") 返回最后一行号)
3. 在变量赋值中使用函数
:let filename = fnamemodify(expand("%"), ":t") " 获取当前文件名
:echo "处理文件: " . filename
四、注意事项
-
函数参数需用括号包围
与 Vimscript 脚本不同,命令模式中调用函数必须使用括号::echo strlen("hello") " 正确 :echo strlen "hello" " 错误
-
复杂表达式需用
execute
若命令中包含多个函数或复杂表达式,建议使用execute
::execute "g/" . escape("pattern", "/") . "/d" " 安全删除包含特定模式的行
-
函数返回值类型
- 字符串需用双引号包围(如
"hello"
)。 - 列表和字典需用
[]
和{}
表示(如[1, 2, 3]
)。
- 字符串需用双引号包围(如
五、示例场景
场景 1:统计当前文件行数
:echo line("$") " 输出文件总行数
场景 2:将当前文件名写入缓冲区
:put =expand("%:t") " 在当前位置插入文件名(不含路径)
场景 3:批量重命名文件
:!mv % :echo substitute(expand("%"), "\.txt", ".md", "") " 将 .txt 改为 .md
总结
Vim 的库函数在命令模式中非常实用,可通过 :echo
和 :call
灵活调用,实现复杂的文本处理和系统操作。熟练掌握函数调用是提升 Vim 效率的关键之一。