自定义luacheck校验规则
安装运行环境
安装环境及源码解析,参考:LuaCheck校验原理解析
自定义校验规则
从代码中可以看出,定义一条规则有以下关键点:
- 需要定义告警信息:由键值对组成,key为告警编码(不一定为纯数字,只是这里使用的是纯数字),value为告警信息,告警信息中,message_format为消息模板,fields为消息中定义的字段,这两者用于模板文本传参,如果不需要传参,即只需要打印固定信息时,fields可以为空
{}。此处定义在每个模块的stage.warnings对象中。 - 需要在模块中定义stage.run函数并将其return,stage.run函数即为此模块的主函数,在这里执行校验规则,函数接受chstate参数,作为被检查行的上下文对象;
- 当需要弹出告警时,需要使用chstate:warn_xx函数推送,可用函数有:
- chstate:warn_range(code, range, warning):
- code为步骤1定义的告警信息对应告警编码,字符串形式,如"541";
- range为需要提示的代码块,以node节点形式传入;
- warning为需要覆盖的告警信息,例如,已定义告警信息为
{["541"] = {message_format = "empty do..end block", fields = {}}},这里可以通过传参{["541"] = {message_format = "nothing", fields = {}}}来将其覆盖。通常不需要传这个参数。
- chstate:warn_var(code, var, warning):此处code、warning参数与chstate:warn_range函数一致,var参数顾名思义,传入的是一个变量对象,同样以node节点形式传入;
- chstate:warn_value(code, value, warning):此处value为一个被赋值的变量对象,可知其关系为value.var_node 即为这个值对应的变量(ast语法树中节点),value.var_node.node即为对应代码块;
- chstate:warn_range(code, range, warning):
- 需要将这个模块添加到stages.lua的执行列表中,即
stages.names,注意,必须要添加到前置流程之后,即resolve_locals之后;
示例:自定义规则模块
接下来实现一条简单自定义规则:代码中不允许出现 HelloLua 字样,规则编码为 700 ;
步骤1:stages下新增模块
在 src/luacheck/stages/ 下,新建 HelloLua.lua 文件,其内容为:
local stage = {}stage.warnings = {}function stage.run(chstate)
endreturn stage
步骤2:编写规则及其校验方法
修改 HelloLua.lua 文件如下:
local stage = {}stage.warnings = {["700"] = {message_format = "do not show HelloLua", fields = {}},
}function stage.run(chstate)local num_lines = #chstate.line_offsetsfor line_number = 1, num_lines dolocal line_offset = chstate.line_offsets[line_number]local line_length = chstate.line_lengths[line_number]-- 若检查到此行代码中存在HelloLua,则打印对应告警if chstate.source:find("HelloLua", line_offset, true) thenchstate:warn("700", line_number, line_offset, line_offset + #("HelloLua") - 1)endend
endreturn stage
步骤3:将自定义模块添加到stages.lua中
修改stages.lua中stages.names如下:
stages.names = {"parse","unwrap_parens","linearize","parse_inline_options","name_functions","resolve_locals","detect_bad_whitespace","detect_cyclomatic_complexity","detect_empty_blocks","detect_empty_statements","detect_globals","detect_reversed_fornum_loops","detect_unbalanced_assignments","detect_uninit_accesses","detect_unreachable_code","detect_unused_fields","detect_unused_locals","HelloLua"
}
-- 添加到末尾
此时该规则已配置完成,接下来是验证其生效;
步骤4:验证
用于测试的lua文件 init.lua 内容如下:
local base_dir = vim.env.LUNARVIM_BASE_DIRor (function()local init_path = debug.getinfo(1, "HelloLua").source -- 此处修改字符串内容,检查是否告警return init_path:sub(2):match("(.*[/\\])"):sub(1, -2)end)()if not vim.tbl_contains(vim.opt.rtp:get(), base_dir) thenvim.opt.rtp:prepend(base_dir)
endrequire("lvim.bootstrap"):init(base_dir)require("lvim.config"):load()local plugins = require "lvim.plugins"require("lvim.plugin-loader").load { plugins, lvim.plugins }require("lvim.core.theme").setup()local Log = require "lvim.core.log"
Log:debug "Starting LunarVim"local commands = require "lvim.core.commands"
commands.load(commands.defaults)
执行检查:
root@979bc2a8a939:~/test/luacheck-0.23.0# lua -e 'package.path="/root/test/luacheck-0.23.0/src/?.lua;/root/test/luacheck-0.23.0/src/?/init.lua;"..package.path' /root/test/luacheck-0.23.0/bin/luacheck.lua --codes init.lua
Checking init.lua 8 warningsinit.lua:1:1: (W700) do not show HelloLuainit.lua:1:18: (W113) accessing undefined variable viminit.lua:2:1: (W700) do not show HelloLuainit.lua:3:1: (W700) do not show HelloLuainit.lua:7:8: (W113) accessing undefined variable viminit.lua:7:25: (W113) accessing undefined variable viminit.lua:8:3: (W113) accessing undefined variable viminit.lua:17:47: (W113) accessing undefined variable lvimTotal: 8 warnings / 0 errors in 1 file
可见该规则已生效。
此处注意,因为这里使用的是从luacheck源脚本执行,所以所有涉及路径的参数必须指向luacheck所在路径,要根据实际所处位置进行调整,--codes 参数用于显示对应检查规则,也可以在 .luacheckrc 文件中定义 codes = true 。
相关文章:
自定义luacheck校验规则
安装运行环境 安装环境及源码解析,参考:LuaCheck校验原理解析 自定义校验规则 从代码中可以看出,定义一条规则有以下关键点: 需要定义告警信息:由键值对组成,key为告警编码(不一定为纯数字&…...
python钉钉机器人
上代码 #coding:utf-8 import sys import time import hmac import hashlib import base64 import urllib.parse import requeststimestamp str(round(time.time() * 1000)) secret 你的secret secret_enc secret.encode(utf-8) string_to_sign {}\n{}.format(timestamp, …...
汇编学习笔记
汇编 1. debug指令 -R命令(register) 查看、改变CPU寄存器的内容 r ax 修改AX中的内容 -D命令(display) 查看内存中的内容 -E命令(enter) 改写内存中的内容 -U命令(unassenble反汇编) 将内存中的机器指令翻译成汇编指令 -T命令(trace跟踪) 执行一条机器指令 -A命令…...
混合并行训练框架性能对比
混合并行训练框架性能对比 1. 框架类型 DeepSpeed、Megatron - LM、Colossal - AI、SageMaker、Merak、FasterMoE、Tutel、Whale、Alpa、DAPPLE、Mesh - TensorFlow 2. 可用并行性(Available parallelisms) DNN framework(深度神经网络框架)DP(数据并行,Data Parallelis…...
基于Docker+模拟器的Appium自动化测试(二)
模拟器的设置 打开“夜神模拟器”的系统设置,切换到“手机与网络”页,选中网络设置下的“开启网络连接”和“开启网络桥接模式”复选框,而后选择“静态IP”单选框,在IP地址中输入“192.168.0.105”,网关等内容不再赘述…...
数据结构之线性表之链表(附加一个考研题)
链表的定义 链表的结构: 单链表-初始化 代码实现: 单链表-头插法 代码实现: 这里我给大家分析一下 我们每创建一个新的节点都要插在头节点的后面,我们一定要注意顺序 一定要先让新节点指向头节点指向的下一个节点,…...
etmem
title: 聚焦 Etmem:高效内存管理的新引擎 date: ‘2024-12-31’ category: blog tags: Etmem内存管理性能优化系统资源 sig: storage archives: ‘2024-12’ author:way_back summary: Etmem 是一款专注于内存管理优化的创新工具,通过智能的内存分配、回…...
LangChain4j与Elasticsearch:构建高效的语义嵌入存储
LangChain4j与Elasticsearch:构建高效的语义嵌入存储 一、LangChain4j与Elasticsearch集成概述 1.1 LangChain4j简介 LangChain4j是一个为Java开发者设计的开源库,旨在简化大型语言模型(LLM)在Java应用程序中的集成。它提供了与…...
黄河小浪底水利枢纽泄洪预警广播系统正式上线
24小时站岗、危险自动报警、远程喊话驱离……近日,小浪底水利枢纽和西霞院水利枢纽的泄洪预警广播系统正式上线,通过数字化设施赋能管控水域日常监管,将危险水域各个角落“尽收眼底”,涉水危险行为“无处可藏”。 “前方船只请注意…...
理解生成协同促进?华为诺亚提出ILLUME,15M数据实现多模态理解生成一体化
多模态理解与生成一体化模型,致力于将视觉理解与生成能力融入同一框架,不仅推动了任务协同与泛化能力的突破,更重要的是,它代表着对类人智能(AGI)的一种深层探索。通过在单一模型中统一理解与生成ÿ…...
[文献阅读]ReAct: Synergizing Reasoning and Acting in Language Models
文章目录 摘要Abstract:思考与行为协同化Reason(Chain of thought)ReAct ReAct如何协同推理 响应Action(动作空间)协同推理 结果总结 摘要 ReAct: Synergizing Reasoning and Acting in Language Models [2210.03629] ReAct: Synergizing Reasoning an…...
摄像头监视脚本
摄像头监视脚本,若检测到摄像头画面有变化,保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…...
FreeRTOS的内存管理(选择heap4.c文件的理由)
目录 1. 了解FreeRTOS内存管理 2. 了解内存碎片 3.了解各个heap.c的内存分配方法 1.heap1.c 2.heap2.c 3.heap3.c 4.heap4.c 5.heap5.c 总结: 内存管理是一个系统基本组成部分,FreeRTOS 中大量使用到了内存管理,比如创建任务、信号量…...
SQL-leetcode-183. 从不订购的客户
183. 从不订购的客户 Customers 表: -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | -------------------- 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Orders 表&#…...
苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序
前言 苹果系统下使用opencv感觉还是有些不太方便,总是感觉有点受到限制。本博客描述的是在MacOS下建立App程序然后调用opencv显示图片时出现的一些问题并最后解决的一个过程。 一、程序的建立 选择程序的类型: 选择界面模式和编程语言: 其余…...
《代码随想录》Day21打卡!
写在前面:祝大家新年快乐!!!2025年快乐,2024年拜拜~~~ 《代码随想录》二叉树:修剪二叉搜索树 本题的完整题目如下: 本题的完整思路如下: 1.本题使用递归进行求解,所以分…...
Dell服务器升级ubuntu 22.04失败解决
ubuntu系统原版本20.04,服务器dell T40. 执行apt update后,再执行apt upgrade。 apt update执行成功,但apt upgrade执行中断,提示如下: Checking package manager Reading package lists... Done Building dependen…...
构建全志 T113 Tina SDK
1、环境配置: 准备一个 Ubuntu 系统,可以是 WSL,虚拟机等,建议版本是 20.04。 1.1、安装必要的软件 进入系统后,输入下方命令安装需要的工具 : sudo apt update -y sudo apt full-upgrade -y sudo apt i…...
(推荐)【通用业务分发架构】1.业务分发 2.rpc调用 3.Event事件系统
一.Reflections和SpringUtil完成扫描包的(反射缓存) 二.id与class的映射泛型上下文(玩家是否登录,rpc调用SeqId,class类名)反射调用 1.netty层的 AccountMsgParam // 登录前 OnlineMsgParam // 登录后 SceneMsgParam // 发到场景层的 2.跨进程rpc调用的…...
最近的一些事情
正义不会缺席 这家公司违法辞退不给工资乱开离职证明。严重影响个人发展。 今天终于收到法院的判决书。 警醒自身发展与社会之间密切交流,敲响警钟。 虽然最终得到的法院的支持,但过程举步维艰。 这其中的过程,也让我对律师、法院和中国…...
FlicFlac音频格式转换工具:Windows平台轻量级音频处理终极指南
FlicFlac音频格式转换工具:Windows平台轻量级音频处理终极指南 【免费下载链接】FlicFlac Tiny portable audio converter for Windows (WAV FLAC MP3 OGG APE M4A AAC) 项目地址: https://gitcode.com/gh_mirrors/fl/FlicFlac 还在为不同设备间的音频格式兼…...
TruckSim 仿真工作流实战:从参数修改到结果对比
1. TruckSim仿真工作流基础入门 第一次打开TruckSim时,很多新手会被复杂的界面吓到。其实只要掌握几个核心概念,就能快速上手这个强大的车辆动力学仿真工具。我刚开始使用时也走过不少弯路,现在把这些经验分享给大家。 TruckSim的工作流可以简…...
给Hadoop初学者的环境搭建备忘录:为什么你的JDK配置总在重启后‘消失’?(Linux基础解惑)
Hadoop环境搭建中的Linux系统原理:为什么你的配置总在重启后"消失"? 很多Hadoop初学者在搭建开发环境时,都会遇到一个令人困惑的问题:明明按照教程一步步配置好了JDK和Hadoop,为什么重启后环境变量就"消…...
告别Centerness和IoU-Net:聊聊GFLv2如何用‘边框分布统计’更准地评估定位质量
目标检测定位质量评估的范式革新:从启发式设计到统计驱动 在目标检测领域,定位质量评估(Localization Quality Estimation, LQE)一直是个微妙却关键的问题。想象一下这样的场景:当两个检测框都包含了目标物体…...
Onyx Core API完全手册:RESTful接口详解与实战案例
Onyx Core API完全手册:RESTful接口详解与实战案例 【免费下载链接】Onyx Onyx 项目地址: https://gitcode.com/gh_mirrors/ony/Onyx Onyx Core是一个强大的企业级区块链平台,提供完整的RESTful API接口,让开发者能够轻松构建和管理区…...
IDM激活脚本终极指南:如何免费锁定30天试用期无限使用
IDM激活脚本终极指南:如何免费锁定30天试用期无限使用 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script IDM Activation Script是一款开源工具…...
网络工程师避坑指南:eNSP中配置Eth-Trunk链路聚合的5个常见错误与排查方法
网络工程师避坑指南:eNSP中配置Eth-Trunk链路聚合的5个常见错误与排查方法 在华为eNSP模拟器中配置Eth-Trunk链路聚合时,许多网络工程师都会遇到各种"翻车"现场。明明按照教程一步步操作,却发现带宽没有叠加、端口状态异常…...
解密ASCII图表魔法:ditaa将文本艺术转化为专业图表的技术揭秘
解密ASCII图表魔法:ditaa将文本艺术转化为专业图表的技术揭秘 【免费下载链接】ditaa ditaa is a small command-line utility that can convert diagrams drawn using ascii art (drawings that contain characters that resemble lines like | / - ), into proper…...
Bifrost:跨平台三星固件下载神器,解锁设备管理的全新境界
Bifrost:跨平台三星固件下载神器,解锁设备管理的全新境界 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 你是否曾为寻找三星官方固件而烦…...
2026年管棒材检测系统十强厂商最新深度评测
进入2026年下半年,全球管棒材检测系统行业正式迈入高质量发展攻坚期,行业发展主线聚焦于AI多模态融合与全流程数字化转型,技术迭代呈现“多技术协同、全场景适配”的核心特征。其中,相控阵超声(PAUT)、全聚…...
