├── .github ├── dependabot.yml ├── stale.yml └── workflows │ ├── greetings.yml │ └── traffic2badge.yml ├── .gitignore ├── .npmrc ├── Flow Codec.alfredworkflow ├── Flow Search.alfredworkflow ├── Flow Search ├── package.json ├── src │ └── search.js └── yarn.lock ├── Flow Tool.alfredworkflow ├── Flow Tool ├── package.json ├── src │ └── flow │ │ ├── common.js │ │ └── run.js └── yarn.lock └── README.md /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # see https://github.com/yi-Xu-0100/traffic-to-badge/blob/main/.github/dependabot.yml 2 | version: 2 3 | updates: 4 | # Enable version updates for npm 5 | - package-ecosystem: 'npm' 6 | directory: '/' 7 | schedule: 8 | interval: 'daily' 9 | # Maintain dependencies for GitHub Actions 10 | - package-ecosystem: 'github-actions' 11 | directory: '/' 12 | schedule: 13 | interval: 'daily' 14 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Configuration for probot-stale - https://github.com/probot/stale 2 | 3 | # Number of days of inactivity before an Issue or Pull Request becomes stale 4 | daysUntilStale: 60 5 | 6 | # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. 7 | # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. 8 | daysUntilClose: 7 9 | 10 | # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) 11 | onlyLabels: [] 12 | 13 | # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable 14 | exemptLabels: 15 | - pinned 16 | - security 17 | - "[Status] Maybe Later" 18 | 19 | # Set to true to ignore issues in a project (defaults to false) 20 | exemptProjects: false 21 | 22 | # Set to true to ignore issues in a milestone (defaults to false) 23 | exemptMilestones: false 24 | 25 | # Set to true to ignore issues with an assignee (defaults to false) 26 | exemptAssignees: false 27 | 28 | # Label to use when marking as stale 29 | staleLabel: wontfix 30 | 31 | # Comment to post when marking as stale. Set to `false` to disable 32 | markComment: > 33 | This issue has been automatically marked as stale because it has not had 34 | recent activity. It will be closed if no further activity occurs. Thank you 35 | for your contributions. 36 | 37 | # Comment to post when removing the stale label. 38 | # unmarkComment: > 39 | # Your comment here. 40 | 41 | # Comment to post when closing a stale Issue or Pull Request. 42 | # closeComment: > 43 | # Your comment here. 44 | 45 | # Limit the number of actions per hour, from 1-30. Default is 30 46 | limitPerRun: 30 47 | 48 | # Limit to only `issues` or `pulls` 49 | # only: issues 50 | 51 | # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': 52 | # pulls: 53 | # daysUntilStale: 30 54 | # markComment: > 55 | # This pull request has been automatically marked as stale because it has not had 56 | # recent activity. It will be closed if no further activity occurs. Thank you 57 | # for your contributions. 58 | 59 | # issues: 60 | # exemptLabels: 61 | # - confirmed -------------------------------------------------------------------------------- /.github/workflows/greetings.yml: -------------------------------------------------------------------------------- 1 | name: Greetings 2 | 3 | on: [pull_request, issues] 4 | 5 | jobs: 6 | greeting: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/first-interaction@v1 10 | with: 11 | repo-token: ${{ secrets.GITHUB_TOKEN }} 12 | issue-message: 'Welcome your first issue here, thanks' 13 | pr-message: 'Welcome your first pr here, thanks' 14 | -------------------------------------------------------------------------------- /.github/workflows/traffic2badge.yml: -------------------------------------------------------------------------------- 1 | name: traffic2badge 2 | on: 3 | push: 4 | branches: 5 | - master 6 | schedule: 7 | - cron: '1 0 * * *' #UTC 8 | 9 | jobs: 10 | run: 11 | name: Make GitHub Traffic to Badge 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout Code 15 | uses: actions/checkout@v2.3.3 16 | 17 | - name: Get Commit Message 18 | id: message 19 | uses: actions/github-script@v3.0.0 20 | env: 21 | FULL_COMMIT_MESSAGE: '${{ github.event.head_commit.message }}' 22 | with: 23 | result-encoding: string 24 | script: | 25 | var message = `${process.env.FULL_COMMIT_MESSAGE}`; 26 | core.info(message); 27 | if (message != '') return message; 28 | var time = new Date(Date.now()).toISOString(); 29 | core.info(time); 30 | return `Get traffic data at ${time}`; 31 | 32 | - name: Set Traffic 33 | id: traffic 34 | uses: yi-Xu-0100/traffic-to-badge@v1.1.5 35 | with: 36 | my_token: ${{ secrets.TRAFFIC_TOKEN }} 37 | #(default) static_list: ${{ github.repository }} 38 | #(default) traffic_branch: traffic 39 | #(default) views_color: brightgreen 40 | #(default) clones_color: brightgreen 41 | #(default) logo: github 42 | 43 | - name: Deploy 44 | uses: peaceiris/actions-gh-pages@v3.7.3 45 | with: 46 | github_token: ${{ secrets.GITHUB_TOKEN }} 47 | publish_branch: ${{ steps.traffic.outputs.traffic_branch }} 48 | publish_dir: ${{ steps.traffic.outputs.traffic_path }} 49 | user_name: 'github-actions[bot]' 50 | user_email: 'github-actions[bot]@users.noreply.github.com' 51 | full_commit_message: ${{ steps.message.outputs.result }} 52 | 53 | - name: Show Traffic Data 54 | run: | 55 | echo ${{ steps.traffic.outputs.traffic_branch }} 56 | echo ${{ steps.traffic.outputs.traffic_path }} 57 | cd ${{ steps.traffic.outputs.traffic_path }} 58 | ls -a 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | beast.js 2 | node_modules 3 | *.png 4 | info.plist -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | # .npmrc 2 | registry=https://registry.npmjs.org/ 3 | -------------------------------------------------------------------------------- /Flow Codec.alfredworkflow: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MuYunyun/flow/ace558c1cedfa69f451d1e6c33a8010e63dc1c95/Flow Codec.alfredworkflow -------------------------------------------------------------------------------- /Flow Search.alfredworkflow: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MuYunyun/flow/ace558c1cedfa69f451d1e6c33a8010e63dc1c95/Flow Search.alfredworkflow -------------------------------------------------------------------------------- /Flow Search/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flow", 3 | "version": "0.5.1", 4 | "description": "work flow enhance", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/MuYunyun/flow.git" 11 | }, 12 | "author": "muyunyun (muyy95@gmail.com)", 13 | "license": "MIT", 14 | "dependencies": { 15 | "run-node": "^2.0.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Flow Search/src/search.js: -------------------------------------------------------------------------------- 1 | const item = process.argv[2] 2 | const keyword = process.argv[3] 3 | const https = require('https') 4 | const path = require('path') 5 | 6 | const { join } = path 7 | let content = '' 8 | let result_array = [] 9 | 10 | const options = { 11 | 'zhihu': { 12 | host: 'www.zhihu.com', 13 | path: '/autocomplete?token=' + encodeURI(keyword), 14 | url: 'https://www.zhihu.com/' 15 | }, 16 | 'taobao': { 17 | host: 'suggest.taobao.com', 18 | path: '/sug?code=utf-8&q=' + encodeURI(keyword), 19 | url: 'https://s.taobao.com/search?q=', 20 | }, 21 | 'jd': { 22 | host: 'dd-search.jd.com', 23 | path: '/?ver=2&key=' + encodeURI(keyword), 24 | headers: { 'Referer': 'https://www.jd.com/' }, 25 | url: 'https://search.jd.com/Search?enc=utf-8&keyword=' 26 | }, 27 | // Todo: 掘金网站当前实现目前访问失败,待调整(欢迎 mr)。 28 | 'juejin': { 29 | hostname: 'web-api.juejin.im', 30 | method: 'post', 31 | path: '/query', 32 | headers: { 33 | 'Content-Type': 'application/json', 34 | 'X-Agent': 'Juejin/Web', 35 | } 36 | }, 37 | 'github': { 38 | host: 'api.github.com', 39 | path: '/search/repositories?q=' + encodeURI(keyword) + '&sort=stars', 40 | headers: { 'User-Agent': 'MuYunyun' } 41 | } 42 | }[item] 43 | 44 | function getData(handleDataFn) { 45 | https.get(options, (res) => { 46 | res.on('data', (chunk) => { 47 | content += chunk 48 | }).on('end', () => { 49 | const jsonContent = JSON.parse(content) 50 | handleDataFn(jsonContent) 51 | }) 52 | }) 53 | } 54 | 55 | function getJueJin(handleDataFn) { 56 | const req = https.request(options, (res) => { 57 | res.setEncoding('utf8'); 58 | res.on('data', (chunk) => { 59 | content += chunk; 60 | }).on('end', () => { 61 | const jsonContent = JSON.parse(content); 62 | handleDataFn(jsonContent); 63 | }); 64 | }); 65 | req.write(JSON.stringify({ 66 | extensions: { 67 | query: { id: 'a53db5867466eddc50d16a38cfeb0890' }, 68 | }, 69 | operationName: '', 70 | query: '', 71 | variables: { 72 | after: '', 73 | first: 100, 74 | period: 'ALL', 75 | query: keyword, 76 | type: 'ARTICLE', 77 | order: 'POPULAR', 78 | }, 79 | })); 80 | req.end(); 81 | } 82 | 83 | function showItem(resultArray) { 84 | content = '' 85 | result_array = [] 86 | console.log(JSON.stringify({ 87 | items: resultArray 88 | })) 89 | } 90 | 91 | const getPath = (relativePath) => { 92 | return join(__dirname, relativePath) 93 | } 94 | 95 | if (item === 'zhihu') { 96 | getData((jsonContent) => { 97 | const result = jsonContent[0] 98 | const { url } = options 99 | for (let i = 1; i < result.length - 2; i++) { 100 | const type = result[i][0] 101 | switch (type) { 102 | case 'topic': 103 | result_array.push({ 104 | title: result[i][1], 105 | subtitle: ` 【话题】 ${result[i][6]}个精华问答`, 106 | arg: `${url}${type}/${result[i][2]}`, 107 | icon: { 108 | path: join(__dirname, '../0A1F8331-941F-436E-B246-33278755D60A.png'), 109 | } 110 | }) 111 | break 112 | case 'people': 113 | result_array.push({ 114 | title: result[i][1], 115 | subtitle: ` 【用户】 ${result[i][5]}`, 116 | arg: `${url}${type}/${result[i][2]}`, 117 | icon: { 118 | path: join(__dirname, '../0A1F8331-941F-436E-B246-33278755D60A.png'), 119 | } 120 | }) 121 | break 122 | case 'question': 123 | result_array.push({ 124 | title: result[i][1], 125 | subtitle: ` 【内容】 ${result[i][5]}个回答`, 126 | arg: `${url}${type}/${result[i][3]}`, 127 | icon: { 128 | path: join(__dirname, '../0A1F8331-941F-436E-B246-33278755D60A.png'), 129 | } 130 | }) 131 | break 132 | case 'article': 133 | result_array.push({ 134 | title: result[i][1], 135 | subtitle: ` 【内容】 ${result[i][4]}次赞同`, 136 | arg: `https://zhuanlan.zhihu.com/p/${result[i][3]}`, 137 | icon: { 138 | path: join(__dirname, '../0A1F8331-941F-436E-B246-33278755D60A.png'), 139 | } 140 | }) 141 | break 142 | } 143 | } 144 | showItem(result_array) 145 | }) 146 | } else if (item === 'taobao') { 147 | getData((jsonContent) => { 148 | const { result } = jsonContent 149 | for (let i = 0; i < result.length; i++) { 150 | result_array.push({ 151 | title: result[i][0], 152 | subtitle: ` 共搜索到 ${result[i][1]} 个相关物品`, 153 | arg: `${options.url}${result[i][0]}`, 154 | icon: { 155 | path: join(__dirname, '../E8F85589-F67A-4DC4-A472-E781462F41BF.png'), 156 | }, 157 | }) 158 | } 159 | showItem(result_array) 160 | }) 161 | } else if (item === 'jd') { 162 | getData((jsonContent) => { 163 | for (let i = 0; i < jsonContent.length; i++) { 164 | result_array.push({ 165 | title: jsonContent[i].keyword, 166 | arg: `${options.url}${jsonContent[i].keyword}`, 167 | icon: { 168 | path: join(__dirname, '../CF658493-2BBB-4571-A332-86BFBCCB5AFB.png'), 169 | }, 170 | }) 171 | } 172 | showItem(result_array) 173 | }) 174 | } else if (item === 'juejin') { 175 | getJueJin((jsonContent) => { 176 | const result = jsonContent.data.search.edges; 177 | for (let i = 0; i < result.length; i++) { 178 | const item = result[i].node.entity; 179 | const author = item.user; 180 | result_array.push({ 181 | title: item.title, 182 | subtitle: `点赞数${item.collectionCount} 作者: ${author.username}${author.jobTitle ? `(${author.jobTitle})` : ''}`, 183 | arg: item.originalUrl, 184 | icon: { 185 | path: join(__dirname, '../17C80585-EC4F-498F-AB91-DBA6EBEA4C9D.png'), 186 | }, 187 | mods: { 188 | cmd: { 189 | arg: item.originalUrl, 190 | subtitle: item.content, 191 | }, 192 | }, 193 | }); 194 | } 195 | showItem(result_array); 196 | }); 197 | } else if (item === 'github') { 198 | getData((jsonContent) => { 199 | const result = jsonContent.items 200 | for (let i = 0; i < 9; i++) { 201 | result_array.push({ 202 | title: result[i].name, 203 | subtitle: `${result[i].stargazers_count} Star (${result[i].description})`, 204 | arg: result[i].html_url, 205 | icon: { 206 | path: join(__dirname, '../29EFA025-C5F1-468D-B065-59EF0C026D11.png') 207 | } 208 | }) 209 | } 210 | showItem(result_array) 211 | }) 212 | } 213 | -------------------------------------------------------------------------------- /Flow Search/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | run-node@^2.0.0: 6 | version "2.0.0" 7 | resolved "http://r.cnpmjs.org/run-node/download/run-node-2.0.0.tgz#0f598db2bf1cca3cc972abdb6f48c1f40cb29317" 8 | integrity sha1-D1mNsr8cyjzJcqvbb0jB9Ayykxc= 9 | -------------------------------------------------------------------------------- /Flow Tool.alfredworkflow: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MuYunyun/flow/ace558c1cedfa69f451d1e6c33a8010e63dc1c95/Flow Tool.alfredworkflow -------------------------------------------------------------------------------- /Flow Tool/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flow", 3 | "version": "0.5.1", 4 | "description": "work flow enhance", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/MuYunyun/flow.git" 11 | }, 12 | "author": "muyunyun (muyy95@gmail.com)", 13 | "license": "MIT", 14 | "dependencies": { 15 | "run-node": "^2.0.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Flow Tool/src/flow/common.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs") 2 | const path = require("path") 3 | const { promisify } = require("util") 4 | 5 | const readdirAsync = promisify(fs.readdir) 6 | const keyword = process.argv[2] 7 | // 类型。当前存在 open、code 类型,执行 open 命令打开 gitlab/github 对应项目;执行 code 使用 vscode 打开对应项目; 8 | const type = process.argv[3] 9 | const homedir = require("os").homedir() 10 | 11 | let operatePath = '' 12 | 13 | if (type === 'code') { 14 | operatePath = process.env.codePath 15 | } else if (type === 'open') { 16 | operatePath = process.env.openPath 17 | } 18 | 19 | const projectDir = path.join(homedir, operatePath) 20 | 21 | ;(async function () { 22 | const items = (await readdirAsync(projectDir)) 23 | .filter(name => name.includes(keyword)) 24 | .map(name => ({ 25 | title: name, 26 | // 按回车后,alfred 会把变量 arg 传递给下个步骤。此处使用 JSON.stringify 避免 alfred 会产生多余的回车 \n 字段,以及造成流水线节点无法解析对象中 key 的问题。 27 | arg: JSON.stringify({ 28 | name, 29 | type 30 | }) 31 | })) 32 | console.log( 33 | JSON.stringify({ 34 | items 35 | }) 36 | ) 37 | })() 38 | -------------------------------------------------------------------------------- /Flow Tool/src/flow/run.js: -------------------------------------------------------------------------------- 1 | const { exec, execSync } = require('child_process') 2 | 3 | const argv = process.argv 4 | const { name, type } = JSON.parse(argv[2]) 5 | 6 | const codePath = process.env.codePath 7 | const openPath = process.env.openPath 8 | 9 | switch (type) { 10 | case 'code': 11 | exec(`/usr/local/bin/code ~/${codePath}/${name}`) 12 | break; 13 | case 'open': 14 | const remoteUrl = execSync(`cd ~/${openPath}/${name} && echo "$(git config --get remote.origin.url)"`).toString() 15 | // 将 gitlab@xx.xx.xx:demo.git 转化为 http://xx.xx.xx/demo.git 16 | const result = remoteUrl 17 | .replace(/:(?!\/)/g, '/') // 使用 ?!\/ 避免 https://xxx 中的 : 被转化为 /。 18 | .replace('gitlab@', 'http://') 19 | 20 | console.log(result) 21 | break; 22 | default: 23 | } 24 | -------------------------------------------------------------------------------- /Flow Tool/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | run-node@^2.0.0: 6 | version "2.0.0" 7 | resolved "http://r.cnpmjs.org/run-node/download/run-node-2.0.0.tgz#0f598db2bf1cca3cc972abdb6f48c1f40cb29317" 8 | integrity sha1-D1mNsr8cyjzJcqvbb0jB9Ayykxc= 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![GitHub views](https://raw.githubusercontent.com/MuYunyun/flow/traffic/traffic-flow/views.svg) 2 | 3 | > 工欲善其事,必先利其器。Don't repeat yourself(DRY). 4 | 5 | - [快捷搜索跳转](#快捷搜索跳转) 6 | - [Github](#github) 7 | - [知乎](#知乎) 8 | - [淘宝](#淘宝) 9 | - [京东](#京东) 10 | - [掘金](#掘金) 11 | - [工作提效](#工作提效) 12 | - [快速打开到项目对应的 github/gitlab 链接](#快速打开到项目对应的-githubgitlab-链接) 13 | - [使用 VSCode 快速打开项目文件](#使用-vscode-快速打开项目文件) 14 | - [一键切换网络代理](#一键切换网络代理) 15 | - [百宝箱](#百宝箱) 16 | - [Base64 编码解码](#base64-编码解码) 17 | - [社区提效插件推荐](#社区提效插件推荐) 18 | - [简化文件移动到目标文件夹操作](#简化文件移动到目标文件夹操作) 19 | 20 | ## 快捷搜索跳转 21 | 22 | 1. [下载 Flow Search](https://github.com/MuYunyun/flow/raw/master/Flow%20Search.alfredworkflow) 23 | 2. 双击下载好的 `Flow Search.alfredworkflow` 文件, 自动完成安装。 24 | 25 | > 使用该插件需要[安装 node](https://nodejs.org/en/) 26 | 27 | ### Github 28 | 29 | * 触发 Key : `gh` 30 | 31 | ![](http://with.muyunyun.cn/c0f217c75c131b1ee93ab4c1d353ec42.jpg-400) 32 | 33 | ### 知乎 34 | 35 | * 触发 key : `zh` 36 | 37 | ![](http://with.muyunyun.cn/ef946bc5fe4d0fdb6474350bf31cf9fc.jpg-400) 38 | 39 | ### 淘宝 40 | 41 | * 触发 key : `tb` 42 | 43 | ![](http://with.muyunyun.cn/97f9f0513c1369886a812bbf6cd73b05.jpg-400) 44 | 45 | ### 京东 46 | 47 | * 触发 key : `jd` 48 | 49 | ![](http://with.muyunyun.cn/19e5ecbc5d38251e5ceeb145579faeb1.jpg-400) 50 | 51 | ### 掘金 52 | 53 | * 触发 key : `gold`, 按住 `cmd` 可以查看内容简介 54 | 55 | ![](http://with.muyunyun.cn/40a83edf9552b4a071dd2ff5093a445b.gif) 56 | 57 | ## 工作提效 58 | 59 | 1. [下载 Flow Tool](https://github.com/MuYunyun/flow/raw/master/Flow%20Tool.alfredworkflow) 60 | 2. 双击下载好的 `Flow Tool.alfredworkflow` 文件, 自动完成安装。 61 | 62 | > 使用该插件需要[安装 node](https://nodejs.org/en/) 63 | 64 | ### 快速打开到项目对应的 github/gitlab 链接 65 | 66 | https://github.com/MuYunyun/flow/assets/19354791/d67bf6bf-df0e-4fa4-9f8a-8f5acc04d831 67 | 68 | * 触发 key: open 69 | * 前置配置: 在环境配置中添加 openPath 参数与其对应的文件目录。 70 | 71 | ![image](https://github.com/MuYunyun/flow/assets/19354791/3b6e4974-d87b-4269-8909-6d5d87cc6840) 72 | 73 | ### 使用 VSCode 快速打开项目文件 74 | 75 | https://github.com/MuYunyun/flow/assets/19354791/c91e3633-52a9-4b2e-8752-004274b0ca9e 76 | 77 | * 触发 key: code 78 | * 前置配置: 在环境配置中添加 codePath 参数与其对应的文件目录。(配置图示同上 open 功能) 79 | 80 | ### 一键切换网络代理 81 | 82 | 在使用公司内部网络加速、开 vpn、使用 Charles 调试等场景下,需要频繁在路径 `System Preferences - Network - Advanced - Proxies` 下进行手动切换代理配置,十分繁琐。为此提供该 workflow 来简化配置链路。 83 | 84 | * 触发 key: pac 85 | * 选项 86 | * `clear all proxy`: 清空全部代理; 87 | * 场景:使用抓包工具(如 Charles.app)代理调试前一般需要清空全部代理,避免代理产生冲突。 88 | * `auto proxy discovery`: 设置自动代理模式; 89 | * 场景:让浏览器自动发现代理服务器,用于公司内部网络加速。 90 | * `global mode`: 设置全局代理模式; 91 | * 场景:用于科学上网; 92 | 93 | ![](http://with.muyunyun.cn/00dd758122c9cbde256f5d02518ad769.gif) 94 | 95 | ## 百宝箱 96 | 97 | ### Base64 编码解码 98 | 99 | 1. [下载 Flow Codec](https://github.com/MuYunyun/flow/raw/master/Flow%20Codec.alfredworkflow) 100 | 2. 双击下载好的 `Flow Codec.alfredworkflow` 文件, 自动完成安装。 101 | 102 | * 编码 103 | * 触发 key: Encode 104 | * 解码 105 | * 触发 key: Decode 106 | 107 | ## 社区提效插件推荐 108 | 109 | ### 简化文件移动到目标文件夹操作 110 | 111 | 场景:每次手动将选中文件移动到目标文件夹中的操作比较重复繁琐,比如笔者有将技术 PPT 移动到技术分享文件中,将书籍移动到书籍文件夹中的述求。 112 | 113 | 插件:[下载](https://github.com/zoff28/Alfred-Move-Copy-Files/releases/tag/v2.0.0) 114 | 115 | * 触发 key : `moveTo` 116 | 117 | https://github.com/MuYunyun/flow/assets/19354791/c4013171-8a45-4480-a8d7-7efe235b9905 118 | --------------------------------------------------------------------------------