Search in files and Pending items

Searching files and documents

Watch the videoSearch your notes 00:15

Use Ctrl+Shift+F for the global search in the sidebar's Search tab, powered by ripgrep: it supports regex, case sensitivity, whole word and bulk replace. Within the current file, Ctrl+F finds and Ctrl+H replaces. On a result, the context menu opens the file, copies its path and shows it in Explorer, and Remove from results takes the file off the list: Replace all no longer changes it, and the confirmation counts only what is left.

Search reaches documents too. Beyond .md notes, it reads the text of PDF, spreadsheets (.xlsx/.ods), Word documents (.docx), LibreOffice text (.odt), presentations (.pptx) and books (.epub). The same goes for AI Chat and for the semantic search. A hit inside a PDF opens the file on the page of the excerpt. The extracted text lives in a cache outside the workspace, refreshes itself when the file changes, and is deleted once the file is gone. The first time costs: opening a workspace with many PDFs starts an extraction that takes minutes, and until it ends the documents are not in the search yet. The Search tab says so while it happens — preparing the documents (12 of 80) — and tells you when you can run the search again. From the second time on, only what changed is redone.

Also covered: .rtf, .xps/.oxps, LibreOffice presentations (.odp), video subtitles (.srt/.vtt), plain-text tables (.csv/.tsv), saved pages (.html/.mhtml), archived email (.eml), Jupyter notebooks (.ipynb), bibliographies (.bib/.ris) and plain-text files (.txt). Text markup languages have their own reader — reStructuredText (.rst), AsciiDoc (.adoc), Org (.org) and Typst (.typ): sections become headings, lists and tables become ours, formulas are drawn, and the preamble is left out — without that, #set page(...) and :stem: latexmath would become indexed chunks, and the section name would not travel with its text. A hit in a subtitle opens at the moment the line was spoken.

A scanned PDF does not vanish in silence. A document with pages and no text (a photo of each page, without OCR) enters the index carrying a line that says so, and the Search tab tells you how many there are — without that sentence you would look for something that is in the book, not find it, and conclude that the search is broken. And you can make it readable: with Tesseract installed (LightNote offers to install it in one click), the PDF's ⋯ menu offers Recognize the text (OCR)…. It runs once, per document and may take several minutes — after that the text sits in the index like any other PDF's. The Search tab notice takes you to the first document in that state.

The cache stores the text in the clear. It lives in your user folder, outside the workspace: anyone with access to it can read your documents' contents there, even if the original sits on an encrypted disk. An .lne file (the encrypted note) never enters the cache — it exists precisely so it is not readable on disk.

LaTeX goes through a reader of its own. A .tex file is not read as raw text: the preamble is left out, \section becomes a heading, \cite becomes [@key] and the formula passes through whole — it is drawn by the same engine that draws the mathematics in your notes. A hit opens the file on the line it came from. The file's context menu — or the tab bar, with it open — offers Import as note (.md): the note is created next to it, the .tex stays where it is and importing twice does not overwrite. The other direction is Export as LaTeX (.tex)..., on the note's bar.

Document preview and source code

Opening a document shows a text preview. A .docx, .odt, .epub or .pptx opens read-only, with the extracted text and the document's images — without Word styles, image positioning, complex tables or tracked changes. The tab is still the document: its name, its folder and the session point to it, not to the cache. An .xlsx spreadsheet still opens in the table view, which shows far more.

Source code can join the search by meaning too. Under Tools → Workspace → Workspace settings... there is Include source code in the search by meaning: code files get indexed alongside the notes, one chunk per function or class — that is what makes questions like “where do I handle the timeout?” find the whole function instead of a piece cut in the middle of an if. It honors .gitignore. It ships off, and per folder: notes change slowly, code changes all day, and a working repository produces tens of thousands of chunks — each one a call billed by your embeddings provider.

Importing documents and other apps

Watch the videoImport from Notion 00:21

Turning the document into a note. From File → Import document as note... (several at once), the tree's context menu or the Import as note (.md) button in the preview itself, a .docx, .odt, .epub, .rtf, .pptx, .html, .eml, PDF or LaTeX file becomes an editable note next to the file. Along come the text with headings, lists, links and tables, the footnotes, Word equations as LaTeX formulas and the images, saved in the Attachments folder next to the note. The document's title, author and date become properties, with source saying which file the note came from. The original stays where it is — importing is not converting — and importing again creates name 02.md instead of overwriting what you edited. It is not offered for Jupyter notebooks (they become Blocks), .csv (it opens as a table), the .bib/.ris bibliography (citations read it directly) or source code. The structure comes from the document's styles: a Word heading is recognized even when the style name is translated, character styles give bold, italics and code, quote and code paragraphs become our blocks, and the automatic table of contents becomes a [TOC] that the note keeps up to date; from .rtf come lists, tables and links, and from HTML — including what Word and Google Docs save — and from EPUB come headings, nested lists and tables. The documents are read in the background, as a task in the Activities panel: the window keeps responding while a large PDF is converted, and Stop ends the import before the next file.

