GithubHelp home page GithubHelp logo

snippets's Introduction

snippets

一款用于快速输入的软件,参考 espanso 等项目。

初衷是因为工作需要输入大量中文模板。

因为非英文用户,如 snippet 数量大,如何思考缩写语,及处理缩写语冲突,带来的心智负担较大。

所以放弃了热字串缩写形式,采用搜索框方式.

序号 关键字 来源于哪一个文件 别名
1 test alias base ta

图片1

图片2

安装

  1. 根据 windows 系统选择软件版本,解压后使用

    • 32位, snippets_x86.zip
    • 64位, snippets_x64.zip
  2. 建议1920*1080分辨率, 因为界面是按这个分辨率布局的

  3. github地址: https://github.com/tyoul29/snippets

快速开始

  1. match/base.json 中设置 snippet 片段

    • 每条 snippet 格式为 "key": {"value": "replace text"},
    • 例如: "test placeholder":{"value":"abc"},
    • 如果 snippet 过多,可以设置多个 json 文件
  2. 按下 Ctrl+i, 弹出搜索框, 输入关键词

  3. 选中:

    • DOWN/UP Shift+Down/UP Ctrl+n/p 上、下移动选中
    • Shift+Left/Right Alt+k/j 上、下翻页
    • 输入框末尾输入 ;+数字 也能选中
  4. 选中输入:

    • Enter 或 Ctrl+j 或 shift+Enter 或 鼠标:
      • 用Enter选中可能出现一些问题,即中文输入法下Enter上屏英文时可能自动上屏选中
    • Ctrl+Enter 选中右边预览框中文本
      • 预览窗内文本可修改,使用tab可在 搜索框 和 预览框 跳转

文件组织

match文件夹, 用于设置各种 snippet

基础设置

  1. _match/base.json 中设置 snippet 片段

    • 每条 snippet 格式为 "key": {"value": "replace text"},
    • 例如: "test placeholder":{"value":"abc"},
  2. 可以使用别名(alias)的方式, 增加匹配灵活度

    • 如下, 搜索 test aliasta, 都会匹配 "test alias":{"value":"something", "alias": "ta"},
  3. 设置多个 json 文件, 便于管理

  4. 文件名如 base.json, base 会当成 标签(tag) 被搜索, 并出现在 搜索列表 第3列

  5. 无论是 placeholder 或 snippet 方式,都不支持 win11 下的 记事本,同时 backend 的 inject 也不支持

placeholder, 占位符方式

  1. 默认为 , 可以设置emoji, 如: 😊⏩■▬▮▶▷〓

    • 按下 zwf 后 再按 TAB
  2. 由于不支持转义, 所以设置的占位符不能在要替换的文本内出现, 这通常要设置为不常用的特殊字符

  3. 由于是为大部分窗口适用, 选择移动光标的方法, 而由于每个编辑器的 换行自动缩进/不能获取位置 等诸多问题 , 所以存在很多局限

    • 换行自动缩进的窗口, 不要在替换文本中使用换行
    • 因为无法获取光标位置,所以跳转只能向前,无法跳回
      • 用鼠标或按键改变光标位置后,跳转也会出现混乱, 可能造成误删
      • 如果改变光标位置, 手动移到上次位置
    • 尽管可以使用emoji,但因为部分窗口emoji长度为2, 但backspace数为1
    • 因为其他复杂情况,所以任何非〓占位符,其实是被替换为〓计算位置的, 所以即使占位符不是〓, 替换的文本内出现〓也是会被计算的

snippet, 代码片段方式

  1. 格式为: "test snippet":{"value":"just ${1:have} ${2}${3:fun}.${0}"},

  2. snippet,片段

    • 只支持 ${数字} 或 ${数字:文本}, 暂不支持 $数字
    • $后面的数字只是一个标识,并不代表顺序,只往前跳
    • 最后一个${0}, 尽量不包含text,不然jump_snippet_end最后会选中文本
      • 如想行尾加文本,尽量 ${数字:文本}${0}
  3. 由于是为大部分窗口适用, 选择移动光标的方法, 而由于每个编辑器的 换行自动缩进/不能获取位置 等诸多问题 , 所以存在很多局限

    • 因为无法获取光标位置,所以跳转只能向前,无法跳回
      • 用鼠标或按键改变光标位置后,跳转也会出现混乱, 可能造成误删
      • 如果改变光标位置, 手动移到上次位置
    • 部分编辑器内, 选中文本按 右键(right ->) 会多移动一个字符, 这也会造成错误
    • 换行自动缩进的窗口, 不要在替换文本中使用换行

config文件夹, 用于配置snippet方式, 和窗口样式等

default.json, 用于默认设置

