大家来给我写的帮助文档提意见吧

问题引入

我在个人项目 typora_plugin 里,设计了一个简单的查询语法(其实是抄袭 Google 的查询语法),用于精确的搜索 md 文件

我个人认为是比较符合直觉的。但是很多用户反馈【看不懂】、【用不懂】。

我的问题是:

  1. 以下两个表格是我对于搜索语法的解释,你愿意看吗?觉得自己能轻松使用它吗?
  2. 你是否理解以下的解释?初看时有什么疑问吗?觉得还需要补充什么?
  3. 针对 md 文件的搜索功能,你觉得以下搜索语法还能怎么优化?

语法关键字说明

关键字 说明
whitespace 表示与。文档应该同时包含全部关键词,等价于 AND
| 表示或。文档应该包含关键词之一,等价于 OR
- 表示非。文档不能包含关键词
“” 表示词组。双引号里的空格不再视为与,而是词组的一部分
/RegExp/ JavaScript 风格的正则表达式
scope 查询属性,用于限定搜索条件
1. 文件属性:path | file | ext | time | size | linenum | charnum | crlf | hasimage
2. 内容属性:default | content | frontmatter | line | blockcode | blockcodelang | blockcodebody | blockhtml | blockquote | table | thead | tbody | ol | ul | head | image | code | link | strong | em | del
3. 默认值 default = path + content(路径+文件内容)
operator 操作符。
1. 「:」表示文本包含或正则匹配(默认)
2. 「=」「!=」表示文本、数值、布尔的严格相等/不相等
3. 「>」「<」「>=」「<=」表示数值比较
() 小括号。用于调整运算顺序

语法示例

示例 搜索文档
pear 包含 pear。等价于 default:pear
sour pear 包含 sour 和 pear。等价于 sour AND pear
sour | pear 包含 sour 或 pear。等价于 sour OR pear
“sour pear” 包含 sour pear 这一词组
sour pear -apple 包含 sour 和 pear,且不含 apple
/\bsour\b/ pear time=2024-03-12 匹配正则\bsour\b(全字匹配sour),且包含 pear,且文件更新时间为 2024-03-12
frontmatter:开发 | head=plugin | strong:MIT YAML Front Matter 包含开发 或者 标题内容为 plugin 或者 加粗文字包含 MIT
size>10k (file=k8s.md | hasimage=true) 文件大小大于 10k,且 文件名为 k8s.md 或者文件内容包含图片
path:(info | warn | err) -ext:md 文件路径包含 info 或 warn 或 err,且扩展名不含 md
file:/[a-z]{3}/ content:prometheus blockcode:“kubectl apply” 文件名匹配正则 [a-z]{3},且内容包含 prometheus,且代码块内容含有 kubectl apply

BNF grammar

<query> ::= <expression>
<expression> ::= <term> ( <or> <term> )*
<term> ::= <factor> ( <conjunction> <factor> )*
<factor> ::= <qualifier>? <match>
<qualifier> ::= <scope> <operator>
<match> ::= <keyword> | '"'<keyword>'"' | '/'<regexp>'/' | '('<expression>')'
<conjunction> ::= <and> | <not>
<and> ::= 'AND' | ' '
<or> ::= 'OR' | '|'
<not> ::= '-'
<keyword> ::= [^\s"()|]+
<regexp> ::= [^/]+
<operator> ::= ':' | '=' | '!=' | '>=' | '<=' | '>' | '<'
<scope> ::= 'path' | 'file' | 'ext' | 'time' | 'size' | 'linenum' | 'charnum' | 'crlf' | 'hasimage' | 'default' | 'content' | 'frontmatter' | 'line' | 'blockcode' | 'blockcodelang' | 'blockcodebody' | 'blockhtml' | 'blockquote' | 'table' | 'thead' | 'tbody' | 'ol' | 'ul' | 'head' | 'image' | 'code' | 'link' | 'strong' | 'em' | 'del'

图示

精确的文档是给高级用户准备的,对于一般的用户,你只需要把最简单、最常用的场景给出例子就行了。

把你查询语法的逻辑说清楚就行了,至于语法标记都是细枝末节的东西,查询本质上就是一组条件的“与或非”组合,而你这个能够使用的查询条件有哪一些?让用户搞清楚了需求,再对照着找具体的语法标记就行了。

2 个赞

一般用户看到开头的whitespace 表示与。就懵两下了:

  1. whitespace是什么?建议中文文档中改成空格
  2. 是什么?整句说明建议改成

搜索同时含有空格两边关键词的文档,例如搜索sour pear时,文章必须同时含有sourpear两个词才能被搜索到。它的实际作用是计算,它两边的条件需要同时满足才会被显示在搜索结果中。

关键字关键词名称相近却代表完全不同的意思,把关键词改成条件表达式可能会更合适

scope那栏,不建议用程序员才能理解的|来分隔这些属性,中文建议直接用顿号,非要用|的话建议这样:path | file | ext |……,让|从用户眼中“隐形”

下面operator同理,简中环境几乎不用的括号符号可能会让用户困惑究竟应该写size>10k还是size「>」10k还是「size>10k」

还有下面双引号的,建议强调一下是中文双引号,同理下面的冒号小括号要强调是英文符号,或者统一使用英文符号避免混乱

因为对于一般用户确实比较复杂,把示例放在关键字说明上面会更好

附一个我自己写得脑壳痛的文档~ 超链接
用户通过5个循序渐进的例子基本就能掌握整套用法了,而不需要被我自己都头痛的七百字详细用法折磨,而且大部分用户实际只需要学习前两个例子,反映还不错

4 个赞

感谢反馈,很强呀。我已经按照您的建议修改了部分表述。

我改成了 查询条件

有道理,我改成了 <code></code> 标签突出显示了。

语法是统一使用英文符号的。是我使用的写作工具擅自将英文引号改成了中文引号导致的,忽略即可。

1 个赞

搜索方面,everything是天花板,你就仿照everything的搜索语法做一下就行了。不要别出心裁

感谢反馈。

感觉不太一样,everything 主要功能根据文件的元数据进行搜索的。我这是全文搜索,还是 md 文件特攻。

everything也有全文搜索语法,也许可以借鉴一下

做个GUI吧,直接单选组件