Перейти к основному содержимому

Поиск и замена

Находит текст во всей диаграмме, переходит к каждому совпадению на холсте 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, пока он открыт, и окна, которые они закрывают, описаны в разделе Открытие и закрытие на странице «Обозреватель».
В разделе Когда Обозреватель скрывается описано, как его скрывают другая вкладка и режим дзен и как просмотр различий, путешествие во времени и предварительный просмотр Автоматического размещения скрывают его и не дают ему открыться. В разделе Рядом с холстом описан случай, когда редактор слишком узок для него.

При повторном открытии сохраняются последний запрос, а также текст замены, параметры, включенные виды текста и то, были ли развернуты строка Replace и виды текста.
Они хранятся, пока редактор открыт, и не сохраняются в документе. Во вновь открытом редакторе все параметры выключены, строка Replace и виды текста свернуты, а включены только четыре вида имен — см. Что охватывает поиск.

Панель поиска браузера​

Пока фокус клавиатуры в редакторе, сочетание Ctrl + F (Windows/Linux) или ⌘ + F (Mac) на любой вкладке, в том числе в его собственных текстовых полях, обрабатывает редактор, поэтому панель поиска браузера не открывается.
Сочетание клавиш передается браузеру или хосту, пока открыт просмотр различий, путешествие во времени или предварительный просмотр Автоматического размещения, а также пока фокус находится вне редактора.

  • Веб-приложение и Google Drive: панель поиска браузера открывается только в этих двух случаях.
  • VS Code: расширение оставляет собственный виджет поиска VS Code выключенным в ERD Editor, поэтому сочетание клавиш никогда не открывает его там.
  • Obsidian: сочетание клавиш доходит до редактора всякий раз, когда активна вкладка диаграммы, вместо команды Obsidian Search current file.
  • IDE JetBrains: если раскладка клавиш 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_, перечисленные над ними.

Ничего другого поиск не охватывает: ни типы данных, ни значения по умолчанию, ни столбцы индекса, ни имя базы данных, ни Схему SQL со скриптами Before tables и After tables, ни сгенерированный код.
Комментарий, скрытый параметром вида таблиц, все равно участвует в поиске. Заметки, скрытые через 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 matchesОперация Replace All изменила столько совпадений; Replaced 1 match, если совпадение одно.
No changesОперация Replace All ничего не изменила.
No more matchesСерия нажатий Replace вернулась к месту, где началась, — см. Замена.

Replaced …, No changes и No more matches сменяются счетчиком при следующем поиске или переходе, в том числе при поиске, который запускается правкой или отменой.

Пока в поле поиска есть текст, дерево Обозревателя показывает вместо всей диаграммы результаты: только строки с совпадениями и строки над ними. Если совпадений нет или регулярное выражение не удается разобрать, дерево пусто. Удаление запроса возвращает все дерево, свернутое так же, как раньше.

  • Папки 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.
Строка текущего совпадения подсвечивается и прокручивается в область видимости. Дерево показывает все совпадения, сколько бы их ни было.
Переход по совпадениям идет в порядке дерева: таблица за таблицей — имя таблицы, ее комментарий, имя и комментарий каждого ее столбца в порядке столбцов и имена ее индексов; затем имена групп таблиц; затем заметки.

Пока Обозреватель отображается, результаты следят за документом. Когда в правках наступает пауза, любое изменение текстов, по которым идет поиск, запускает поиск заново, и текущее совпадение остается текущим, если оно все еще существует. Сюда относятся правка имени, комментария или текста заметки, добавление или удаление таблицы, столбца, индекса, заметки или группы таблиц, перемещение столбца, а также скрытие или показ заметок или групп таблиц через Параметры вида, что убирает их совпадения из дерева или возвращает их. Учитываются правка на холсте, отмена или повтор, импорт и правка соавтора или агента для программирования. Выделение, перемещение таблиц, заметок или групп на холсте, прокрутка, изменение масштаба и наведение указателя не учитываются.
Правки, внесенные, пока Обозреватель был закрыт или не виден, учитываются в поиске, как только он снова отображается.

Переход к совпадению​

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. Пока совпадений нет, обе кнопки недоступны.

Replace срабатывает при нажатии Enter в поле замены, с Shift или без, либо при нажатии соответствующей кнопки:

  • Если текущего совпадения нет, первое нажатие только переходит к следующему совпадению, поэтому видно, что будет изменено, до того как что-либо изменится.
  • Если текущее совпадение есть, заменяется только это вхождение, другие вхождения в том же тексте остаются как есть, и выполняется переход к следующему совпадению после записанного текста. Записанный текст пропускается, даже если содержит запрос: при замене user на super_user переход затем не останавливается внутри super_user.
  • Совпадение, которое замена записала бы точно таким же, каким оно было, остается без изменений, а нажатие только переходит к следующему совпадению.
  • Замена и прокрутка к следующему совпадению составляют один шаг отмены.

