telescope-frecency.nvim/doc/telescope-frecency.txt
JINNOUCHI Yasushi 14cb823ec2
docs: add note for FrecencyOpts (#208)
* docs: add lacked help tags

* docs: add FrecencyOpts and its explanation
2024-06-01 11:46:19 +09:00

600 lines
20 KiB
Plaintext

*telescope-frecency.txt* a telescope extension to use frecency matcher
License: MIT
CONTENTS *telescope-frecency-contents*
Introduction |telescope-frecency-introduction|
Requirements |telescope-frecency-requirements|
Installation |telescope-frecency-installation|
Usage |telescope-frecency-usage|
Command |telescope-frecency-command|
Configuration |telescope-frecency-configuration|
Database |telescope-frecency-database|
Highlight Groups |telescope-frecency-highlight-groups|
Reference |telescope-frecency-reference|
==============================================================================
INTRODUCTION *telescope-frecency-introduction*
This plugin is a |telescope.nvim| extension that offers intelligent
prioritization when selecting files from your editing history.
Using an implementation of Mozilla's Frecency algorithm (used in Firefox's
address bar), files edited “frecently” are given higher precedence in the list
index.
Frecency implementation
https://firefox-source-docs.mozilla.org/browser/urlbar/ranking.html#frecency-implementation
Firefox's address bar
https://support.mozilla.org/en-US/kb/address-bar-autocomplete-firefox
As the extension learns your editing habits over time, the sorting of the list
is dynamically altered to prioritize the files you're likely to need.
------------------------------------------------------------------------------
Frecency: Sorting by “frequently” and “recency”
*telescope-frecency-introduction-frecency*
“Frecency” is a score given to each unique file indexed in a file history
database. A timestamp is recorded once per session when a file is first loaded
into a buffer.
The score is calculated using the age of the 10 (customizable:
|telescope-frecency-configuration-max_timestamps|) most recent
timestamps and the total amount of times that the file has been loaded.
RECENCY VALUES *telescope-frecency-introduction-recency-values*
THese values are customizable: |telescope-frecency-configuration-recency_values|
┌───────────────┬───────┐
│ Timestamp age │ Value │
├───────────────┼───────┤
│ 4 hours │ 100 │
│ 1 day │ 80 │
│ 3 days │ 60 │
│ 1 week │ 40 │
│ 1 month │ 20 │
│ 90 days │ 10 │
└───────────────┴───────┘
SCORE CALCULATION *telescope-frecency-introduction-score-calculation*
Score is calculated by this formula.
>lua
score = frequency * recency_score / max_number_of_timestamps
------------------------------------------------------------------------------
What about files that are neither “frequent” or “recent”?
*telescope-frecency-introduction-non-indexed-files*
Frecency naturally works best for indexed files that have been given a
reasonably high score.
New projects or rarely used files with generic names either don't get listed
at all or can be buried under results with a higher score.
Frecency tackles this with “Workspace Filters”.
WORKSPACE FILTER *telescope-frecency-introduction-workspace-filter*
This feature enables you to select from user defined “filter tags” that map to
a directory or collection of directories. Filters are applied by entering
`:workspace_tag:` anywhere in the query. Filter name completion is available by
pressing `<Tab>` after the first `:` character.
When a filter is applied, results are reduced to entries whose path is a
descendant of the workspace directory. The indexed results are optionally
augmented with a listing of “all” files found in a recursive search of the
workspace directory. Non-indexed files are given a score of zero and appear
below the “frecent” entries. When a non-indexed file is opened, it gains a
score value and is available in future “frecent” search results.
If the active buffer (prior to the finder being launched) is attached to an
LSP server, an automatic `LSP` tag is available, which maps to the workspace
directories provided by the language server.
==============================================================================
REQUIREMENTS *telescope-frecency-requirements*
- |telescope.nvim| (required)
https://github.com/nvim-telescope/telescope.nvim
- nvim-web-devicons (optional)
https://github.com/kyazdani42/nvim-web-devicons
- `fd` or `ripgrep` (optional)
https://github.com/sharkdp/fd
https://github.com/BurntSushi/ripgrep
Note: `fd` or `ripgrep` will be used to list up workspace files. They are extremely
faster than the native Lua logic. If you don't have them, it fallbacks to Lua
code automatically. See the detail in
|telescope-frecency-configuration-workspace_scan_cmd|.
==============================================================================
INSTALLATION *telescope-frecency-installation*
This is an example for |lazy.nvim|.
lazy.nvim: https://github.com/folke/lazy.nvim
>lua
-- for lazy.nvim
{
"nvim-telescope/telescope-frecency.nvim",
config = function()
require("telescope").load_extension "frecency"
end,
}
If no database is found when running Neovim with the plugin installed, a new
one is created and entries from |shada| and |v:oldfiles| are automatically
imported.
==============================================================================
USAGE *telescope-frecency-usage*
>vim
:Telescope frecency
" Use a specifix workspace tag:
:Telescope frecency workspace=CWD
" You can use with telescope's options
:Telescope frecency workspace=CWD path_display={"shorten"} theme=ivy
or to map to a key:
>lua
vim.keymap.set("n", "<Leader>tf", function()
require("telescope").extensions.frecency.frecency {}
end)
-- Use a specifix workspace tag:
vim.keymap.set("n", "<Leader>tw", function()
require("telescope").extensions.frecency.frecency {
workspace = "CWD",
}
end)
-- You can use with telescope's options
vim.keymap.set("n", "<Leader>tt", function()
require("telescope").extensions.frecency.frecency {
workspace = "CWD",
path_display = { "shorten" },
theme = "ivy",
}
end)
Filter tags are applied by typing the `:tag:` name (adding surrounding colons)
in the finder query. Entering `:<Tab>` will trigger omni completion |compl-omni|.
*telescope-frecency-usage-dealing-with-uppercase-letters*
------------------------------------------------------------------------------
Dealing with upper case letters
In default, the sorter always ignores upper case letters in your input string.
But when |'smartcase'| is ON and input string includes one upper case letter
at least, it matches against exact the same as you input.
┌──────────────┬───────────────────────┬───────────────────────┐
│ input string │ |'smartcase'| is ON │ |'smartcase'| is OFF │
├──────────────┼───────────────────────┼───────────────────────┤
│ `abc` │ matches `abc`, `ABC`, `aBc` │ matches `abc`, `ABC`, `aBc` │
│ `aBc` │ matches `aBc` │ no match │
│ `ABC` │ matches `ABC` │ no match │
└──────────────┴───────────────────────┴───────────────────────┘
==============================================================================
COMMAND *telescope-frecency-command*
All commands are for DB maintenance. See also |telescope-frecency-database|.
*telescope-frecency-command-frecencydelete*
:FrecencyDelete [path] ~
You can delete entries from DB by this command. This command does not remove
the file itself, only from DB.
>vim
" delete the current opened file
:FrecencyDelete
" delete the supplied path
:FrecencyDelete /full/path/to/the/file
<
*telescope-frecency-command-frecencyvalidate*
:FrecencyValidate[!] ~
You can remove stale entries from the database manually. When `!` is suffixed
(|command-bang|), it never confirms you before removing.
>vim
" clean DB
:FrecencyValidate
" clean DB without prompts to confirm
:FrecencyValidate!
When you set `false` to |telescope-frecency-configuration-db_safe_mode|, the
prompts are never shown even if you call without the bang.
==============================================================================
CONFIGURATION *telescope-frecency-configuration*
You can call `setup()` with these configuration settings below.
>lua
-- example settings
require("telescope").setup {
extensions = {
frecency = {
auto_validate = false,
matcher = "fuzzy",
path_display = { "filename_first" },
},
},
}
<
*telescope-frecency-configuration-frecencyopts*
*FrecencyOpts*
`FrecencyOpts` is a convenient type to use your own configuration. With using
this in the type annotation, you can complete items by LSP in writing.
NOTE: You need a properly configured Language Server for this feature such as
lua-ls. https://github.com/LuaLS/lua-language-server
>lua
require("telescope").setup {
extensions = {
---@type FrecencyOpts
frecency = {
auto_validate = false,
-- …… other configs
}
},
}
<
*telescope-frecency-configuration-auto_validate*
auto_validate ~
Default: `true`
Type: `boolean`
If `true`, it removes stale entries count over than
|telescope-frecency-configuration-db_validate_threshold|.
*telescope-frecency-configuration-db_root*
db_root ~
Default: `vim.fn.stdpath "state"`
Type: `string`
Path to the parent directory of custom database location. Defaults to
|$XDG_STATE_HOME|/nvim (see |stdpath()|) if unset.
NOTE: The default value was `vim.fn.stdpath "data"`. If you doesn't set this
option and you have DB in `vim.fn.stdpath "data"` instead of
`vim.fn.stdpath "state"`, it uses the one in the old path for backward
compatibility. See the detail in the issue below.
https://github.com/nvim-telescope/telescope-frecency.nvim/issues/200
*telescope-frecency-configuration-db_safe_mode*
db_safe_mode ~
Default: `true`
Type: `boolean`
If `true`, it shows confirmation dialog by |vim.ui.select()| before validating DB.
See the note for |telescope-frecency-database|.
*telescope-frecency-configuration-db_validate_threshold*
db_validate_threshold ~
Default: `10`
Type: `integer`
It will remove entries when stale ones exist more than this count.
*telescope-frecency-configuration-default_workspace*
default_workspace ~
Default: `nil`
Type: `string?`
Default workspace tag to filter. For example, entries are filtered to ones in
the current directory when you set this to `"CWD"`. This can be overwritten in
querying by specifying another filter like `:FOO:`.
*telescope-frecency-configuration-disable_devicons*
disable_devicons ~
Default: `false`
Type: `boolean`
Disable devicons (if available).
*telescope-frecency-configuration-hide_current_buffer*
hide_current_buffer ~
Default: `false`
Type: `boolean`
If `true`, it does not show the filename in the current buffer in candidates.
*telescope-frecency-configuration-filter_delimiter*
filter_delimiter ~
Delimiters to indicate the filter like `:CWD:`.
*telescope-frecency-configuration-ignore_patterns*
ignore_patterns ~
Default:
for non-Windows: `{ "*.git/*", "*/tmp/*", "term://*" }`
for Windows: `{ [[*.git\*]], [[*\tmp\*]], "term://*" }`
Type: `string`
Patterns in this table control which files are indexed (and subsequently which
you'll see in the finder results).
*telescope-frecency-configuration-matcher*
matcher ~
Default: `"default"`
Type: `"default"|"fuzzy"`
WARNING: This option is highly experimental.
In default, it matches against candidates by the so-called “substr matcher”,
that is, you should input characters ordered properly. If you set here with
`"fuzzy"`, it uses “fzy matcher” implemented in |telescope.nvim| itself, and
combines the result with recency scores.
fzy matcher: https://github.com/jhawthorn/fzy
With this, you can select candidates fully fuzzily, besides that, can select
easily ones that has higher recency scores.
See the discussion in this issue.
https://github.com/nvim-telescope/telescope-frecency.nvim/issues/165
*telescope-frecency-configuration-max_timestamps*
max_timestamps ~
Default: `10`
Type: `integer`
Set the max count of timestamps DB keeps when you open files. It ignores the
value and use `10` if you set less than or equal to `0`.
Warning: When you reduce the value of this option, it removes old timestamps
when you open the file. It is reasonable to set this value more than or equal
to the default value: `10`.
*telescope-frecency-configuration-path_display*
path_display ~
Default: `nil`
Type: same as |telescope.defaults.path_display|
Overwrite |telescope.defaults.path_display|. This setting will be used by
these priorities below.
1. Option specified with the command or Lua code. Such as, >vim
:Telescope frecency path_display={"absolute"}
< or >lua
require("telescope").extensions.frecency.frecency {
path_display = { "absolute" },
}
2. `opts.extensions.frecency.path_display` in setup.
3. `opts.defaults.path_display` in setup.
>lua
require("telescope").setup {
defaults = {
-- This has the 3rd precedence.
path_display = { "absolute" },
},
extensions = {
frecency = {
-- This has the 2nd precedence.
path_display = { "shorten" },
},
},
}
<
*telescope-frecency-configuration-recency_values*
recency_values ~
Default: >lua
{
{ age = 240, value = 100 }, -- past 4 hours
{ age = 1440, value = 80 }, -- past day
{ age = 4320, value = 60 }, -- past 3 days
{ age = 10080, value = 40 }, -- past week
{ age = 43200, value = 20 }, -- past month
{ age = 129600, value = 10 }, -- past 90 days
}
Type: `{ age: integer, value: integer }[]`
Set weighting factors for calculating “frecency”. This option does not affect
values already recorded in DB. So you can change these values without spoiling
data.
*telescope-frecency-configuration-scoring_function*
scoring_function ~
Default: >lua
function(recency, fzy_score)
local score = (10 / (recency == 0 and 1 or recency)) - 1 / fzy_score
return score == -1 and -1.000001 or score
end
Type: `fun(recency: integer, fzy_score: number): number`
WARNING: This option is highly experimental.
This will be used only when |telescope-frecency-configuration-matcher| is
`"fuzzy"`. You can customize the logic to adjust scores between “fzy matcher”
scores and recency ones.
*telescope-frecency-configuration-show_filter_column*
show_filter_column ~
Default: `true`
Type: `boolean|string[]`
Show the path of the active filter before file paths. In default, it uses the
tail of paths for `"LSP"` and `"CWD"` tags. YOu can configure this by setting a
table for this option.
>lua
-- show the tail for "LSP", "CWD" and "FOO"
show_filter_column = { "LSP", "CWD", "FOO" }
<
*telescope-frecency-configuration-show_scores*
show_scores ~
Default: `false`
Type: `boolean`
To see scores calculated by the algorithm in the results, set this to `true`.
*telescope-frecency-configuration-show_unindexed*
show_unindexed ~
Default: `true`
Type: `boolean`
Determines if non-indexed files are included in workspace filter results.
*telescope-frecency-configuration-workspace_scan_cmd*
workspace_scan_cmd ~
Default: `nil`
Type: `"LUA"|string[]|nil`
With the default value: `nil`, it uses these ways below to make entries for
workspace files. It tries in order until it works successfully.
1. `fdfind -Htf`
2. `fd -Htf`
3. `rg -.g '!.git' --files`
4. Native Lua code (old way)
If you like another commands, set them to this option, like
`workspace_scan_cmd = { "find", ".", "-type", "f" }`.
*telescope-frecency-configuration-workspaces*
workspaces ~
Default: `{}`
Type: `table<string, string>`
This table contains mappings of `workspace_tag` → `workspace_directory`. The key
corresponds to the `:tag_name` used to select the filter in queies. The value
corresponds to the top level directory by which results will be filtered.
>lua
-- example configuration
workspaces = {
["conf"] = "/home/my_username/.config",
["data"] = "/home/my_username/.local/share",
["project"] = "/home/my_username/projects",
["wiki"] = "/home/my_username/wiki",
}
==============================================================================
DATABASE *telescope-frecency-database*
------------------------------------------------------------------------------
Location *telescope-frecency-database-location*
The default location for the database is `$XDG_DATA_HOME/nvim` (e.g.
`~/.local/share/nvim` on Linux). This can be configured with the
|telescope-frecency-configuration-db_root| config option. The filename for the
database is `file_frecency.bin` (not configurable).
------------------------------------------------------------------------------
Maintenance *telescope-frecency-database-maintenance*
By default, this plugin will prune files that no longer exist from the
database. In certain workflows, switching branches in a repository, that
behavior might not be desired. The following configuration control this
behavior.
- `db_safe_mode
When this is enabled, the user will be prompted before any entries are
removed from the database.
- `auto_validate
When this is `false`, stale entries will never be removed automatically.
If you want not to be bothered with such things and to remove stale results
silently, set these below.
>lua
require("telescope").setup {
extensions = {
frecency = {
db_safe_mode = false,
-- auto_validate is `true` in default
},
},
}
------------------------------------------------------------------------------
Compatibility *telescope-frecency-database-compatibility*
The former version of this plugin has used SQLite3 library to store data. The
PR #172 has removed the whole code for that.
feat!: remove code for SQLite by delphinus · Pull Request #172
https://github.com/nvim-telescope/telescope-frecency.nvim/pull/172
If you prefer the old SQLite database, you should lock the version to `a3e818d`
with your favorite plugin manager.
>lua
-- example for lazy.nvim
{
"nvim-telescope/telescope-frecency.nvim",
commit = "a3e818d001baad9ee2f6800d3bbc71c4275364ae",
}
==============================================================================
HIGHLIGHT GROUPS *telescope-frecency-highlight-groups*
This plugin defined these highlight groups below. You can set your own colors
before loading plugins.
*telescope-frecency-highlight-groups-telescopebufferloaded*
TelescopeBufferLoaded ~
Default: link to |hl-String|
This is used to highlight the filename already opened in buffers.
*telescope-frecency-highlight-groups-telescopepathseparator*
TelescopePathSeparator ~
Default: link to |hl-Directory|
This is used to highlight path separators: `/` (non-Windows), `\` (Windows).
*telescope-frecency-highlight-groups-telescopefrecencyscores*
TelescopeFrecencyScores ~
Default: link to |hl-Number|
This is used to highlight scores in the results.
*telescope-frecency-highlight-groups-telescopequeryfilter*
TelescopeQueryFilter ~
Default: link to |hl-WildMenu|
This is used to highlight query filter such as `:CWD:`.
==============================================================================
REFERENCE *telescope-frecency-reference*
Mozilla: Frecency algorithm
https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Frecency_algorithm
(Web Archive)
https://web.archive.org/web/20210421120120/https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Frecency_algorithm
vim:tw=78:fo=tcq2mM:ts=8:ft=help:norl:noet