正则表达式实战:5分钟打造micro编辑器批量重命名神器

正则表达式实战:5分钟打造micro编辑器批量重命名神器

【免费下载链接】micro A modern and intuitive terminal-based text editor 【免费下载链接】micro 项目地址: https://gitcode.com/gh_mirrors/mi/micro

你是否还在为重复的文件命名工作抓狂?面对成百上千个需要统一格式的文档、图片,手动修改既耗时又容易出错。本文将带你从零构建一个micro编辑器的批量文件重命名插件,只需掌握基础正则表达式,即可实现自动化文件管理,让你从此告别繁琐操作。

读完本文你将获得:

  • 掌握micro插件开发的核心流程与文件结构
  • 学会使用Lua语言处理文件系统操作
  • 精通正则表达式在批量重命名中的高级应用
  • 拥有一个可自定义的文件重命名工具

micro插件开发基础

micro编辑器采用模块化插件系统,所有插件位于runtime/plugins/目录下。每个插件通常包含Lua脚本文件和帮助文档,如自动闭合插件runtime/plugins/autoclose/autoclose.lua所示,标准插件结构包括版本声明、依赖导入、核心逻辑和事件注册四个部分。

micro插件目录结构

插件基本框架

一个完整的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。

核心功能设计

插件将实现以下功能:

  1. 列出当前目录文件
  2. 输入正则表达式匹配模式
  3. 输入替换模式
  4. 预览重命名结果
  5. 确认执行重命名

完整代码实现

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

插件安装与使用

安装步骤

  1. 创建插件目录:mkdir -p runtime/plugins/bulkrename
  2. 创建插件文件:touch runtime/plugins/bulkrename/bulkrename.lua
  3. 将上述代码复制到文件中
  4. 重启micro编辑器

使用流程

  1. 打开micro编辑器并导航到目标目录
  2. 按下Alt-r快捷键或输入命令:bulkrename
  3. 输入正则表达式匹配模式(如^IMG_(\d+)\.jpg$
  4. 输入替换模式(如photo_$1.jpg
  5. 查看预览结果并确认重命名

高级应用技巧

数字序列生成

要为文件添加序号,可以结合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

希望这个批量重命名插件能帮助你更高效地管理文件,也欢迎你在此基础上进行二次开发,创造更多实用功能!

【免费下载链接】micro A modern and intuitive terminal-based text editor 【免费下载链接】micro 项目地址: https://gitcode.com/gh_mirrors/mi/micro

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值