对日开发 秀丸文本编辑器 宏的基本使用
参考资料
- 秀丸マクロ.net
- 秀丸マクロ 入門
- 秀丸エディタ マクロ言語ヘルプ目次
目录
- 一. 简介
- 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"
:- 指定
jsmode
为WebView2
,可以开启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);
}
⏹执行效果如下所示