pub struct HistoryEngine { /* private fields */ }Expand description
SQLite-backed history engine.
Replaces the in-memory histent doubly-linked list +
histfile flat-file pair from Src/hist.c — same logical
history but with FTS5 search, frequency tracking, and
per-directory context.
Implementations§
Source§impl HistoryEngine
impl HistoryEngine
pub fn new() -> Result<HistoryEngine, Error>
pub fn in_memory() -> Result<HistoryEngine, Error>
Sourcepub fn text_path() -> PathBuf
pub fn text_path() -> PathBuf
$ZSHRS_HOME/zshrs_history — flat text mirror, one line per
command in zsh extended-history format:
: <unix_ts>:<duration>;<command>Newlines inside multi-line commands are escaped as the literal
two-character sequence \\n (matches setopt EXTENDED_HISTORY
— zsh/Src/hist.c:gethistent). Every add appends one line;
update_last rewrites the trailing line in place when the
duration becomes known. The sqlite index at zshrs_history.db
is the query-side mirror of this file — they’re kept in lockstep
by the writer, and a divergence-repair pass on open re-reads
the text file if the sqlite is missing or older.
Sourcepub fn add(&self, command: &str, cwd: Option<&str>) -> Result<i64, Error>
pub fn add(&self, command: &str, cwd: Option<&str>) -> Result<i64, Error>
Add a command to history, updating frequency if it already exists
Sourcepub fn update_last(
&self,
id: i64,
duration_ms: i64,
exit_code: i32,
) -> Result<(), Error>
pub fn update_last( &self, id: i64, duration_ms: i64, exit_code: i32, ) -> Result<(), Error>
Update the duration and exit code of the last command
Sourcepub fn search(
&self,
query: &str,
limit: usize,
) -> Result<Vec<HistoryEntry>, Error>
pub fn search( &self, query: &str, limit: usize, ) -> Result<Vec<HistoryEntry>, Error>
Search history with FTS5 (fuzzy/substring matching)
Sourcepub fn search_prefix(
&self,
prefix: &str,
limit: usize,
) -> Result<Vec<HistoryEntry>, Error>
pub fn search_prefix( &self, prefix: &str, limit: usize, ) -> Result<Vec<HistoryEntry>, Error>
Search history with prefix matching (for up-arrow completion)
Sourcepub fn recent(&self, limit: usize) -> Result<Vec<HistoryEntry>, Error>
pub fn recent(&self, limit: usize) -> Result<Vec<HistoryEntry>, Error>
Get recent history entries
Sourcepub fn for_directory(
&self,
cwd: &str,
limit: usize,
) -> Result<Vec<HistoryEntry>, Error>
pub fn for_directory( &self, cwd: &str, limit: usize, ) -> Result<Vec<HistoryEntry>, Error>
Get history for a specific directory
Sourcepub fn get_by_offset(
&self,
offset: usize,
) -> Result<Option<HistoryEntry>, Error>
pub fn get_by_offset( &self, offset: usize, ) -> Result<Option<HistoryEntry>, Error>
Get entry by index from end (0 = most recent, like !-1)
Sourcepub fn get_by_number(&self, num: i64) -> Result<Option<HistoryEntry>, Error>
pub fn get_by_number(&self, num: i64) -> Result<Option<HistoryEntry>, Error>
Get entry by absolute history number (like !123)
Auto Trait Implementations§
impl !Freeze for HistoryEngine
impl !RefUnwindSafe for HistoryEngine
impl Send for HistoryEngine
impl !Sync for HistoryEngine
impl Unpin for HistoryEngine
impl UnsafeUnpin for HistoryEngine
impl !UnwindSafe for HistoryEngine
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.Source§impl<U, T> ToOwnedObj<U> for Twhere
U: FromObjRef<T>,
impl<U, T> ToOwnedObj<U> for Twhere
U: FromObjRef<T>,
Source§fn to_owned_obj(&self, data: FontData<'_>) -> U
fn to_owned_obj(&self, data: FontData<'_>) -> U
T, using the provided data to resolve any offsets.