当前位置: 首页 > 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调用的…...

最近的一些事情

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

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

免费数学几何作图web平台

光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...