Серия нажатий Replace останавливается, как только возвращается к месту, где началась. Счетчик показывает No more matches, текущего совпадения нет, а дальнейшие нажатия ничего не заменяют.
Поэтому Customer при замене на Big Customer заменяется один раз, а не разрастается до Big Big Customer.
Новую серию начинают переход к совпадению, изменение запроса, Match Case, Match Whole Word, Use Regular Expression или вида текста, открытие поиска сочетанием клавиш или пунктом Toggle Explorer либо Replace All, а также отмена или любая другая правка, изменяющая текст, в котором серия началась. Изменение текста замены или Preserve Case новую серию не начинает, как и сочетание клавиш, когда оно лишь возвращает курсор ввода в уже отображаемый Обозреватель.
Пока серия продолжается, переименованная ею таблица или группа таблиц сохраняет свое место в дереве и в порядке совпадений, поэтому, даже если после переименования она оказалась бы дальше при сортировке, она не встречается повторно. Следующая серия восстанавливает в дереве порядок по именам, и переименованная строка перемещается на новое место.

Replace All срабатывает при нажатии Ctrl + Enter (Windows/Linux) или ⌘ + Enter (Mac) в поле замены либо при нажатии соответствующей кнопки:

  • Заменяет все совпадения во включенных видах текста и не трогает остальные виды. С видами по умолчанию переименовывает таблицы, столбцы, индексы и группы таблиц, а комментарии и заметки остаются нетронутыми.
  • Все внесенные изменения составляют один шаг отмены — см. Один жест — один шаг.
  • Счетчик показывает Replaced N matches, учитывая только вхождения, текст которых действительно изменился. Если таких нет, он показывает No changes, и в историю изменений ничего не записывается, как при замене регулярного выражения (user) на $1.
  • Затем поиск выполняется заново без текущего совпадения, поэтому в результатах могут оказаться совпадения, которые содержит новый текст.

Обе операции берут каждый текст в том виде, в каком он есть в момент нажатия, а не в каком его нашел последний поиск.

Как используется текст замены:

  • Без Use Regular Expression символ $ не имеет особого значения, и текст замены используется в том виде, в каком введен, за исключением регистра, который ему придает Preserve Case.
  • С Use Regular Expression последовательности от $1 до $99, $<name>, $&, $`, $' и $$ раскрываются так же, как в методе String.prototype.replace в JavaScript.
  • Без Preserve Case регистр совпавшего текста не переносится: при выключенном Match Case замена user на member превращает Users в members.
  • С Preserve Case регистр каждой замены подбирается по заменяемому тексту после раскрытия $1 и остальных последовательностей, поэтому та же замена превращает Users в Members:
    • Совпадение целиком в верхнем регистре получает замену целиком в верхнем регистре, а совпадение целиком в нижнем регистре — целиком в нижнем: USER с account дает ACCOUNT, а user с Account дает account.
    • Любое другое совпадение передает первому символу замены регистр своего первого символа, а остальное оставляет таким, как введено: UserId с accountKey дает AccountKey, а uSER с AccountKey дает accountKey. Если у первого символа совпадения нет регистра, замена остается такой, как введена: _Ab с xyz дает xyz.
    • Если и совпадение, и замена содержат - или оба содержат _ и этот разделитель делит их на одинаковое число частей, регистр каждой части подбирается по соответствующей части совпадения: USER_id с account_key дает ACCOUNT_key, а User-Name с account-key дает 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..., она доступна только для чтения и получает этот поиск без замены.

Изменение сочетания клавиш​

Страница, в которую встроен редактор, может переназначить Ctrl + F (Windows/Linux) или ⌘ + F (Mac) либо удалить это сочетание под именем findReplace с помощью метода setKeyBindingMap.
Если сочетание удалено, на любой вкладке эти клавиши обрабатывает страница. Кнопка Explorer на панели инструментов по-прежнему открывает и закрывает Обозреватель, а пункт Toggle Explorer в Быстром поиске и в контекстном меню холста по-прежнему открывает поиск или закрывает Обозреватель, но ни один из них не показывает сочетания клавиш, поэтому всплывающая подсказка кнопки — просто Explorer. Строка Toggle Explorer на вкладке «Сочетания клавиш» в Настройках тоже не показывает сочетания клавиш. После переназначения все они показывают новое сочетание.