aboutsummaryrefslogtreecommitdiffstats
path: root/matcher/src/config.rs
diff options
context:
space:
mode:
authorEllie Huxtable <ellie@elliehuxtable.com>2026-03-16 15:22:49 -0700
committerEllie Huxtable <ellie@elliehuxtable.com>2026-03-16 15:22:49 -0700
commit8f9777ce7aecfe1a163a915e3245466b9dd9ac2e (patch)
treea878a0495e5f84266b7e36918a9e1a9432b0ddd8 /matcher/src/config.rs
downloadatuin-8f9777ce7aecfe1a163a915e3245466b9dd9ac2e.zip
Squashed 'crates/atuin-nucleo/' content from commit 4253de9f
git-subtree-dir: crates/atuin-nucleo git-subtree-split: 4253de9faabb4e5c6d81d946a5e35a90f87347ee
Diffstat (limited to 'matcher/src/config.rs')
-rw-r--r--matcher/src/config.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/matcher/src/config.rs b/matcher/src/config.rs
new file mode 100644
index 00000000..eca7ae38
--- /dev/null
+++ b/matcher/src/config.rs
@@ -0,0 +1,70 @@
+use crate::chars::CharClass;
+use crate::score::BONUS_BOUNDARY;
+
+/// Configuration data that controls how a matcher behaves
+#[non_exhaustive]
+#[derive(PartialEq, Eq, Debug, Clone)]
+pub struct Config {
+ /// Characters that act as delimiters and provide bonus
+ /// for matching the following char
+ pub(crate) delimiter_chars: &'static [u8],
+ /// Extra bonus for word boundary after whitespace character or beginning of the string
+ pub(crate) bonus_boundary_white: u16,
+ /// Extra bonus for word boundary after slash, colon, semi-colon, and comma
+ pub(crate) bonus_boundary_delimiter: u16,
+ pub(crate) initial_char_class: CharClass,
+
+ /// Whether to normalize latin script characters to ASCII (enabled by default)
+ pub normalize: bool,
+ /// whether to ignore casing
+ pub ignore_case: bool,
+ /// Whether to provide a bonus to matches by their distance from the start
+ /// of the haystack. The bonus is fairly small compared to the normal gap
+ /// penalty to avoid messing with the normal score heuristic. This setting
+ /// is not turned on by default and only recommended for autocompletion
+ /// usecases where the expectation is that the user is typing the entire
+ /// match. For a full fzf-like fuzzy matcher/picker word segmentation and
+ /// explicit prefix literals should be used instead.
+ pub prefer_prefix: bool,
+}
+
+impl Config {
+ /// The default config for nucleo, implemented as a constant since
+ /// Default::default can not be called in a const context
+ pub const DEFAULT: Self = {
+ Config {
+ delimiter_chars: b"/,:;|",
+ bonus_boundary_white: BONUS_BOUNDARY + 2,
+ bonus_boundary_delimiter: BONUS_BOUNDARY + 1,
+ initial_char_class: CharClass::Whitespace,
+ normalize: true,
+ ignore_case: true,
+ prefer_prefix: false,
+ }
+ };
+}
+
+impl Config {
+ /// Configures the matcher with bonuses appropriate for matching file paths.
+ pub fn set_match_paths(&mut self) {
+ if cfg!(windows) {
+ self.delimiter_chars = b"/:\\";
+ } else {
+ self.delimiter_chars = b"/:";
+ }
+ self.bonus_boundary_white = BONUS_BOUNDARY;
+ self.initial_char_class = CharClass::Delimiter;
+ }
+
+ /// Configures the matcher with bonuses appropriate for matching file paths.
+ pub const fn match_paths(mut self) -> Self {
+ if cfg!(windows) {
+ self.delimiter_chars = b"/\\";
+ } else {
+ self.delimiter_chars = b"/";
+ }
+ self.bonus_boundary_white = BONUS_BOUNDARY;
+ self.initial_char_class = CharClass::Delimiter;
+ self
+ }
+}