Skip to content
| Marketplace
Sign in
Visual Studio Code>Other>超级命令New to Visual Studio Code? Get it now.
超级命令

超级命令

jifengbu

|
3 installs
| (0) | Free
超级命令
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

超级替换

  • super-replacer 超级替换

安装后在侧边栏操作

超级命令

  • super-command 超级命令

安装后在侧边栏操作

函数解析

填写格式: '=$123' :返回 input123 其中 $ 代表当前参数,直接替换 '=>123' 返回 123,可以使用 $,,moment,utils,kettle 等符号 'return 123' :与 '=>123'相同,返回 123 '({$,,moment,utils,kettle})=>123' :返回 123 其他: 直接返回字符串

  • utils的属性
{
  filePath: () => document.uri.fsPath, // 当前文件的路径
  fileName: () => path.basename(document.uri.fsPath), // 当前文件名
  fileDir: () => path.dirname(document.uri.fsPath), // 当前文件所在文件夹
  fileExtname: () => path.extname(document.uri.fsPath), // 当前文件的扩展名
  replace: async (result) => { // 使用结果替换选择或光标处的单词
    await editor.edit(doc => {
      doc.replace(replaceSelection, result);
    });
  },
  fs, path, os, vscode, exec, iconv, crypto, md5,  // 常用工具
  toast: (...msg) => vscode.window.showErrorMessage(msg.map(o => formatData(o)).join(' ')), // toast消息
  log: (...msg) => log(msg.map(o => formatData(o)).join(' ')), // 打印到output
  copy: async () => await vscode.env.clipboard.readText(), // 读取剪切板的内容
  paste: async (text) => await vscode.env.clipboard.writeText(text), // 写入剪切板
  workspaceFolders: () => vscode.workspace.workspaceFolders, // 当前工程路径
}

kettle

模式

kettle模式:@list([1,1,2,2])->uniq()->console() js模式:=>kettle.parse('@list([1,1,2,2])->uniq()->console()')

流

reader: @list, @file, @clip, @json, @excel, @dir, @mongodb, @mysql, @oracle, @sqlserver writer: console, file, text, json, js, excel, md, mongodb, mysql, oracle, sqlserver transform: log, field, flat, map, format, sort, uniq, array, slice, split, filter, group, wait, get, post, script, html, dhtml, article, imageSave 分流: @list([1,1,2,2])->[temp]uniq()->console();@temp->log() 服务模式: 只有开启服务器模式的时候使用,可以使用@get和@post @get('/api', option):@list([1,2])

@get

启服务器模式get接口: @get('/api', paramSet, { p=5189, t: 0 } = {}):reader :开启接口为/api的get服务,返回数据类型为json paramSet: 设置参数,如:(o, utils) => o, 其中o为query,在后面的所有的流都可以使用这些变量,可使用$.page的变量,如果为空,则$为query,若第二项不是函数,则为option 如:@get('/api', o=>({page:o.page}), { p:5189 }):@list([+$.page,+$.page+1]) @get('/api', { p:5189 }):@list([+$.page,+$.page+1]) option: p: 端口, t: 延时时间(秒)

@post

启服务器模式post接口: @post('/api', paramSet, { p=5189, t: 0 } = {}):reader :开启接口为/api的post服务,返回数据类型为json paramSet: 设置参数,如:(o, utils) => o, 其中o为body,在后面的所有的流都可以使用这些变量,可使用$.page的变量,如果为空,则$为body,若第二项不是函数,则为option 如:@post('/api', o=>({page:o.page}), { p:5189 }):@list([+$.page,+$.page+1]) @post('/api', { p:5189 }):@list([+$.page,+$.page+1]) option: p: 端口, t: 延时时间(秒)

@list

将数组转化为流: @list(list) :参数为数组, 将数组转化为流

@clip

