跳到主要内容

查找与替换

在整张图中查找文本,带你在 ERD 画布上逐一跳转到每个匹配项,并替换其中一处或全部匹配。
它搜索七类文本:表名、表注释、列名、列注释、备注、索引名和表分组名称,参见搜索的内容。

资源管理器是停靠在 ERD 画布左侧的面板,查找与替换就位于其顶部,处于资源管理器的标题栏与树之间。它没有自己的标题。从上到下依次包含:

  • 查找输入框,其内部末端是三个选项,前方是 Toggle Replace 箭头。
  • Replace 行,初始处于折叠状态,参见替换。
  • 计数,其后是用于在匹配项之间逐个移动的上、下箭头,以及带三个点的 Search In 按钮。
  • 文本类型,由 Search In 展开。

查找输入框中有文本时,资源管理器的树会显示匹配项,参见结果。
画布较矮时,搜索区域仍保持完整高度,其下方的树占用剩余的空间并可滚动。

用 ⌘ + F 在资源管理器中打开查找与替换,逐个跳转到 member 的六个匹配项,然后开启 Preserve Case,把这六处全部替换为 user (⌘ + Enter)

打开与关闭​

Ctrl + F (Windows/Linux) 或 ⌘ + F (Mac),以及快速搜索或画布右键菜单中的 Toggle Explorer,都会打开资源管理器并定位到其搜索。光标会移到查找输入框并选中其中的文本,查询内容会重新搜索,并且没有当前匹配项。
工具栏中的 Explorer 按钮只会打开或关闭面板。它不会把光标放入查找输入框,查询内容和当前匹配项也保持原样。
当该按键只是把光标带回已经显示的资源管理器时(快速搜索或资源管理器旁的对话框中所述的五个对话框之一打开期间就是如此),当前匹配项保持不变。

关闭资源管理器、资源管理器打开期间该按键和两个 Toggle Explorer 条目的作用,以及它们会关闭的对话框,参见资源管理器页面中的打开与关闭。
其他标签页和禅模式如何隐藏它,以及 Diff Viewer、Time Travel 和自动布局预览如何隐藏它并阻止它打开,参见何时让位。编辑器过窄、容纳不下它的情况,参见画布旁边。

重新打开时会保留上一次的查询内容,以及替换文本、选项、之前开启的文本类型,还有 Replace 行和文本类型是否处于展开状态。
这些内容在编辑器保持打开期间一直保留,但不会保存到文档中。新打开的编辑器所有选项均为关闭,Replace 行和文本类型处于折叠状态,只开启四种名称,参见搜索的内容。

浏览器的查找栏​

编辑器拥有键盘焦点时,Ctrl + F (Windows/Linux) 或 ⌘ + F (Mac) 在每个标签页中都归编辑器处理,在编辑器自己的文本输入框中也是如此,因此不会打开浏览器的查找栏。
Diff Viewer、Time Travel 或自动布局预览打开期间,以及焦点位于编辑器之外时,该按键会传给浏览器或宿主。

  • Web 应用和 Google Drive:浏览器的查找栏只会在这两种情况下打开。
  • VS Code:扩展在 ERD Editor 中关闭了 VS Code 自带的查找小部件,因此该按键在其中永远不会打开它。
  • Obsidian:只要图所在的标签页处于活动状态,该按键就会传给编辑器,而不会执行 Obsidian 的 Search current file。
  • JetBrains IDE:如果 IDE 的按键映射将 Ctrl + F (Windows/Linux) 或 ⌘ + F (Mac) 留给自己使用,请通过快速搜索或画布右键菜单中的 Toggle Explorer 打开搜索,或者用工具栏中的 Explorer 按钮打开资源管理器,再点击查找输入框。

嵌入编辑器的页面可以把该快捷键改为其他按键或将其移除,参见更改快捷键。

搜索的内容​

