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

对日开发 秀丸文本编辑器 宏的基本使用

参考资料

  1. 秀丸マクロ.net
  2. 秀丸マクロ 入門
  3. 秀丸エディタ マクロ言語ヘルプ目次

目录

  • 一. 简介
    • 1.1 宏的语法
    • 1.2 宏的运行
    • 1.3 基本语法
  • 二. 案例
    • 2.1 案例1
    • 2.2 案例2
    • 2.3 案例3
    • 2.4 案例4
  • 三. 调用自定义的`.dll`库


一. 简介

1.1 宏的语法

⏹秀丸的宏文件以.mac结尾,秀丸的宏共有两种语法,具体语法细节官网都有介绍。

  • 秀丸提供的特有语法
  • javascript语法,支持ES6语法👍
  • 支持调用外部的脚本(如.dat.ps1)
  • 支持加载.dll

1.2 宏的运行

⏹如下图所示,可在【マクロ】菜单中,登录宏和执行宏

在这里插入图片描述

⏹宏登录完成之后,可如下图所示给对应的宏分配快捷键

在这里插入图片描述

⏹还可以将宏添加到【テンプレート】模板所在的文件夹,通过设置模板的快捷键快速调用

在这里插入图片描述

⏹然后就可以通过【テンプレート】模板的快捷键调用宏了,好处就是会显示宏的名称一览。

在这里插入图片描述

1.3 基本语法

⏹以下是一个基本的宏,用于将指定的信息插入到当前的文本中

  • insert:用于将内容插入到文本中
  • insertreturn:插入一个换行符
  • endmacro:结束宏
insert "你好\n";
insert "今天的日期是: " + date + " " + time;
insertreturn;
endmacro;

😪一般来说,除了重度使用用户之外,专门为了一个文本编辑器去学习专门的宏语言很划不来。。。
好在秀丸的宏支持javascript宏,本文将通过几个小案例的方式介绍javascript宏的基本用法。


二. 案例

2.1 案例1

  • hidemaruversion
    • 当宏中使用了非同期函数的使用,如果不通过hidemaruversion来指定版本的话,会弹出一个提示框
    • 非必须,不使用的话,宏也可正常运行
  • jsmode "WebView2"
    • 指定jsmodeWebView2,可以开启ES6的javascript语法
    • 在底层上相同于调用了Chromium版的Microsoft Edge
    • jsmode可省略,省略的情况下只能使用ES6之前的旧语法
  • js{ ... }
    • 用于书写js代码的区域
    • js代码块内部可通过秀丸的函数来读取外部定义的变量
  • hidemaruGlobal
    • 秀丸的全局变量,可省略
    • 为了区别js原生函数和秀丸函数,感觉带着更好一些
  • insert:将指定内容插入到当前的文本中
hidemaruversion "9.25.13";
jsmode "WebView2";// JS代码块
js{const name = "枫叶红";const url = 'https://api.github.com/users/fengyehong123';const info = `こんにちは ${name}今日の天気がいいです。\n`.replaceAll("\t", "");// 将变量插入到文本中hidemaruGlobal.insert(info);// 在js脚本中直接调用非同期函数,发送fetch请求(async (url) => {let response = await fetch(url, {method: 'get'});// 将获取到的内容添加到文本中const text = await response.text();// 将访问api获取到的内容添加到页面上hidemaruGlobal.insert(text);})(url);
}

2.2 案例2

  • debuginfo(2):用来将console.log()打印的内容显示在【アウトプット】框中,方便调试
  • hidemaru.getVar( ):在js代码块内部获取js代码块外部定义的变量
  • hidemaru.setVar( ):在js代码块内部修改js代码块外部定义的变量
  • message():将指定的内容通过弹窗的方式显示在文本上
debuginfo(2);
jsmode "WebView2";// js代码块外定义的变量
$name = "贾飞天";// JS代码块
js{// 获取js代码块之外的定义的变量const name = hidemaru.getVar( "$name" );const info = `你好,我的名字是: ${name}`;// 弹窗框函数hidemaruGlobal.message(info);// 将内容打印到【アウトプット】框中,方便调试console.log(info);// 在js代码块内部, 修改在js代码块之外定义的变量hidemaru.setVar("$name", info);
}// 弹出框显示
message $name;

2.3 案例3

  • browsefile:打开指定的文件夹
    • 参数1:初期文件夹的路径,若不指定的话,默认使用当前宏所在的文件夹
    • 参数2:文件的后缀
  • loadTextFile():读取指定的文本文件
  • saveTextFile():保存文件到本地的指定路径
  • input():弹出输入框
  • menu:菜单效果
    • \x01后面跟着的菜单名,会自动变为子菜单
    • 单独使用 x01 的话,会被解释为分割线