将剪切板的内容转化为流: @clip(options) // 获取剪切板的内容 一、 options为true|1或者function使用text 1. function: 修正剪切板的内容为流入参(text),遵循 parseFunction 二、如果options为空|字符串[sep]或者 { sep, keepEmpty, inFormat, format },则会对剪切板的内容进行解析或者切割 1. 如果剪切板中的能解析为数组,则使用解析的数组为初始值 2. 如果设置了 sep,则用sep分割为数组 3. 否则如果剪切板的字符串是多行,则用 /\r?\n/ 分割 4. 否则用 /\s+|,|,|;|;/ 分割为数组,空格|逗号|分号|中文逗号|中文分号 5. 如果keepEmpty为true,则获保留空白的行,默认是过滤掉空白的行 6. 可以使用inFormat修改item,遵循 parseFunction 7. 可以使用format修改list,遵循 parseFunction 例子: @clip() // 默认分割 @clip(1|true) // 使用text @clip(text=>...) // 用函数修正text @clip(',') // 使用,分割 @clip({ sep, keepEmpty, inFormat, format }) // 分割并修正入参

@excel

将excel的内容转化为流: @excel(file, { sheet = 0, startRow = 1, startCol = 1, hasTitle: true }) sheet:第几个sheet, 从0开始 startRow: 第几行, 从1开始 startCol: 第几列, 从1开始 hasTitle: 是否有标题

@json

将json文件的内容转化为流: @json(file, type) type默认为空, 可取值: module, function 默认: 内容如: [{1, _.random(1, 10), 2}] module: 内容如: module.exports = [1,2,3] function: 内容如: ({ _, moment, utils })=>[{1, _.random(1, 10), 2}]

@dir

扫描文件夹转化为流: @dir(dir, { type, format }) 如果 type === 1, 显示文件夹列表 如果 type === 2, 显示文件列表 默认type为空, 显示所有列表 可以使用format修改list list 格式为: [{isdir: true, name: 'xx', fullname: 'yy/xx'}, { name: 'xx.js', purename: 'xx', extname: '.js', fullname: 'yy/xx.js'}]

@file

将文件内容转化为流: @file(file, { isText, sep, format, keepEmpt, encoding }) 1. encoding 默认为 utf-8 (其他选项与clip一致) 一、 options为true|1或者options.isText为true或者function使用text 1. function: 修正剪切板的内容为流入参(text),遵循 parseFunction 二、如果options为空|字符串[sep]或者 { sep, keepEmpty, inFormat, format },则会对剪切板的内容进行解析或者切割 1. 如果剪切板中的能解析为数组,则使用解析的数组为初始值 2. 如果设置了 sep,则用sep分割为数组 3. 否则如果剪切板的字符串是多行,则用 /\r?\n/ 分割 4. 否则用 /\s+|,|,|;|;/ 分割为数组,空格|逗号|分号|中文逗号|中文分号 5. 如果keepEmpty为true,则获保留空白的行,默认是过滤掉空白的行 6. 可以使用inFormat修改item,遵循 parseFunction 7. 可以使用format修改list,遵循 parseFunction 例子: @file(file) // 默认分割 @file(file, 1|true) // 使用text @file(file, text=>...) // 用函数修正text @file(file, ',') // 使用,分割 @file(file, { isText: 1 }) // 使用text @file(file, { sep, keepEmpty, inFormat, format }) // 分割并修正入参

@mongodb

读取mongodb转化为流: @mongodb({ uri = 'mongodb://localhost:27017', database, table, cond, sort, count=1 }) 通过cond条件按照sort排序查找database中table的数据列表 默认数量为1 例: xkettle -s "@mongodb({database: 'test', table: 'member'})->log()"

@mysql

读取mysql转化为流: @mysql({ host = 'localhost', port = 3306, user = 'root', password, database, table, sql, count=1 }) 通过sql查找database中table的数据列表 默认sql为: select * from database limit count 例: xkettle -s "@mysql({database: 'test', table: 'member'})->log()"

@oracle

