Shortcuts you invent, rules you write, gestures you own - all still just data
Claude-Session: https://claude.ai/code/session_01Ms2FbjQy31TVf3CEvQhGM8
This commit is contained in:
@@ -43,6 +43,9 @@ find_top() {
|
||||
|
||||
# ── An empty query is navigation, not a search ───────────────────────────────
|
||||
[[ "$(find_top '' | jq -r .count)" == "0" ]] || fail 'an empty query returned results'
|
||||
# Whitespace is an empty query wearing a hat. Tokenizing it produces no tokens,
|
||||
# which must mean "no search" rather than "every setting matches nothing".
|
||||
[[ "$(find_top ' ' | jq -r .count)" == "0" ]] || fail 'a whitespace query returned results'
|
||||
|
||||
# ── Real settings are findable by what they are ──────────────────────────────
|
||||
while IFS='|' read -r query expect_label expect_page; do
|
||||
@@ -80,6 +83,73 @@ CASES
|
||||
! rg -Fq 'Startup & Services' "$repo_dir/config/dot/quickshell/services/SettingsSearch.qml" \
|
||||
|| fail 'search index still uses the retired Startup & Services name'
|
||||
|
||||
# ── Words, not one contiguous substring ──────────────────────────────────────
|
||||
#
|
||||
# The 21 cases above are all single-token or exactly-adjacent, and they were
|
||||
# passing before tokenization -- they are here to prove tokenizing did not move
|
||||
# what was already right. These are the ones that were returning nothing at all:
|
||||
# every word is present in the index, just not adjacent and not in that order.
|
||||
#
|
||||
# "wifi password" is the sharpest: the words live in two different fields of the
|
||||
# same entry, so no substring of any haystack contains the query as typed.
|
||||
while IFS='|' read -r query expect_label expect_page; do
|
||||
result="$(find_top "$query")"
|
||||
got_label="$(jq -r .top <<<"$result")"
|
||||
got_page="$(jq -r .topPage <<<"$result")"
|
||||
[[ "$got_label" == "$expect_label" ]] \
|
||||
|| fail "searching '$query' put '$got_label' first, expected '$expect_label'"
|
||||
[[ "$got_page" == "$expect_page" ]] \
|
||||
|| fail "searching '$query' routes to '$got_page', expected '$expect_page'"
|
||||
done <<'TOKENS'
|
||||
log out|Log out|power
|
||||
metered|Metered connection|connectivity
|
||||
ethernet|Ethernet|connectivity
|
||||
gestures|Gestures|mouse
|
||||
saved networks|Saved networks|connectivity
|
||||
hidden network|Hidden network|connectivity
|
||||
static ip|Static IP address|connectivity
|
||||
color filter|Color filter|accessibility
|
||||
custom shortcut|Custom shortcut|shortcuts
|
||||
app rules|App rules|tiling
|
||||
window rules|Window rules|tiling
|
||||
do not disturb|Do Not Disturb|notifications
|
||||
four-finger swipe|Four-finger swipe|mouse
|
||||
TOKENS
|
||||
|
||||
# Every word must match, in any order and in any field. Order was the
|
||||
# accidental part of substring matching, and it was doing the most damage.
|
||||
for query in 'wifi password' 'password wifi'; do
|
||||
[[ "$(find_top "$query" | jq -r .count)" != "0" ]] \
|
||||
|| fail "searching '$query' found nothing, on a page that shows the Wi-Fi password"
|
||||
[[ "$(find_top "$query" | jq -r .topPage)" == "connectivity" ]] \
|
||||
|| fail "searching '$query' did not lead with a network result"
|
||||
done
|
||||
|
||||
# AND, not OR. A query holding a word the index does not have anywhere must
|
||||
# return nothing, or tokenizing has only made the field louder.
|
||||
[[ "$(find_top 'wallpaper zzzznotathing' | jq -r .count)" == "0" ]] \
|
||||
|| fail 'a query containing an unmatchable word still returned results'
|
||||
|
||||
# ── A result may name the tab it lives on ────────────────────────────────────
|
||||
#
|
||||
# Landing on Appearance's Themes tab after searching "theme editor" is the
|
||||
# search half-working: the page is right and the thing searched for is behind
|
||||
# another click. Results that name no section route exactly as before, which is
|
||||
# every result the schema produces.
|
||||
[[ "$(find_top 'theme editor' | jq -r .topSection)" == "editor" ]] \
|
||||
|| fail 'the theme editor result does not name the tab it lives on'
|
||||
[[ "$(find_top 'video wallpaper' | jq -r .topSection)" == "background" ]] \
|
||||
|| fail 'the video wallpaper result does not name the tab it lives on'
|
||||
[[ "$(find_top 'timezone' | jq -r .topSection)" == "" ]] \
|
||||
|| fail 'a result on a page with no tabs still names a section'
|
||||
|
||||
# And the sidebar has to consume it, or the field is decorative.
|
||||
sidebar="$repo_dir/config/dot/quickshell/modules/settings/SettingsSidebar.qml"
|
||||
rg -Fq 'ShellState.openSettingsSection' "$sidebar" \
|
||||
|| fail 'the sidebar never opens a result at its section'
|
||||
rg -Fq 'root.pageRequested' "$sidebar" \
|
||||
|| fail 'the sidebar lost the plain page route, which most results still use'
|
||||
|
||||
# ── Shortcuts are searchable by what they do ─────────────────────────────────
|
||||
[[ "$(find_top screenshot | jq -r .topPage)" == "shortcuts" ]] \
|
||||
|| fail 'searching a shortcut description did not route to the shortcuts page'
|
||||
|
||||
Reference in New Issue
Block a user