当前位置: 首页 > news >正文

自定义luacheck校验规则

安装运行环境

安装环境及源码解析,参考:LuaCheck校验原理解析

自定义校验规则

从代码中可以看出,定义一条规则有以下关键点:

  1. 需要定义告警信息:由键值对组成,key为告警编码(不一定为纯数字,只是这里使用的是纯数字),value为告警信息,告警信息中,message_format为消息模板,fields为消息中定义的字段,这两者用于模板文本传参,如果不需要传参,即只需要打印固定信息时,fields可以为空 {} 。此处定义在每个模块的stage.warnings对象中。
  2. 需要在模块中定义stage.run函数并将其return,stage.run函数即为此模块的主函数,在这里执行校验规则,函数接受chstate参数,作为被检查行的上下文对象;
  3. 当需要弹出告警时,需要使用chstate:warn_xx函数推送,可用函数有:
    1. 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 = {}}} 来将其覆盖。通常不需要传这个参数。
    2. chstate:warn_var(code, var, warning):此处code、warning参数与chstate:warn_range函数一致,var参数顾名思义,传入的是一个变量对象,同样以node节点形式传入;
    3. chstate:warn_value(code, value, warning):此处value为一个被赋值的变量对象,可知其关系为value.var_node 即为这个值对应的变量(ast语法树中节点),value.var_node.node即为对应代码块;
  4. 需要将这个模块添加到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)的一种深层探索。通过在单一模型中统一理解与生成&#xff…...

[文献阅读]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调用的…...

最近的一些事情

正义不会缺席 这家公司违法辞退不给工资乱开离职证明。严重影响个人发展。 今天终于收到法院的判决书。 警醒自身发展与社会之间密切交流,敲响警钟。 虽然最终得到的法院的支持,但过程举步维艰。 这其中的过程,也让我对律师、法院和中国…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

网站指纹识别

网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染(SSR)与静态网站生成(SSG) 框架,由 Vercel 开发。它简化了构建生产级 React 应用的过程,并内置了很多特性: ✅ 文件系…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...