正则表达式实战:5分钟打造micro编辑器批量重命名神器
你是否还在为重复的文件命名工作抓狂?面对成百上千个需要统一格式的文档、图片,手动修改既耗时又容易出错。本文将带你从零构建一个micro编辑器的批量文件重命名插件,只需掌握基础正则表达式,即可实现自动化文件管理,让你从此告别繁琐操作。
读完本文你将获得:
- 掌握micro插件开发的核心流程与文件结构
- 学会使用Lua语言处理文件系统操作
- 精通正则表达式在批量重命名中的高级应用
- 拥有一个可自定义的文件重命名工具
micro插件开发基础
micro编辑器采用模块化插件系统,所有插件位于runtime/plugins/目录下。每个插件通常包含Lua脚本文件和帮助文档,如自动闭合插件runtime/plugins/autoclose/autoclose.lua所示,标准插件结构包括版本声明、依赖导入、核心逻辑和事件注册四个部分。
插件基本框架
一个完整的micro插件至少需要包含以下元素:
VERSION = "1.0.0" -- 版本声明
-- 导入必要模块
local util = import("micro/util")
local buffer = import("micro/buffer")
local micro = import("micro")
-- 核心功能实现
function renameFiles(bp, args)
-- 实现文件重命名逻辑
end
-- 初始化函数:注册命令和快捷键
function init()
micro.RegisterCommand("bulkrename", renameFiles, "批量重命名文件")
micro.TryBindKey("Alt-r", "command:bulkrename", false)
end
正则表达式核心应用
正则表达式(Regular Expression)是处理文本模式匹配的强大工具,在文件重命名中可实现复杂的模式匹配与替换。以下是批量重命名场景中最常用的正则表达式语法:
| 元字符 | 描述 | 示例 |
|---|---|---|
^ | 匹配字符串开头 | ^IMG 匹配以IMG开头的文件名 |
$ | 匹配字符串结尾 | .txt$ 匹配以.txt结尾的文件 |
() | 捕获组,用于提取匹配部分 | (\d+) 捕获连续数字 |
\d | 匹配数字 | \d{4} 匹配4位数字 |
\w | 匹配字母、数字或下划线 | \w+ 匹配单词字符 |
* | 匹配前一个元素0次或多次 | a* 匹配任意个a |
+ | 匹配前一个元素1次或多次 | a+ 匹配至少一个a |
{n} | 匹配前一个元素恰好n次 | \d{3} 匹配3位数字 |
{n,} | 匹配前一个元素至少n次 | \d{2,} 匹配至少2位数字 |
{n,m} | 匹配前一个元素n到m次 | \d{2,4} 匹配2-4位数字 |
[] | 字符集,匹配其中任意字符 | [A-Z] 匹配大写字母 |
| | 或操作 | jpg|png 匹配jpg或png |
捕获组与反向引用
捕获组是正则表达式中最强大的功能之一,通过()定义的捕获组可以在替换模式中使用$1、$2等引用捕获的内容。例如:
- 匹配模式:
^IMG_(\d{4})(\d{2})(\d{2})\.jpg$ - 替换模式:
Photo_$1-$2-$3.jpg - 效果:将"IMG_20231018.jpg"转换为"Photo_2023-10-18.jpg"
文件重命名插件实现
我们将创建一个名为bulkrename的插件,实现通过正则表达式批量重命名文件的功能。插件完整路径为runtime/plugins/bulkrename/bulkrename.lua。
核心功能设计
插件将实现以下功能:
- 列出当前目录文件
- 输入正则表达式匹配模式
- 输入替换模式
- 预览重命名结果
- 确认执行重命名
完整代码实现
VERSION = "1.0.0"
local util = import("micro/util")
local buffer = import("micro/buffer")
local micro = import("micro")
local os = import("os")
local path = import("path")
-- 获取当前目录文件列表
function getFileList()
local files = {}
local dir = micro.CurPane().Buf.AbsPath
if dir == "" then
dir = os.Getwd()
else
dir = path.Dir(dir)
end
local entries = os.ReadDir(dir)
for _, entry in ipairs(entries) do
if not entry.IsDir then
table.insert(files, entry.Name)
end
end
return files, dir
end
-- 正则表达式替换
function regexRename(filename, pattern, replacement)
local result, _ = filename:gsub(pattern, replacement)
return result
end
-- 批量重命名主函数
function bulkRename(bp)
-- 获取文件列表
local files, dir = getFileList()
if #files == 0 then
micro.InfoBar():Error("当前目录没有文件")
return
end
-- 获取正则表达式模式
local pattern = micro.Input("请输入匹配模式: ", "", "regex")
if pattern == "" then
micro.InfoBar():Error("匹配模式不能为空")
return
end
-- 获取替换模式
local replacement = micro.Input("请输入替换模式: ", "", "replacement")
if replacement == "" then
micro.InfoBar():Error("替换模式不能为空")
return
end
-- 预览结果
local preview = "预览重命名结果:\n"
local changes = {}
for _, file in ipairs(files) do
local newName = regexRename(file, pattern, replacement)
if newName ~= file then
table.insert(changes, {old=file, new=newName})
preview = preview .. file .. " -> " .. newName .. "\n"
end
end
if #changes == 0 then
micro.InfoBar():Message("没有匹配的文件")
return
end
-- 确认操作
local confirm = micro.Input(preview .. "确认重命名? (y/n): ", "n", "confirm")
if confirm:lower() ~= "y" and confirm:lower() ~= "yes" then
micro.InfoBar():Message("已取消重命名")
return
end
-- 执行重命名
local success = 0
for _, change in ipairs(changes) do
local oldPath = path.Join(dir, change.old)
local newPath = path.Join(dir, change.new)
if os.Rename(oldPath, newPath) then
success = success + 1
else
micro.InfoBar():Error("重命名失败: " .. change.old)
end
end
micro.InfoBar():Message(string.format("成功重命名 %d 个文件", success))
end
-- 初始化插件
function init()
micro.RegisterCommand("bulkrename", bulkRename, "批量重命名文件: 使用正则表达式批量重命名当前目录文件")
micro.TryBindKey("Alt-r", "command:bulkrename", false)
end
插件安装与使用
安装步骤
- 创建插件目录:
mkdir -p runtime/plugins/bulkrename - 创建插件文件:
touch runtime/plugins/bulkrename/bulkrename.lua - 将上述代码复制到文件中
- 重启micro编辑器
使用流程
- 打开micro编辑器并导航到目标目录
- 按下
Alt-r快捷键或输入命令:bulkrename - 输入正则表达式匹配模式(如
^IMG_(\d+)\.jpg$) - 输入替换模式(如
photo_$1.jpg) - 查看预览结果并确认重命名
高级应用技巧
数字序列生成
要为文件添加序号,可以结合Lua的自定义函数:
-- 添加序号功能
local counter = 1
function addCounter(match)
local result = match .. string.format("%03d", counter)
counter = counter + 1
return result
end
-- 使用方式
filename:gsub(pattern, addCounter)
日期格式转换
将"YYYYMMDD"格式转换为"YYYY-MM-DD":
-- 匹配模式: (\d{4})(\d{2})(\d{2})
-- 替换模式: $1-$2-$3
扩展名统一
将不同大小写的扩展名统一为小写:
-- 匹配模式: (.*)\.(.*)$
-- 替换模式: $1.%2:lower()
常见问题解决
正则表达式不匹配
- 检查是否使用了特殊字符而未转义,如
.、*、?等需用\转义 - 确认是否区分大小写,可在模式开头添加
(?i)启用不区分大小写匹配
重命名失败
- 目标文件名可能已存在
- 可能没有文件操作权限
- 文件名包含系统保留字符
快捷键冲突
如果Alt-r快捷键冲突,可在~/.config/micro/bindings.json中修改:
{
"Alt-n": "command:bulkrename"
}
总结与扩展
本文详细介绍了如何开发一个micro编辑器的批量文件重命名插件,通过正则表达式实现强大的文件重命名功能。该插件不仅可以提高文件管理效率,还展示了micro插件开发的完整流程。
功能扩展建议
- 添加文件过滤功能,支持按类型、大小、修改日期筛选
- 实现重命名历史记录,支持撤销操作
- 添加预设模板,一键应用常用重命名规则
- 支持文件属性修改,如修改创建/修改时间
micro编辑器的插件系统非常灵活,通过本文介绍的方法,你可以开发更多实用插件来定制自己的编辑器。更多插件开发技巧可参考官方文档runtime/help/plugins.md。
希望这个批量重命名插件能帮助你更高效地管理文件,也欢迎你在此基础上进行二次开发,创造更多实用功能!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