See what the folder uses from another editor. In Tools → Check folder compatibility..., LightNote reads the notes in the open folder and sorts what it found into three groups: what it draws (wikilink, transclusion, callout, tag, highlight, formula, footnote, task, block marker), what stays in the file without being drawn (the plugin query dataview, tasks or query, the .canvas board, the .base database and block transclusion) and what can be converted to the spelling used here. Converting is your choice, never a side effect of saving: tick the constructs, look at the side-by-side preview and confirm — each changed file gets a point in File history before it is written, and anything open with unsaved changes is left out. There are two conversions today, and neither costs anything on the Obsidian side, which reads both spellings: an obsidian:// link to this folder becomes [[note]] — one pointing at another vault is not converted, because the destination would change — and the inline footnote ^[text] becomes [^n], with the definition at the end.

Bringing a whole Notion workspace across. In Notion, use Export → HTML (or Markdown & CSV) with Include subpages, put the downloaded .zip — or the folder — inside your workspace, create the destination folder and run lnote vault-import --path <export> --out <destination> (or the vault_import tool, from the AI assistant). There is no need to unzip, not even the whole-workspace export, which carries another .zip inside. Each page becomes a note: page properties become note properties, the coloured Notion callout becomes our box (in HTML the colour decides the type; Markdown keeps no colour, so the box arrives as a note), a to-do arrives with its checkbox ticked or not, an equation becomes a LaTeX formula, a toggle becomes a <details> box (and a toggle heading becomes a heading), the page's table of contents becomes [TOC], and links between pages are rewritten to the new notes — two pages with the same title live side by side, because the second becomes name 02.md and the links still point at the right one. Databases are copied as .csv into Anexos, and a #topic written in Notion stays text — it was no tag there, and it does not become one here. Nothing is overwritten, and a report note is written next to them saying how many notes and attachments came in and listing the links that found no target — those stay exactly as they were written.

The gesture is in the menu. File → Import from another app... opens the assistant: choose the folder or the .zip you exported (an Evernote .enex works too) and the source app is recognised by the shape of the file names — if it is not, pick it from the list beside it. The whole folder is read, subpages included. The destination comes filled in with a new folder inside the workspace, named after the app, so the archive does not mix with your own notes. Reading and writing happen off the window, and at the end the screen says how many notes and attachments came in and how many links were rewritten.

Five apps. From Notion, the folder or the .zip exported as HTML or as Markdown; from Evernote, the .enex; from Joplin, the .jex (or the MD + Front Matter folder); from Logseq, the graph folder — the one with logseq/config.edn in it; and from Roam Research, the export .json. In all of them notebooks and namespaces become folders, journals go to the daily notes folder named yyyy-MM-dd, a task becomes - [ ], a highlight becomes ==like this==, and a block reference becomes that block's text in quotes plus a link to the page it lives on — no other app's syntax enters your vault. What has no equivalent here, such as a Logseq query or a Roam table, stays as inline code, and the report says how many times.

Highlight, marks and Pending

Highlights and marks are different things. The quick find (Ctrl+F) only highlights the matches in amber: it is temporary and disappears when you close the bar or clear the field. Mark all in Edit → Advanced find…, on the other hand, is your decision — it paints the matches red and adds the bookmark (the blue dot in the margin) on the matching lines, which stay until you use Clear marks. The two are independent: closing the quick find does not erase what you marked, and clearing the marks does not erase the find highlight. Both show up in the minimap strip, each in its own colour. Clear marks removes only the dots that Mark all created: a bookmark you placed by hand (Ctrl+F2) on a line that matched the search stays where it was.

The sidebar's Pending section gathers in one place the TODO/FIXME markers from code and the tasks (- [ ]) from the workspace's Markdown notes — click to jump straight to the line. Open cards from this folder's .lnt boards come in a group of their own, Board cards, with the nearest date on top; clicking one opens the board. A checkbox inside a code block doesn't count — it is an example, and ticking it here would write into the code sample — and neither does anything in the templates or prompts folder, which are patterns. A card's date comes before its title, without the year when it is the current one, and the line at the top counts the code items, the tasks and the cards. The list is rebuilt when the section opens and by the Refresh button; ticking a task's checkbox writes [x] into the note, and the Tasks in the status bar count follows right after.

At the top of the section is a month calendar with the same dots as the Calendar window, but only for this folder: dated tasks, board cards and events from ```calendar fences (the daily note, which is one for the whole app, shows too). Clicking a day shows only what belongs to it, with the Of the day group on top — the daily note, or Create this day's note; clear, or clicking the same day again, brings the full list back. Code TODOs have no date and are hidden while the filter is on. The Calendar · this folder button collapses the grid for anyone who only wants the code items. Only cards that are still open mark the grid; those of the chosen day stay in their own group, and Of the day also lists that day's events from the fences.