Page
Library
Module
Module type
Parameter
Class
Class type
Source
TUI multiline fuzzy document finder
Think interactive grep for both text files and PDFs, but word/token based instead of regex and line based, so you can search across lines easily.
Docfd aims to provide good UX via integration with common text editors and PDF viewers, so you can jump directly to a search result with a single key press.
Navigating repo:
Navigating "OCaml Programming: Correct + Efficient + Beautiful" book PDF and opening it to the closest location to the selected search result via PDF viewer integration:
Docfd uses the text editor specified by $VISUAL
(this is checked first) or $EDITOR
.
Docfd opens the file at first line of search result for the following editors:
nano
nvim
/vim
/vi
kak
hx
emacs
micro
jed
/xjed
Docfd guesses the default PDF viewer based on the output of xdg-mime query default application/pdf
, and invokes the viewer either directly or via flatpak depending on where the desktop file can be first found in the list of directories specified by $XDG_DATA_DIRS
.
Docfd opens the file at first page of the search result and starts a text search of the most unique word of the matched phrase within the same page for the following viewers:
Docfd opens the file at first page of the search result for the following viewers:
Statically linked binaries are available via GitHub releases
Docfd is also packaged on:
Notes for packagers: Outside of the OCaml toolchain for building (if you are packaging from source), Docfd also requires the following external tools at run time for full functionality:
pdftotext
from poppler-utils
for PDF supportfzf
for file selection menu if user requests itcommand | docfd
Docfd uses Single file view when source of document is piped stdin.
Files specified as arguments to docfd are ignored in this case.
docfd [PATH...]
The list of paths can contain directories. Each directory in the list is scanned recursively for files with one of the following extensions by default:
.txt
.md
.pdf
You can change the file extensions to use via --exts
, or add onto the list of extensions via --add-exts
.
If the list of paths is empty, then Docfd defaults to scanning the current directory .
.
If any of the file ends with .pdf
, then pdftotext
is required to continue.
If exactly one file is specified in the list of paths, then Docfd uses Single file view. Otherwise, Docfd uses Multi-file view.
docfd [PATH...] ?
The ?
can be in any position in the path list. If any of the path is ?
, then file selection of the discovered files via fzf
is invoked.
The search field takes a search expression as input. A search expression is one of:
fuzzy search
?expression
(optional)(expression)
expression | expression
(or), e.g. go ( left | right )
To use literal ?
, (
, )
or |
, a backslash (\
) needs to be placed in front of the character.
For a phrase with optional operator, such as ?word0 word1 ...
, the first word is grouped implicitly, i.e. it is treated as ?(word0) word1 ...
.
Document content and user input in the search field are tokenized/segmented in the same way, based on:
A search phrase is a list of said tokens.
Search procedure is a DFS through the document index, where the search range for a word is fixed to a configured range surrounding the previous word (when applicable).
A token in the index matches a token in the search phrase if they fall into one of the following cases:
Search results are then ranked using heuristics.
The default TUI is divided into four sections:
Bottom pane consists of:
Docfd operates in modes, the initial mode is Navigation
mode.
Navigation
mode
Scroll down the document list
j
Scroll up the document list
k
Scroll down the search result list
Shift
+J
Shift
+Down arrowShift
+Page downScroll up the document list
Shift
+K
Shift
+Up arrowShift
+Page upOpen document
Enter
$VISUAL
first, if that fails then Docfd tries $EDITOR
Switch to single file view
Tab
Switch to Require content
mode
?
Switch to Search
mode
/
Clear search phrase
x
Exit Docfd
Esc
, Ctrl+C
or Ctrl+Q
Search
mode
Enter
to confirm search phrase and exit the modeRequire content
mode
Enter
to confirm file content requirements and exit the modeThe required content field accepts a content requirement expression.
A content requirement expression is one of:
(expression)
expression & expression
expression | expression
Note that the edit distance is not considered here. Only case-insensitive exact matches or substring matches against the search phrases are considered.
In other words, given the same phrase, it is treated less fuzzily as a content requirement expression compared to being used as a search phrase in the search field.
If the specified path to Docfd is not a directory, then single file view is used.
In this view, the TUI is divided into only two sections:
The controls are simplified in single file view, namely Shift
is optional for scrolling through search result list.
Navigation
mode
Scroll down the search result list
j
Shift
+J
Shift
+Down arrowShift
+Page downScroll up the document list
k
Shift
+K
Shift
+Up arrowShift
+Page upOpen document
Enter
$VISUAL
first, if that fails then Docfd tries $EDITOR
Switch to multi-file view
Tab
Switch to Search
mode
/
Clear search phrase
x
Exit Docfd
Esc
, Ctrl+C
or Ctrl+Q
Search
mode
Enter
to confirm search phrase and exit search modeFile auto-reloading is not supported for PDF files, as PDF viewers are invoked in the background via shell. It is possible to support this properly in the ways listed below, but requires a lot of engineering for potentially very little gain:
inotify
or via checking file modification times periodically.