序言
PopClip是Mac平台上的一款文本增强软件,可以与用户光标所勾选的文本进行交互,实现很多复杂的文本处理功能,并与其他软件进行联动。
PopClip本身只是一个提供文本交互接口的平台,其主要文本处理功能是通过安装各种插件进行实现。官方插件市场上已经提供了大量精心挑选的插件,能够满足基本的文本处理需求,同时也提供了插件开发文档,供用户根据自己独特的需求进行客制化插件开发。
鉴于平时从PDF文档中复制代码经常会出现多余的空行,官方插件市场上又没有去除空行的插件,于是决定自己开发一个,顺便也练练手,为以后更复杂需求的插件开发进行技术积累。
目前PopClip插件的可以通过Snippets、快捷指令、AppleScript、JavaScript、Shell等方式进行开发。本来想使用自己最顺手的python,但是经过初步尝试以后发现,python脚本想要与PopClip进行交互只能通过环境变量的方式,很不方便且功能受限。最终还是通过接口更为丰富的JavaScript脚本。
文件结构
插件的文件结构如下:
RemoveNoneLine
├── Config.json # 插件的配置文件
├── README.md # 插件的说明文档
├── icon.png # 插件的图标
└── removeNoneLine.js # 实际运行代码的脚本文件
配置文件
{
"popclip version": 3785,
"identifier": "cn.siriyang.popclip.extension.removeNoneLine",
"name": "去除空行",
"icon": "icon.png",
"javascript file": "removeNoneLine.js"
}
按照官方开发文档的要求,配置文件是PopClip插件必备的文件,其文件格式有多种,这里我选择个人比较喜欢的json格式进行编写。
在配置文件中我仅填写了几个关键字段,并选择以外部文件的方式运行JavaScript代码,这样将代码与配置文件分离,代码编写起来要清晰很多。
脚本文件
//文本输入
const lines = popclip.input.text.match(/[^\r\n]+/g) // 按行读取
//文本转换
var res=[]
for( var i=0; i<lines.length;i++){ //遍历所有行
if(lines[i].replace(/^\s+|\s+$/g,"").length>0){ // 判断是否是空行
res.push(lines[i]) // 保留非空行
}
}
//文本输出
popclip.pasteText(res.join('\n')) // 将所有行拼接并粘贴
虽然整个去除空行的代码很简单,但却具备文本输入、文本转换、文本输出的完整流程:
- 先将光标勾选的文本按行一行行读入;
- 然后对每一行去除空格后再判断其长度是否大于0,将非空的行保留下来;
- 在最后使用换行符进行拼接,再将修改好的文本粘贴替换光标勾选的文本。
打包安装
当代码编写完毕以后就可以开始打包安装了。PopClip插件的打包安装方法很简单,只需要修改文件夹后缀为.popclipext
即可将其转换为一个插件安装包,然后双击进行安装。
在安装自制或第三方插件的时候PopClip默认会弹出警告窗口,以防止安装未知的插件造成系统安全问题。由于在开发过程中会反复安装测试,官方提供了关闭警告窗口的方法,需要在终端中运行下面的命令,然后重启PopClip。
defaults write com.pilotmoon.popclip LoadUnsignedExtensions -bool YES
同理,当你在网上下载一个PopClip插件以后,只需要将.popclipext
后缀去掉即可转换为文件夹查看其中的源码进行学习改造。对于在官网下载的插件后缀为.popclipextz
,需要先将其改为.zip
在解压得到.popclipext
。
效果测试
结语
通过本次去除空行插件的简单案例尝试,完成了PopClip插件完整的开发流程。文本输入、文本转换、文本输出的基本范式确定下来以后,之后开发新的插件只需要调整相应模块即可。当然PopClip插件还有过滤器、参数设置等更为复杂的功能,等以后有需求的时候再针对性查询文档学习。
这是我在少数派上发布的第二篇文章,距离第一篇文章已经过去了快一年的时间,这一年内一直在忙于论文和求职上面,现在总算是赢来了一个短暂的空档期,可以抽点时间专心写作了。虽然中途也有写过几篇文章发在自己的博客上,但都不适合少数派平台,之后的话准备多写一些自动化、效率工具以及数据管理方向的文章。