七个按钮用于选择要搜索的文本类型,依次为 Table names、Table comments、Column names、Column comments、Memos、Index names 和 Table group names。
它们初始处于折叠状态。计数所在行末端的 Search In 按钮会在该行下方展开它们,也可以再次将其折叠;它们显示期间,该按钮呈高亮状态。
高亮的类型按钮表示已开启。点击按钮可将其开启或关闭,搜索会随之重新执行。七个全部关闭时,不会找到任何内容。

搜索首次打开时只开启四种名称,即 Table names、Column names、Index names 和 Table group names,因此除非你开启注释和备注,否则重命名不会波及它们。
索引名是指表属性的 Indexes 标签页中各索引的名称,而不是列在它们上方的 PK_ 和 UQ_ 键。

除此之外的内容都不会被搜索:数据类型、默认值、索引所包含的列、数据库名称、包括 Before tables 和 After tables 脚本在内的 Schema SQL,以及生成的代码都不在搜索范围内。
被表显示选项隐藏的注释仍会被搜索。通过 View Option → Memos 隐藏的备注,以及通过 View Option → Table Groups 隐藏的表分组,则不会被搜索,即使对应的按钮已开启也是如此,因此 Replace All 永远不会改写你看不到的备注,也不会重命名你看不到的分组。

选项​

查找输入框内部末端的三个开关用于改变查询的匹配方式。其名称显示在各自的提示中,开启时呈高亮状态。三者初始均为关闭,更改任何一个都会重新搜索。

  • Match Case:关闭时,匹配不区分大小写。
  • Match Whole Word:只有两侧都不与相邻单词连在一起的匹配才算数。任何文字的字母、数字和组合标记都算作单词字符,下划线也是。因此 user 可以在 user id 和 user.id 中匹配,但不会在 users、user_id 或 superuser 内部匹配。查询的某一端如果本身不是单词字符,例如 .id 中的点,则该端不需要边界。
  • Use Regular Expression:查询内容是一个 JavaScript 正则表达式,并且始终处于 Unicode 模式,因此可以使用 \p{L}。^ 和 $ 匹配多行注释或备注中每一行的开头和结尾,. 不会跨越换行。名称中常会输入的转义,例如 \_ 和 \-,也可以使用。