{
    "key_start": {"value": "^i", "tooltip": "显示 snippet 界面"},
    "pinyin": {"value": 0, "tooltip": "是否使用拼音首字母用于搜索"},
    "max_count": {"value": 500, "tooltip": "搜索结果显示最大数量,太大可能出现搜索太慢, 以上仅在default.json中设置"},

    "snippet_method":{"value": "snippet", 
        "tooltip": "以下 default.json 及 非default.json 都可设置, default.json 必须设置,
        设置后为所有非指定窗口使用的默认规则. snippet/placeholder 默认使用当前窗口规则,
        只有在没有设置当前窗口时使用all的config"}, 
    "backend":{"value": "clipboard",
        "tooltip":"clipboard/inject,部分窗口禁止粘贴用inject,同时clipboard使用剪贴板
        ,如果你使用多重剪贴板的话会被污染"}, 
    "must_caret": {"value": 0, 
        "tooltip": "0/1, 是否必须有光标才启动,注意WPS是无法发现光标的,所以WPS必须设为0"},
    "insert_caret": {"value": 0,
        "tooltip": "0/1,部分元素默认选中时无法发现光标,
        且回到原窗口不自动聚集编辑区,需发送一个字符后删除"},
    "activate_caret": {"value": 0, 
        "tooltip": "0/1,部分界面重激活后不会激活光标,确定是否鼠标点击"},
    "IME":{"value": 2, 
        "tooltip": "0/1/2,0不切换,1切换输入法中英文(但微软输入法不支持),2切换大小写"},  
    "placeholder": {"value": "〓", 
        "tooltip": "😊⏩■▬▮▶▷〓,尽管可以使用emoji,但因为部分窗口emoji长度为2, 但backspace数为1。
        因为其他复杂情况,所以任何非〓占位符,其实是被替换为〓计算位置的, 
        所以即使占位符不是〓, 替换的文本内出现〓也是会被计算的,相当于两个占位符。
        因为中文字符的特殊性,无法监控输入字符数,所以跳转只能向前,无法跳回,
        且用鼠标或按键改变光标位置后,跳转也会出现混乱,
        如果改变光标位置,手动移到上次位置。没有提供占位符转义。"},
    "transparent": {"value": "180", "tooltip": "透明度"},
    "listview_font_size": {"value": 13},
    "listview_font_type": {"value": "黑体"},
    "listview_background_color": {"value": "FFDD99", "tooltip": "ListView背景色"},
    "listview_foreground_color": {"value": "FF0000", "tooltip": "ListView字体色"},
    "listview_select_background_color": {"value": "FF3300"},
    "listview_select_foreground_color": {"value": "FFFFFF"},

    "preview_edit_font_size": {"value": 12},
    "preview_edit_font_type": {"value": "黑体"},
    "preview_edit_background_color": {"value": "FFDD99", "tooltip": "preview_edit背景色"},
    "preview_edit_foreground_color": {"value": "FF0000", "tooltip": "preview_edit字体色"},
}

非default.json, 用于不同窗口, 指定不同规则

{
    "includes":{"value": ["_notepad1", "_notepad2"], 
        "tooltip": "_match/_*.json 的文件名, 文件名开始必须为下划线 `_`, 其内的 snippet 只在指定窗口中使用"}, 
    "filter_title":{"value": "", "tooltip": "匹配窗口的名称, 在激活窗口按下快捷键 `CapLock+1`, 会显示窗口信息"}, 
    "filter_class":{"value": "Notepad", "tooltip": "匹配窗口所属的类"}, 
    "filter_exe":{"value": "", "tooltip": "匹配窗口的程序名"}, 
    "exclude_title":{"value": "", "tooltip": "排除名称出现 exclude_title 的窗口"}, 
    "exclude_class":{"value": "", "tooltip": "排除类名称含 exclude_class 的窗口"}, 
    "exclude_exe":{"value": "", "tooltip": "排除程序名含 exclude_exe 的窗口, 以上仅在非default.json中设置"}, 


    "snippet_method":{"value": "placeholder", 
        "tooltip": "以下 default.json 及 非default.json 都可设置, 如果 非default.json 设置, 为指定窗口的规则"}, 
    "backend":{"value": "clipboard"}, 
    "must_caret": {"value": 0},
    "insert_caret": {"value": 0},
    "activate_caret": {"value": 0},
    "IME":{"value": 1}, 
    "placeholder": {"value": "〓"},

    "transparent": {"value": "200"},
    "listview_font_size": {"value": 13},
    "listview_font_type": {"value": "黑体"},
    "listview_background_color": {"value": "FFDD99"},
    "listview_foreground_color": {"value": "FF0000"},
    "listview_select_background_color": {"value": "FF3300"},
    "listview_select_foreground_color": {"value": "FFFFFF"},

    "preview_edit_font_size": {"value": 12},
    "preview_edit_font_type": {"value": "黑体"},
    "preview_edit_background_color": {"value": "FFDD99"},
    "preview_edit_foreground_color": {"value": "000000"}
}

按键映射

  1. Ctrl+i 启动,输入后自动匹配结果,自动选中第一个,按键说明:

    • 选中:

      • 如果聚焦搜索框 Down/UP 上、下选中
      • Shift+Down/UP Ctrl+n/p 上、下移动选中
      • Shift+Left/Right Alt+k/j 上、下翻页
      • 输入框末尾输入 ;数字 也能选中
    • 输入:

      • Ctrl+j 或 鼠标:
        • 用Enter选中可能出现一些问题,即中文输入法下Enter上屏英文时可能自动上屏选中
        • 解决方法是,中文状态下不用Enter上屏英文,用Shift上屏,或手动切换
      • Ctrl+Enter 选中右边预览框中文本
        • 预览窗内文本可修改,使用tab可在 搜索框 和 预览框 跳转
    • 离开界面:

      • 点击其他窗口
      • Ctrl+[
      • Esc
    • 输入文本后,跳转,用于snippet 或者 placeholder

      • Ctrl+; 跳转到下一光标占位
      • Ctrl+' 跳转到结尾
    • 在打开界面后

      • f1 打开 match
      • f2 打开 config
      • f3 打开 README.md
    • 搜索框内操作:

      • Ctrl+a/e 移动到行首/行尾
      • ctrl+b/f 左右移动
      • ctrl+d/h 左右删除一个字节
      • Alt+b/f 左右移动一个单词位置
      • Ctrl+w/Alt+d 左右删除一个单词
      • Ctrl+u 清空搜索栏
  2. 搜索 match 和 config 下json文件的文本, 便于了解配置

    • Ctrl+Shift+q 搜索 match
    • Alt+Shift+q 搜索 config
    • 以行为单位, 支持正则
    • 搜索结果以一个编辑框显示, 编辑框不支持高亮关键字, 也不支持再次搜索

配置基于json文件配置

  1. 文本配置的好处,更便于配置、迁移、同步

  2. 除双引号内的内容,其他都为英文符号

  3. 双引号内不能出现英文双引号

  4. 同一窗口类型, 关键字不能重复

  5. 如配置错误,可在网站校验配置文件 snippets.json

使用

  1. 空格分割搜索框文本, 不需要输完全部,如:

    • 输入 ab ef,即可匹配 abcdef
  2. 为快捷输入,进入界面后自动打开大写,可手动切换输入中文,可在配置中关闭

  3. 窗口名支持正则

    • 也就是说可以 窗口名1|窗口名2|窗口名3
    • 几个窗口合用一个配置
  4. 替换的文本内,\r 或 \n 相当于换行

  5. 可使用一些特殊字符或字母组合作为标志, 以达到类似于 tag 效果,用以分类,方便筛选

  6. 关键字不建议太长,因为多音字缘故,可能让长度数量级增长,如太长建议用空格分隔

  7. 支持非界面选择的 占位符及snippet,操作

    • 结合热键或热字串
    • hotstring_snippet(str)
    • hotstring_place_replace(str)

与热字串对比

优点:

  1. 热字串占用一定心智负担,增加界面及预览一定程度增加可视性、直观性

    • 尤其是面对几百上千条以后
  2. 热字串只能使用英文,其他语种使用时需考虑使用什么样的缩写

  3. 快速筛选可能少按几个键

  4. 有些内容相似的时候,是不是觉得 触发关键字 如何选比较困难

  5. 可支持跳转,但不能往后跳转

  6. 对五笔用户友好,五笔四码自动上屏,常造成热字串替换时将前面的字符删除

缺点

  1. 启动界面,和选中操作,可能需要增加额外按键

总结

  1. 两者同用并不矛盾,可以不同场景的

    • 热字串适合短的,容易记忆的,更高频的
    • snippets适合长的,可以快速查看筛选预览,减少键入失误带来热字串失效问题
  2. hotstring是确定的、直接的、难记忆的、尽量不要输错的、不支持中文等其他语种的

  3. snippets是不确定的、可筛选的、可预览的、可临时修改的、可多种字符作为关键字的

TODO

  1. 增加日志功能

  2. 增加 package 以提供额外功能

    • 文本键归一化
    • 热字串 hotstring
    • 执行代码?
  3. 增加 suggest 功能?

  4. 暂时不准备用 webview 作为 GUI

  5. 暂时不准备支持 高亮关键字, 因为和预处理关键字相冲突

  6. 暂时不准备每个窗口指定不同启动键

  7. 暂时不准备指定哪些窗口禁用 snippet

  8. 不准备支持 图片/执行代码/富文本/html等, 只专注于文本

  9. 用 UIA 支持 snippet method

snippets's People

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.