读取oracle转化为流: @oracle({ user, password, connectString, table, sql, count = 1 }) 通过sql查找database中table的数据列表 默认sql为: select * from database where rownum<= count

@sqlserver

读取sqlserver转化为流: @sqlserver({ user, password, server, database, table, sql, count = 1 }) 通过sql查找database中table的数据列表 默认sql为: select top count * from database

log

打印流日志: ->log({ inFormat }) inFormat: chunk格式化,遵循 parseFunction

field

字段转化: ->field(list, hasOldName = false) list: [ ['a->b', o => ...], // 将旧的字段 a 修改为新字段 b, 值得变换为函数转化,其中参数为 value[a] 'a', // 保留原来得 a 字段 { name: 'a', newName: 'b', value: o => ... }, // 将旧的字段 a 修改为新字段 b, 值得变换为函数转化,其中参数为 value[a] { name: 'a', value: '$+50+_.random(1, 10)' }, // 参见 parseFunction { name: 'a', newName: 'b' }, // 将旧的字段 a 修改为新字段 b, 值不变 { name: '$', newName: 'b' }, // 使用新得字段 b 代替原来的根值 { name: 'a', newName: '$' }, // 使用旧的字段 a 作为根值 { name: 'm', value: 5 }, // 设置新字段m,值为5 { name: 'm', value: '=>$$.a' }, // 设置新字段m,值为原来值的a字段 ] hasOldName: true|[false], // 是否包含旧的的字段,如果包含,则用chunk,否则用{}为初始化对象

flat

将数组类型thunk的每一项推送到流中: ->flat()

format

格式化: ->format(type, inFormat) type: 格式: 0: js 1: json 2:inline-js 3:inline-json inFormat: 修正流入参,遵循 parseFunction

例子: ->format() // 不做任何转换 ->format(0) // 转化为js模式 ->format(o=>JSON.stringify(o)) // 转化为JSON字符串 ->format(0, o=>`[${o}]`) // 先转化为js模式,在添加中括号

map

映射: ->map(field|function) 同lodash

object

纯Object格式化: ->object() 转化为纯Object格式,原理: JSON.parse(JSON.stringify(chuck))

wait

等待: ->wait(ms) ms: 等待毫秒数

get

http get请求: ->get({ url, inFormat, outFormat }) url: 请求的url inFormat: chunk格式化,遵循 parseFunction outFormat: get结果输出格式化,遵循 parseFunction

post

http post请求: ->post({ url, inFormat, outFormat }) url: 请求的url inFormat: chunk格式化,遵循 parseFunction outFormat: get结果输出格式化,遵循 parseFunction

sort

流排序: ->sort([iteratees=[.identity]], [orders]) 参考: lodash 的 sortBy 允许指定 iteratee(迭代函数)结果如何排序。 如果没指定 orders(排序),所有值以升序排序。 否则,指定为"desc" 降序,或者指定为 "asc" 升序,排序对应值。 [iteratees=[.identity]] (Array[]|Function[]|Object[]|string[]): 排序的迭代函数 [orders] (string[]): iteratees迭代函数的排序顺序。 例子: sort(['a', 'b'], ['asc', 'desc']); // 先按照 a 升序,再按照 b 降序 sort(['a', 'b'], [1, -1]); // 先按照 a 升序,再按照 b 降序 sort(); // 先按照本身升序 sort('desc // 先按照本身降序 sort('a // 先按照 a 字段升序 sort('a', 'desc // 先按照 a 字段降序 sort('a.b', 'desc // 先按照 a.b 字段降序 sort(o=>o.b, 'desc // 先按照 o=>o.b的返回值降序

uniq

去重: ->uniq(func) 如果func为空,则按照JSON.stringify(sortObject(chuck)))来去重 否则按照func的返回值obj传入JSON.stringify(sortObject(obj)))来去重

array

合并流: ->array() 将stream中的每一个thunk合并到一个数组[chunk, chunk, ...]后再加入到流中

slice