无法解析的正则表达式(例如 user()找不到任何内容:计数会以红色显示 Invalid regular expression,查找输入框也会显示红色边框。
Match Case 和 Match Whole Word 同样适用于正则表达式。长度为零的匹配(例如单独的 ^)永远不会被列出。

普通文本会随输入即时搜索。正则表达式会在输入停顿后搜索;按下 Enter、导航按钮、Replace 或 Replace All,或选择包含匹配项的某一行时,则会立即搜索。
搜索没有时间限制,因此大量回溯的正则表达式可能会让编辑器在搜索完成之前失去响应。

第四个开关 Preserve Case 位于 Replace 输入框内部的末端,因此只有在 Replace 行展开时才会显示。它初始为关闭。它不会改变找到的内容,只会改变 Replace 和 Replace All 写入替换文本的方式,参见替换。开启或关闭它不会触发搜索,当前匹配项保持不变。

结果​

计数位于输入框下方那一行的开头,显示你当前所处的位置。查找输入框为空时,计数也为空。

计数情况
No results没有任何匹配。
12 matches尚未移动到其中任何一个匹配项;只有一个匹配项时显示 1 match。
3 of 12当前匹配项为第三个。
Invalid regular expression正则表达式无法解析。
Replaced 12 matchesReplace All 修改了这么多处匹配;只修改了一处时显示 Replaced 1 match。
No changesReplace All 没有修改任何内容。
No more matches一轮 Replace 已回到开始的位置,参见替换。

Replaced …、No changes 和 No more matches 会在下一次搜索或移动时恢复为计数,由编辑或 Undo 触发的搜索也是如此。

查找输入框中有文本时,资源管理器的树显示的是结果而不是整张图:只显示包含匹配项的行及其上层的行。没有任何匹配,或正则表达式无法解析时,树为空。删除查询内容后,会恢复完整的树,折叠状态与之前相同。

  • Tables、Table Groups 和 Memos 只在其中包含匹配项时才会显示,每个文件夹的计数是结果中直接位于其下的行数。
  • Tables 下按名称列出包含匹配项的表。每个表下方先是其注释中的每个匹配项各占一行,然后是 Columns 文件夹,按列的顺序列出包含匹配项的列,每列下方为其注释中的每个匹配项各占一行,最后是 Indexes 文件夹,列出名称匹配的索引。这里没有 Foreign Keys 文件夹。
  • Table Groups 下按名称列出名称匹配的分组,不列出其中的表。找到的表显示在 Tables 下。
  • Memos 下按文档顺序列出包含匹配项的备注,每个备注以其第一行显示,其下为其中的每个匹配项各占一行。

名称中的匹配项会在该名称自己的行中高亮显示,因此包含两次查询内容的名称只占一行,其中有两处高亮。
注释或备注中的匹配项则各自占一行:表注释或列注释显示对话气泡图标,备注显示便签图标,其后是文本的摘录,其中匹配处高亮显示。较长的文本会用 … 截断,换行显示为空格。将指针悬停在该行上即可查看完整文本。
其他各行的样子与不在搜索时相同:列显示其数据类型,索引显示其列,名称为空时显示为 unnamed。

搜索开始时,所有带有下层行的行都处于展开状态。你折叠的行,或被 Collapse All 折叠的行,会一直保持折叠,直到其下的某个匹配项成为当前匹配项,或者查询内容、Match Case、Match Whole Word、Use Regular Expression 或某种文本类型发生变化,或者通过该按键或 Toggle Explorer 条目再次打开搜索为止。
当前匹配项所在的行会高亮显示,并滚动到可见位置。无论匹配项有多少,树都会全部列出。
在匹配项之间移动时按树中的顺序进行:逐个表依次为表名、表注释、按列的顺序排列的每一列的列名和列注释,以及该表的索引名;然后是表分组名称;最后是备注。

资源管理器显示期间,结果会跟随文档变化。编辑停顿后,被搜索文本的任何变更都会触发重新搜索;如果当前匹配项仍然存在,它会保持为当前匹配项。这包括编辑名称、注释或备注文本,添加或删除表、列、索引、备注或表分组,移动列,以及通过 View Option 隐藏或显示备注或表分组,后者会让它们的匹配项从树中移除或重新出现。画布上的编辑、Undo 或 Redo、导入,以及协作者或编码智能体的编辑都算在内。选中、在画布上移动表、备注或分组、滚动、缩放和悬停则不会触发重新搜索。
资源管理器关闭或不可见期间所做的编辑,会在它重新显示时立即搜索。

跳转到匹配项​

在查找输入框中按 Enter 跳转到下一个匹配项,按 Shift + Enter 跳转到上一个。计数之后的上、下箭头按钮作用相同,其提示分别为 Previous Match (Shift+Enter) 和 Next Match (Enter),没有任何匹配项时两者均不可用。
移动到达两端时会循环。在你第一次移动之前没有当前匹配项,因此第一次按 Enter 会跳转到第一个匹配项,第一次按 Shift + Enter 则跳转到最后一个。

点击结果中的某一行,或在键盘焦点位于该行时按 Enter 或 Space,会执行以下操作之一:

  • 名称本身包含匹配项的行,会跳转到该名称中的第一个匹配项。
  • 显示注释或备注摘录的行,会跳转到该匹配项。
  • 其他任何行,例如名称不匹配的表或备注本身所在的行,会跳转到该行所代表的对象,当前匹配项保持不变,参见跳转到行。
  • 文件夹会折叠或展开。

每当某个匹配项成为当前匹配项时,树都会展开其上层所有已折叠的行,并把键盘焦点移到该行,因此在树中使用方向键时会从该行继续。

跳转到匹配项时,如果表属性已打开,会先将其关闭,然后:

  • 对于表名或表注释、列名或列注释,会单独选中该表并将其移到最前面,然后把单元格焦点放在包含匹配项的单元格上。如果匹配位于被表显示选项隐藏的注释中,单元格焦点则落在其旁边的名称上。
  • 对于索引名,会单独选中该索引所在的表并将其移到最前面,单元格焦点落在表名上,除非焦点原本就在该表中。索引名不会绘制在画布上。
  • 对于表分组名称,会单独选中该分组,并将它连同其中的表一起移到最前面。
  • 对于备注,会单独选中该备注并将其移到最前面。

只有当跳转到的对象没有显示得足够清楚时,画布才会滚动,并且缩放永远不会改变,参见跳转的落点。

在查找输入框中按 Enter 后,光标会留在其中;选择某一行后,键盘焦点会留在树中,因此接下来输入的内容不会进入选中的表。
跳转到匹配项永远不会开始或完成正在绘制的关系。

替换​

Replace 行初始处于折叠状态。查找输入框前方提示为 Toggle Replace 的箭头用于展开和折叠该行。折叠时会保留替换文本。
该行包含 Replace 输入框(其内部末端是 Preserve Case 开关)和两个按钮,按钮的提示分别为 Replace (Enter) 和 Replace All。没有任何匹配项时,两个按钮均不可用。

在替换输入框中按 Enter(无论是否同时按住 Shift),或点击其按钮,即可执行 Replace:

  • 没有当前匹配项时,第一次按下只会跳转到下一个匹配项,让你在任何内容发生变化之前先看到将要修改的位置。
  • 有当前匹配项时,只替换这一处,同一文本中其他出现的位置保持不变,然后继续跳转到所写入文本之后的下一个匹配项。即使写入的文本包含查询内容也会被跳过:把 user 替换为 super_user 之后,不会停在 super_user 内部。
  • 如果替换后写回的内容与原来完全相同,该匹配项会保持原样,这次按下只会继续跳转到下一个匹配项。
  • 替换以及随后滚动到下一个匹配项只算一步 Undo。

连续按 Replace 时,一旦绕回到开始的位置,这一轮就会停止。计数显示 No more matches,没有当前匹配项,再按也不会替换任何内容。
因此,把 Customer 替换为 Big Customer 只会替换一次,而不会不断变成 Big Big Customer。
跳转到匹配项,更改查询内容、Match Case、Match Whole Word、Use Regular Expression 或文本类型,通过该按键或 Toggle Explorer 条目打开搜索,或执行 Replace All,都会开始新的一轮;Undo 或其他任何修改了这一轮起始文本的编辑也是如此。更改替换文本或 Preserve Case 则不会,该按键只是把光标带回已经显示的资源管理器时也不会。
在一轮进行期间,被它重命名的表或表分组会在树中以及匹配项的顺序中保持原来的位置,因此即使重命名后它应排在更后面,也不会再次遇到它。下一轮开始时,树会恢复按名称排序,被重命名的行会移到新的位置。

在替换输入框中按 Ctrl + Enter (Windows/Linux) 或 ⌘ + Enter (Mac),或点击其按钮,即可执行 Replace All:

  • 它会替换已开启的文本类型中的所有匹配项,其他类型保持不变。使用默认的文本类型时,它会重命名表、列、索引和表分组,注释和备注不会受到影响。
  • 它所做的全部修改只算一步 Undo,参见一次操作一条记录。
  • 计数显示 Replaced N matches,只统计文本实际发生变化的匹配处。如果没有任何变化,则显示 No changes,历史记录中也不会记录任何内容,例如用 $1 替换正则表达式 (user) 时。
  • 随后结果会重新搜索,且没有当前匹配项,因此可能会列出新文本中包含的匹配项。

两者都按按下时各文本的实际内容进行处理,而不是按上一次搜索时找到的内容。

替换文本的使用方式:

  • 未开启 Use Regular Expression 时,$ 没有特殊含义,替换文本会按输入的原样使用,只有 Preserve Case 赋予它的大小写除外。
  • 开启 Use Regular Expression 时,$1 到 $99、$<name>、$&、$`、$' 和 $$ 会像在 JavaScript 的 String.prototype.replace 中一样展开。
  • 未开启 Preserve Case 时,匹配文本的大小写不会被沿用:在 Match Case 关闭时,把 user 替换为 member 会将 Users 变为 members。
  • 开启 Preserve Case 时,每处替换文本会在 $1 等展开之后,按照它所替换的文本调整大小写,因此同样的替换会将 Users 变为 Members:
    • 全部为大写的匹配项会得到全部大写的替换文本,全部为小写的匹配项则得到全部小写的替换文本:用 account 替换 USER 得到 ACCOUNT,用 Account 替换 user 得到 account。
    • 其他匹配项会让替换文本的第一个字符采用匹配项第一个字符的大小写,其余部分保持输入的原样:用 accountKey 替换 UserId 得到 AccountKey,用 AccountKey 替换 uSER 得到 accountKey。如果匹配项的第一个字符没有大小写之分,替换文本保持输入的原样:用 xyz 替换 _Ab 得到 xyz。
    • 当匹配项和替换文本都包含 -,或都包含 _,并且该分隔符把两者分成相同数量的段时,每一段会按照对应的段调整大小写:用 account_key 替换 USER_id 得到 ACCOUNT_key,用 account-key 替换 User-Name 得到 Account-Key。如果 - 和 _ 都能这样分割两者,则整体作为一段调整大小写。
    • 不含任何有大小写之分的字母的匹配项(例如 123),替换文本保持输入的原样。
    • 按原样写回的匹配项不计入数量:在 Match Case 关闭时,用 Customer 替换 customer 会把 customer、Customer 和 CUSTOMER 按原样写回,它们都不会被计入。
  • 替换输入框为空时,会删除匹配的文本。

替换是一次普通的编辑,与你亲自输入新的表名、注释、列名或备注文本,在表属性中重命名索引,或重命名表分组相同。
它会像其他编辑一样记录到历史记录中,并同步给协作者和编码智能体。

搜索输入框中的按键​

  • 在查找输入框中,Enter 跳转到下一个匹配项,Shift + Enter 跳转到上一个。
  • 在替换输入框中,Enter(无论是否同时按住 Shift)执行替换,Ctrl + Enter (Windows/Linux) 或 ⌘ + Enter (Mac) 执行全部替换。
  • 在任一输入框中输入法仍在组字时,Enter 归输入法处理,既不会移动,也不会替换。

Escape、仍然有效的编辑器快捷键以及其他所有按键在这些输入框中的作用,参见资源管理器中的按键。

只读编辑器​

在 readonly 编辑器中,搜索只能查找。没有 Toggle Replace 箭头和 Replace 行,因此也没有替换输入框、Preserve Case、Replace 和 Replace All。
查找输入框及其三个选项、文本类型、计数、结果以及跳转到匹配项均可正常使用。其周围的资源管理器与在其他任何编辑器中一样正常工作,参见只读编辑器。

在 VS Code 中,图的修订版本,例如 Git 修订版本或 Local History 条目,会以 JSON 文本打开。通过 Reopen Editor With... 重新以图的形式打开后,它是只读的,使用的就是这种只能查找的搜索。

更改快捷键​

嵌入编辑器的页面可以通过 setKeyBindingMap 以 findReplace 为名重新绑定或移除 Ctrl + F (Windows/Linux) 或 ⌘ + F (Mac)。
移除后,该按键在每个标签页中都交给页面处理。工具栏中的 Explorer 按钮仍可打开和关闭资源管理器,快速搜索和画布右键菜单中的 Toggle Explorer 也仍可打开搜索或关闭资源管理器,但它们都不显示快捷键,因此该按钮的提示只显示 Explorer。设置中快捷键标签页上的 Toggle Explorer 行同样不显示按键。重新绑定后,它们都会显示新的按键。