Search and Quick Find
Curio offers two ways to search your project for figures and other items.
- The Search shelf shows your results as a grouped outline so you can peruse or step through several items. You can even export the reults in various formats.
- Quick Find is a popup akin to Spotlight so you can instantly find and jump to your idea spaces and figures.
Using Search
Press ⌘F to bring up the Search shelf, or click the search toolbar button.
Type in your search query, using the helpful keyboard button below the query field to choose meta parameters and optional query commands.
After a pause or after pressing the Return key your results appear organized below the query.
Click on a result to jump to that item in the idea space. You can also use the up and down arrow keys to step through the reuslts jumping between the figures in their various idea spaces.
Clearing or Canceling
Click the Clear button to clear the query leaving the Search shelf up so you can type a different query if you’d like.
Alternatively, if you’d like to clear and dismiss the Search shelf you can press ⌘F or press the Escape key (assuming the query text field still has focus). The query will be cleared and the previously viewed shelf will be restored.
Note that if a query is active it will remain active even if you switch to another shelf. The Search button on the toolbar changes to a red color so you know a search is active. This way you can use the inspector or other shelf modules to examine found items without clearing the query results.
Exporting Search Results
Click the share button under the query field to copy your result as rich text, or export your search results in rich text, markdown , or CSV format. You can also export a CSV report of all figure cross references in those results, see References for more details.
Using Quick Find
Press ⇧⌘F to bring up the Quick Find window, which will appear above the current Curio project window. You may also choose the Edit > Quick Find menu.
After the Quick Find window appears, type in a search query and the window expands to reveal idea spaces and/or figures that match that query.
You can directly click on a result or use the arrow keys to highlight a result and press Return, you will then instantly jump to the selected item. If the Option key is pressed then the item destination will be opened in the secondary split view.
Alternatively you can also press Escape or click on the idea space behind the Quick Find window to dismiss Quick Find.
Refreshing the Results
By design, if you bring up Quick Find again within a launch session it will show you the last results without refreshing first. This way you can make changes to found items between subsequent returns to Quick Find to jump to the next item.
To force a refresh simply press Return to force a re-query, or change the query which will automatically refresh the results.
Sending the Query to Search
Press ⌘Return to send the Quick Find query to the Search shelf if you’d like to browse through several result items.
Example Queries
Your queries can be as simple as:
ipad
Or as complex as:
(ipad or iphone) @SteveJ #event #2010 (start > 2010-06-25 or due < 2w) progress < 50 group:priority
Saving and Reusing Queries
When you enter a new query into either Search or Quick Find, a small Save button becomes visible. Click it and your query is saved for easy reuse.
To reuse a saved query, click the magnifying glass on the Quick Find window or the keyboard button on the Search shelf to choose the query from the popup menu that appears.
If you select a previously saved query from that popup menu then a small Delete button appears, so you can easily delete that saved query. Or if you make changes to the query text, the button changes to Update so you can update its existing entry.
Background
Booleans
Terms are AND’ed together by default, so searching for #2021 #personal @GeorgeB
means that all three terms must match.
You can use or
(case-insensitive), such as #personal or @GeorgeB
, or the ||
symbol, if you wish.
(Technically not
is also supported although generally not very useful. Finding all items where not priority=3
returns a flood of results.)
Parentheses
Parentheses may be used to assist with the logic, such as #GTD/active (#personal or @GeorgeB
).
You can also nest parentheses if you wish for more complex logic.
Comparison Operators
Where appropriate the following operators are allowed: >
, <
, =
, ==
, >=
, =>
, <=
, =<
, !=
, <>
.
And, in certain situations, specifically custom data string values, you can also use the beginswith
and endswith
operators such as #FullName endswith jobs
.
Starting Prefixes
Curio looks for special prefixes at the very start of the query which can come in handy:
-
will force the result to be sorted in descending order, ex:- #active
.+
will force the result to be sorted in ascending order, ex:+ #active
.
Note there’s a space after the prefix character before the rest of the query text.
Commands
The query can include optional commands that allow you to fine-tune the results.
Commands are in the form command:value
such as sort:due
.
Sort
Example: sort:title
By default Curio sorts the results by title, alphabetically in ascending order.
However, it tries to be smart about this.
For example, if your search query includes the term priority > 2
then Curio will will automatically sort the results by priority, and it will do it in descending order since you’re more likely to want to see the high priority items at the top.
If you simply want to reverse the sort order you can use the special -
or +
starting prefix described above.
Or you can force Curio to sort by a specific meta property, even if it’s not part of the query, by using the sort
command like this: sort:rating
or sort:-priority
.
An optional +
or -
value prefix before the field name can be used to force an ascending or descending sort.
Your sort options are:
title
- the titlestart
- start datedue
- due datestartdue
- start date unless already started (by progress > 0) then due datedone
- done dateadded
- date addedmodified
- date last modifiedprogress
- progress (percent complete)priority
- priorityrating
- ratingorganizer
- Organizer order
Group
Example: group:priority
Note
The grouping parameter isn’t currently used by Quick Find, but can be used for query-based hierarchical smart collections such as lists and mind maps.
You can use the group command to organize your results into hierarchical groupings.
For example, group:due
will organize the results into groups like Before Today, Today, Tomorrow, Within Week, etc.
And group:priority
will group items into Urgent, High, Medium, etc.
Your group options are:
title
- the titlestart
- start datedue
- due datestartdue
- start date unless already started (by progress > 0) then due datedone
- done dateadded
- date addedmodified
- date last modifiedprogress
- progress (percent complete)priority
- priorityrating
- ratingorganizer
- Organizer ordernone
- forces no grouping, overriding automatic grouping normally applied to list figure queries, for example
Scope
Example: scope:section
By default Curio searches the entire project.
However, you can limit the scope if you wish using the scope
command like this: scope:ideaspace
or scope:s/
.
Your scope options are:
section
ors
- the current sectionsection/
ors/
- the current section and any child sectionsideaspace
ori
- the current idea spaceideaspace/
ori/
- the current idea space and any child idea spacesjournal
- the Journal sectionarchive
- the Archive sectiontrash
- the Trash section
Note
The default, searching the entire project, doesn’t include the Archive or Trash sections, by design.
Limit
Example: limit:10
If you would like to restrict the number of returned items specify a limit value like limit:10
.
For Quick Find, the default is unlimited which is the same as specifying limit:0
.
For query-based smart collections there is a safety limit of 100, so you don’t have a collection explode with hundreds or thousands of items, but you can override this for a specific query using the limit
command, or it can be permanently overridden.
Include
Example: include:nocheckbox
Normally Curio excludes certain types of result items when they wouldn’t make sense to include in the results, but you can override this.
Important
The include
command must be specified at or near the front of the query.
instances
- instances of synced figures are generally not included in the results, only the original figures, unless you specifyinclude:instances
.nocheckbox
- when searching for progress (aka percent complete) such asprogress=0
orprogress<50
then because that could include figures with a 0% progress, which is the default for all figures, then Curio only searches those that have a visible checkbox. However, you caninclude:nocheckbox
and all figures will be included, so you will want to construct query logic that includes another query element such as a required tag or resource to narrow the results.
If you want to include multiple types then use |
to separate them: include:instances|nocheckbox
Query Terms
Text
Text queries are case-insensitive contains searches by default. This means searching for mac
will match “macintosh” and “iMac” and “stomachache” as they all contain “mac”.
What Text is Searched?
With figures, the figure’s title or text content is included in the search, as well as any meta note text, OCR text, and the URL path if an URL is associated with the figure. Note that asset document contents are not included.
With Organizer items, such as idea spaces or documents dragged into the Organizer, the item title and any note text is included. The contents of Organizer documents are not included.
Phrases
You can search for multi-word phrases by using double-quotes, such as "MacBook Pro"
.
Regular Expressions
You can also use case-insensitive regular expressions (regex) in your text queries, thanks to a helpful /
prefix which tell Curio you’re entering regex.
Curio will auto-remove the slash from the term before performing the query.
For example, searching for /\bmac
will match words the start with “mac” such as “macintosh” but not “iMac” or “stomachache”.
Another example, searching for /\bping[0-7]
will find all figures that contains the word that starts with “ping” followed by a numeric between 0 and 7.
Thus it will match “ping1” and “ping535” but not “ping8” or “shopping2”.
Resources for regex include Regex Tutorial, Using ICU Regular Expressions, and RegEx101.
As a final example, say you type /steve.*jobs
as your query.
It will match the text “Steve Jobs”, “Steve P. Jobs”, “Steve Paul Jobs”, and “Steven Paul Jobs”.
Limitation
Entered regex can’t include a space.
Technical
Internally Curio uses your query to construct a formatted expression which it then passes to NSPredicate
to actually perform the query.
NSPredicate’s MATCHES
expression term is used to handle the regex evaluation so Curio is limited to its regex capabilities.
Text Within Asset Contents
Example: `zengobi curio`
Specify text within backticks, like `find me`
and Curio will use two mechanisms to find that text within your project’s assets:
- First SearchKit will be used to search simple text and PDF asset documents embedded within the project.
- Then Spotlight will be used to search your project’s documents that are located outside the project’s file package (since it can’t look within the package):
- All aliased asset documents that exist outside the project.
- All assets if your project’s library is located in an external asset library folder.
Spotlight’s mechnanism is much more powerful since it can index many more types of documents thanks to its extensible plugin architecture that Apple and 3rd parties can use.
However, Spotlight is limited in that it can’t index any files hidden within a package folder like Curio’s .curio
project package.
This is why we have to rely on Apple’s rather antiquated SearchKit system to index embedded text and PDF files.
Note if your query text is multiple words the search is performed as a complete word phrase.
Tags
Example: #cool
or #gtd/done
Prefix any tags with a #
. Note that all tags and tag sets need to be entered with spaces removed, case-insensitive.
- Tags nested within a tag set will need the full tag path specied. For example, you could search for
#detailedTasks/onhold
to match a figure or idea space associated with a tag named On Hold within the Detailed Tasks tag set. - You can also simply search for
#onhold
or#special
and it will find all items with that tag, either as a standalone keyword tag or as a tag within a tag set. - You can search for tag set names, like
#gtd/
(note the/
suffix), which will find all items associated with any tag in that tag set. As a shortcut, if the entered tag set name doesn’t coincidentally exist as a tag name you can simply enter#gtd
if you wish.
Quick Find and Search both support autocomplete while typing a tag so you can easily find and choose one from the popup that appears.
Items With Any Tag
You can also find all items that have any tag with the *
wildcard by searching for #*
.
Custom Data
Example: #country = us
If you’ve created custom figure data, such as “Price” and “First Name”, then you can build queries like #price > 30
and #firstname=george
.
Note the custom data field key has to begin with a #
, with spaces removed, case-insensitive.
With text values, the query is case-insensitive.
If you have a figure with a custom value of “George” then #firstname=george
or #firstname beginswith geo
will find it.
Quick Find and Search both support autocomplete while typing a custom data key so you can easily find and choose one from the popup that appears.
Resources
Example: @george
Prefix any resources with a @
.
The full resource name must be specified, spaces removed, case-insensitive. For example, you could search for @georgeBrowning
to match a figure associated with a resource named George Browning.
Quick Find and Search both support autocomplete while typing a resource so you can easily find and choose one from the popup that appears.
Items With Any Resource
You can also find all items that have any resource with the *
wildcard by searching for @*
.
Reference Types
Example: ^evidence
Prefix any reference types with a ^
.
The full reference type name must be specified, spaces removed, case-insensitive. For example, you could search for ^rebuttal or ^primaryWitness
to match a figure that has a Rebuttal or Primary Witness reference association.
Quick Find and Search both support autocomplete while typing a reference type so you can easily find and choose one from the popup that appears.
Items With Any Reference
You can also find all items that have any reference type with the *
wildcard by searching for ^*
.
Rating
Example: rating = 5
Query for ratings, such as rating >= 3
to find all figures with 3 or more stars.
Priority
Example: priority < 3
Query for priority, such as priority = 5
to find all figures with an urgent priority.
The values are as follows: very low (1), low (2), medium (3), high (4), or urgent (5) priority.
Progress
Example: progress = 0
You can query for figure progress (aka percent complete), such as progress < 100
.
Note that only figures that have a visible checkbox are included when the query could include results where progress is 0 because that’s the default state for all figures in Curio.
If you want to include items with no visible checkbox then start your query with include:nocheckbox
and be sure to include some other query parameter which will filter out regular figures.
For example, perhaps a tag like #gtd/
or a resource like @george
.
Dates
Example: due < 2w
Curio supports several different date fields: start
, due
, done
, added
, modified
.
Date values can be entered in standard YYYY-MM-DD format such as due=2021-12-25
or start>2021-01-01
.
You can also pass numeric values and Curio will compute the date for you:
start < 2
orstart < 2d
returns all items that start within the next 2 days.modified > -2w
returns all items modified in the past 2 weeks.due < 3m
returns items due within the next 3 months.start < 1y
returns items that start within the next year.
Project Milestones
You can also pass a project milestone as long as it’s entered without spaces.
For example, if you have a milestone of Beta 1 then you can find all figures modified after that milestone with modified > beta1
.
Kind
Example: kind = mindmap
Query for asset or figure kind such as kind = image
to find all images or kind = url
to find all URLs.
The not equals (!=
) operator is also handy so you can search for kind != ideaspace
for example.
Potential values include figure types such as:
text
,url
,image
,doc
ordocument
,video
,audio
,webarchive
,videorecording
,audiorecording
,bookmark
,ideaspacelink
,folder
,list
,mindmap
,table
,stack
,pinboard
,album
.
As well as Organizer types such as:
ideaspace
,odoc
orodocument
,ofolder
,oalias
,journal
.
File Extension
Example: ext = swift
Query for asset figure file extensions, such as ext=pdf
to find all PDF asset figures.
Automatic Substitutions
Curio performs a number of automatic substitutions to allow more readable expressions.
Type This | Maps to This | Allowing |
---|---|---|
on |
= |
due on 2021-12-25 |
in |
>= |
due in 2 weeks |
after |
> |
due after 2021-12-25 |
before |
< |
due before 2021-12-25 |
within |
< |
due within 1 month |
by |
<= |
due by 2021-12-25 |
x day(s) |
xd |
due in 2 days |
x week(s) |
xw |
due in 1 week |
x month(s) |
xm |
due in 6 months |
x year(s) |
xy |
due in 1 year |
today |
0d |
due before today |
tomorrow |
1d |
due after tomorrow |
yesterday |
-1d |
due before yesterday |
starts |
start |
starts before 2021-12-25 |
starting |
start |
starting in 2 weeks |
starts today |
starts = today |
starts today |
starts tomorrow |
starts = tomorrow |
starts tomorrow |
starts soon |
starts <= 7d |
starts soon |
due today |
due = today |
due today |
due soon |
due <= 7d |
due soon |
due tomorrow |
due = tomorrow |
due tomorrow |
overdue |
due < 0 |
overdue |
URL Scheme
Curio supports a curio://search?query=...
URL scheme which will bring up Quick Find with the given query.
Note that the query parameters have to be URL encoded so they are valid within the URL. Use the following mappings to convert certain special characters into their safe, encoded hex equivalents.
space | “ | # | % | & | < | > | @ | ^ |
---|---|---|---|---|---|---|---|---|
%20 | %22 | %23 | %25 | %26 | %3C | %3E | %40 | %5E |
So, for example, you would encode the query for:
"financial results" #Apple/iMac-Pro @Accounting start<2
as
curio://search?query=%22financial%20results%22%20%23Apple%2FiMac-Pro%20%40Accounting%20start%3C2
Online URL encoders can make this easier to do.