截取流: ->slice(start, count) 从stream中截取从start开始的count个thunk,start不能为负数

split

分割流: @split(sep, { format, keepEmpty }) 切割为数组后再加入到流中 1. 如果设置了 sep,则用sep分割为数组 2. 否则如果剪切板的字符串是多行,则用 /\r?\n/ 分割 3. 否则用 /\s+|,|,|;|;/ 分割为数组,空格|逗号|分号|中文逗号|中文分号 4. 如果keepEmpty为true,则获保留空白的行,默认是过滤掉空白的行 5. 可以使用format修改list @split({ keepEmpty: true }) // 保留空白的行

filter

过滤流: ->filter(func) 如果func返回的是true则通过,否则会被过滤掉,如果func为空,则不过滤

group

分组流: ->group(groupKey, { [key]: '1', // 取第一个值 [key]: '-1', // 取最后一个值 [key]: '1+', // 取第一个非空值 [key]: '-1+', // 取最后一个非空值 [key]: '+', // 取和 [key]: '/', // 取平均 [key]: '*', // 取乘积 [key]: '_', // 取方根 [key]: 'm', // 取中位数 [key]: 'l', // 取数组 })

script

按照脚本修改流数据: ->script(file) 将file使用parseFunction解析为函数后执行`const obj = await func(chunk, { _, moment, utils })`,然后将obj加入到流中 parseFunction: function :直接返回为函数 字符串: '=>123' :返回 123,可以使用 $, _, moment, utils, $$ 等符号 '=$123' :返回 input123 其中 $ 代表当前参数,直接替换 'return 123' :与 '=>123'相同,返回 123,可以使用 $, , moment, utils, $$ 等符号 '($, {, moment, utils, $$})=>123' :返回 123 '@1.js' :返回1.js中exports的函数 其他: 直接返回字符串

html

爬取html: ->html({ encoding = 'utf-8', inFormat, outFormat }) encoding: 默认是 utf-8, 可以是 gb2312|utf-8|GBK,解决网页汉字乱码的问题 inFormat: 修正流入参,遵循 parseFunction outFormat: 修正流出参,遵循 parseFunction 爬虫规则: 流入参格式: { html, selector } 或者 { url, selector } 如果流入参的selector字段是对象,格式为: { group, key: [el, prop]},用来爬取数组数据,group为每一项元素(为空时只有一项数据), 每一项key为结果键值,el为dom元素,prop为属性(空时为值) 如: xkettle -s "@list([{ html: '<div class=\"item\"><a href=\"href\">name

', selector: { group:'.item', name: ['a'], url: ['a', 'href'] } }])->html()->log()"

  如果流入参的selector字段是字符串,则使用 temme 规则,如:  .item>p@{&{$}} , 参考: https://temme.js.org
  如: xkettle -s "@list([{ html: '<div class=\\"item\\"><a href=\\"href\\">name</a></div>', selector: '.item@{a{\\$name};a[href=\\$url];}' }])->html()->log()"

  如果流入参的selector字段是函数,则返回jquery的$,如: $=>$('.text').html(),使用 cheerio 解析
  如: xkettle -s "@list([{ html: '<div class=\\"item\\"><a href=\\"href\\">name</a></div>', selector: \\$=>({name:\\$('.item a').html(), href:\\$('.item a').attr('href')}) }])->html()->log()"

  如果出参是数组,则流出参扩展为多层流,如果不想被扩展,使用 outFormat 封装为 object

temme 语法

支持单行注释 // ...... 与块状注释 /* ...... */,与 JavaScript 保持一致。
[foo=$xxx] 放在 CSS 选择器特性匹配部分,用于捕获该特性的值
{$xxx} 放在 CSS 选择器之后的花括号内,用于捕获元素的文本内容

<a href="xx">out<span>in</span></a>
a[href=$href]{$txt} -> { href: 'xx', txt: 'outin' }
a{ $text }; -> {text: 'outin'} // 获取包含的文本
a{ $hasAnchor = true }; -> { hasAnchor: true } // 常量赋值
a{ html($html) }; -> { html: 'out<span>in</span>' } // 获取html
a{ find('out', $website) };; -> { website: 'in' }// 查找

<ul><li data-fruit-id="1"><span data-color="red">apple</span></li></ul>

数组 li@fruits{span[data-color=$color]{$name}&[data-fruit-id=$id];} -> {fruits: [{ color: 'red', name: apple, id: '1' }]} 分割属性

li@fruits{ span[data-color=$color]{$name}};
li@ids{&[data-fruit-id=$id];} -> {fruits: [{ color: 'red', name: apple}], ids: [{id: '1' }]}

赋值的例子

$top = 'level';
ul { $hasUlElement = true };
div { $hasDivElement = true };
li@array {
    $row = true;
    $isRed = false;
    [data-color=red]{ $isRed = true };
}; -> { top: 'level', hasUlElement: true, array: [ { row: true, isRed: true } ] }
过滤器
$foo|xxx 放在值捕获的右边;xxx 是过滤器的名字
@bar|xxx 放在数组捕获的右边;
$foo|xxx(arg1, arg2, ...) 过滤器可以接受若干个参数;每一个参数都是一个 JavaScript 字面量;
$foo|f1(a,b)|f2 过滤器可以进行串联。
Structure Manipulation Filters: 该部分包括 pack,flatten,compact,first,last,get。
Type Coercion Filters: 该部分包括 String,Number,Date,Boolean。这些过滤器用于将输入转换为指定的类型。
Prototype Filters: 我们可以使用来自原型链的方法。举个例子,如果我们可以保证 x 每次被捕获的时候其类型总是字符串, 那么我们可以安全地使用 $x|substring(0, 20) 或是 $x|toUpperCase 或是 $x|trim。

temme('

1 22 333 4444
', div{ $|split(' ')||Number }) -> [1, 22, 333, 4444]

tr@{ &[class=$class]; >td@list{&{$text}} } -> [{class:'...', list: [{text: '...'}, ...]}, ...]

tr@{
    >td@{
        &[bgcolor="#c4dcf3"]{ $label = true };
        &[class="color"]{ $label = true };
        &[colspan=$colspan][rowspan=$rowspan]{html($text)};
    }
}
-> { label: true, colspan: '2', text: '姓&nbsp;&nbsp;名' }
dhtml

获取动态网页html: ->dhtml({ encoding = 'utf-8', inFormat, outFormat, executablePath }) encoding: 默认是 utf-8, 可以是 gb2312|utf-8|GBK,解决网页汉字乱码的问题,只适用于流入参存在html inFormat: 修正流入参,遵循 parseFunction outFormat: 修正流出参(html),遵循 parseFunction executablePath: puppeteer使用的浏览器exe路径,默认为: C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe 流入参数: 流入参格式: { url, selector, prepares, hasCookie } 流入参的selector字段是类如 div, .clasName, #id 等选择器,用于网页判断该组件是否被加载 prepares 执行输入和点击,如登陆等问题: 如: input[name='username']:admin;input[name='password']:123456;button:click hasCookie 是否使用 Cookie 实例: xkettle -s "@list([{ url: 'https://www.meipian.cn/2lsnwc89', selector: '.mp-article-item-area'}])->dhtml({ outFormat: o=>({ html: o, selector: '.mp-article-item-area' }) })->log()"

article

图文爬虫: ->article({ encoding='utf-8', inFormat, outFormat, srcName, imagePath, seprateLevel=1 }) encoding: 默认是 utf-8, 可以是 gb2312|utf-8|GBK,解决网页汉字乱码的问题,只适用于流入参存在html inFormat: 修正流入参,遵循 parseFunction outFormat: 修正流出参(list),遵循 parseFunction srcName: 图片的src名称,默认为src,如果为多个,用逗号隔开,优先级高的在前面,如: data-src,src imagePath: 图片保存的地址,如果为空,则不保存图片,使用网络地址 seprateLevel: 默认是1,分段落的极数,如果等于这个等级后,子级所有的text合并为一行 流入参数: 流入参格式: { html, selector } 或者 { url, selector } 流入参的selector字段是类如 div, .clasName, #id 等选择器 以selector为根节点,搜索所有子节点的图文,格式为: [{ text: 'xx'}, { url: 'xx'}] 如果没有 selector, 则以现有的根节点为根节点

imageSave

保存图片: ->imageSave({ urlName = 'url', path = '.', inFormat, outFormat }) urlName: 需要下载的图片的url的字段名称,默认为url,执行后会被替换为新的url path: 图片下载的路径,新的url为: path + uuid + extname inFormat: 修正流入参,遵循 parseFunction outFormat: 修正流出参(list),遵循 parseFunction

console

输出到控制台,流不变 ->console(type, copy) type: 0: js 1: json 2:inline-js 3:inline-json 如果type是函数,则使用函数修正list,遵循 parseFunction 如果type是字符串, 逐行打印inline-js格式,每行后面追加该字符串 copy: 拷贝到剪切板 例子: ->console() // 逐行打印如果是字符串,则打印原值,否则用inline-js格式 ->console(',') // 逐行打印如果是字符串,则打印原值,否则用inline-js格式,每行后面追加,号 ->console('!,') // 逐行打印强制用inline-js格式,每行后面追加,号 ->console(0) // 逐行打印js格式 ->console(2) // 逐行打印inline-js格式 ->console(10) // 打印所有list为js格式 ->console(12) // 打印所有list为inline-js格式 ->console(list=>JSON.stringify(list)) // 打印所有list为JSON字符串

excel

写入到excel文件,流不变 ->excel(file, sheetName = 'Sheet1') 如果object是对象,则第一版就是对象的keys

md

写入到markdown文件,流不变 ->md(file)

text

->text(file, widths = {}) widths指定字段宽度,可以使用key和index指定,默认为20

file

写入到文件,流不变 ->file(file, { inFormat, begin, end }) 如果解析file为字符串,则所有的流都写入到该名称文件中 如果解析file为函数,则文件名为: file(chunk, { _, moment, utils }),每个流分别写入不同的文件 inFormat格式化thunk,遵循 parseFunction begin为开头,end为尾部,每行都有都有头和尾,写入格式如下: 格式: [begin] ${o => inFormat(o)} ... [end]

json

写入到json文件,流不变 ->json(file, { inFormat }) inFormat格式化thunk,遵循 parseFunction 写入JSON.stringify(obj)数据

js

写入到js文件,流不变,会自动添加module.exports导出结果 ->js(file, { type = 0, inFormat }) type: 0: js 1: json 2:inline-js 3:inline-json inFormat格式化thunk,遵循 parseFunction

mongodb

写入到mongodb,流不变 ->mongodb({ uri = 'mongodb://localhost:27017', database, table }) 将数据写入道mongodb的数据库database的table中

mysql

写入到mysql,流不变 ->mysql({ host = 'localhost', port = 3306, user = 'root', password, database, table, fields }) 将数据写入道mysql的数据库database的table中 如果没有表,需要传入fields创建表,如: { phone: 'VARCHAR(11)', password: 'VARCHAR(50)' }

oracle

写入到oracle,流不变 ->oracle({ user, password, connectString, table, fields }) 将数据写入道oracle的数据库database的table中 如果没有表,需要传入fields创建表,如: { phone: 'VARCHAR(11)', password: 'VARCHAR(50)' }

sqlserver

写入到sqlserver,流不变 ->sqlserver({ user, password, server, database, table, fields }) 将数据写入道sqlserver的数据库database的table中 如果没有表,需要传入fields创建表,如: { phone: 'VARCHAR(11)', password: 'VARCHAR(50)' }

  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
© 2025 Microsoft