debuginfo(2);
jsmode "WebView2";js{const filePath = hidemaruGlobal.browsefile("","*.txt");console.log(filePath);// 加载指定路径下的文,并按照换行符分隔为数组const lineList = hidemaru.loadTextFile("C:\\Users\\Admin\\Desktop\\用户凭据.txt").split("\n");for (const line of lineList) {console.log(line);}// 将指定的内容保存到桌面上hidemaru.saveTextFile("C:\\Users\\Admin\\Desktop\\测试内容.txt", "テキスト内容", "utf8" );// 输入函数const address = hidemaruGlobal.input("请输入地址", "默认地址");hidemaruGlobal.message(address);// 如果想要使用子菜单的话,\x01后面跟着的菜单名,会自动变为子菜单const result = hidemaruGlobal.menu("\x01サブメニューA","項目A-1","項目A-2",// 单独使用 "" 表示子菜单的结束"","\x01サブメニューB","項目B-1","項目B-2","",// 单独使用 "\x01" 的话,会被解释为分割线"\x01","項目C","項目D");hidemaruGlobal.message(result);
}

2.4 案例4

  • runProcess:开启新的进程执行外部程序
    • .stdOut:获取输出对象
    • onReadAll:通过非同期的方式获取执行结果,代码不会被阻塞,要获取结果的话,只能在回调函数中来获取
  • runsync:同期的方式执行外部程序,程序执行到此处的话会阻塞
    • 无法获取执行的返回值
    • 返回值是false的话表示执行调用失败;false之外的话表示程序调用成功
debuginfo(2);
jsmode "WebView2";js{// 在秀丸的宏中调用其他程序const processInfo = hidemaru.runProcess("powershell C:\\Users\\Admin\\Desktop\\新建文件夹\\05-获取本机已保存的所有wifi密码.ps1", ".", "stdio", "utf8" );// 获取标准输出对象const stdOut = processInfo.stdOut;// 通过非同期的方式获取执行结果stdOut.onReadAll(function(out) {console.log(out);});// 同期执行powershellconst result = hidemaruGlobal.runsync("powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -WindowStyle Hidden -File C:\\Users\\Admin\\Desktop\\新建文件夹\\05-获取本机已保存的所有wifi密码.ps1");console.log("------------------------");console.log(result);console.log("------------------------");
}

三. 调用自定义的.dll

⏹通过Visual Studio创建一个类库的工程

在这里插入图片描述

⏹准备编译为.dll依赖库的源码

  • 外部使用的方法需要写在接口里,然后用类来实现接口
  • 该代码需要编译为.dll文件之后,才能供秀丸使用
using System;
using System.Runtime.InteropServices;namespace MarcoTest
{// 定义外部使用的接口public interface IInfo{String GetInfo(string param);}// 下面这两项是必须的[ComVisible(true)][ClassInterface(ClassInterfaceType.None)]public class InfoUtil : IInfo{public String GetInfo(string param){return "Hello world! " + param + " 你好, 世界!";}}
}

⏹注意:不能使用 WebView2 的JS,否则 createobject 无法正常使用

  • createobject( ):用来创建对象
  • currentmacrodirectory():表示当前宏脚本所在的文件夹
  • @"\ClassLibrary2.dll", "MarcoTest.InfoUtil":指定.dll依赖库,依赖库里面的命名空间和类名

💥更加详细的解释,请参考 ⇒ 秀丸マクロ.net

debuginfo(2);js{// 通过.dll库创建对象var obj = createobject(currentmacrodirectory() + @"\ClassLibrary2.dll", "MarcoTest.InfoUtil");// dll库里面的方法var result = obj.GetInfo("uiuiui");message(result);
}

⏹执行效果如下所示

在这里插入图片描述

相关文章:

  • 计算属性 vs methods方法
  • Java大厂面试突击:从Spring Boot自动配置到Kafka分区策略实战解析
  • SVT-AV1源码分析-函数svt_aom_motion_estimation_kernel
  • linux:进程的替换
  • 深入解读:2025 数字化转型管理 参考架构
  • 【算法】回溯法
  • 杭电oj(1010、1015、1241)题解
  • 【沉浸式求职学习day27】
  • 【视频生成模型】通义万相Wan2.1模型本地部署和LoRA微调
  • Python----深度学习(基于DNN的吃鸡预测)
  • 动手学深度学习11.11. 学习率调度器-笔记练习(PyTorch)
  • arcpy列表函数的应用(4)
  • MySQL的锁(InnoDB)【学习笔记】
  • win11报错 ‘wmic‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件 的解决方案
  • NestJS + Kafka 秒杀系统完整实践总结
  • 在 Ubuntu 24.04 系统上安装和管理 Nginx
  • SDRAM介绍和时序
  • 列出es查询match、term、wildcard、prefix、fuzzy、range、query_string、text、missing的区别及用法
  • 数据可视化 —— 饼图
  • 人工智能时代的网络安全威胁
  • 吉林省公安厅出入境管理总队政委明志全已任省安保集团总经理
  • 稳就业稳经济五方面若干举措将成熟一项出台一项
  • 宣称防老年痴呆的“原装进口”保健品McPee被指涉假,未获澳方销售批准
  • 如何做大中国拳击产业的蛋糕?这项赛事给出办赛新思考
  • 大家聊中国式现代化|邓智团:践行人民城市理念,开创人民城市建设新局面
  • “五一”假期云南铁路预计发送旅客超330万人次