Skip to main content

DirPickSource

Struct DirPickSource 

Source
pub struct DirPickSource {
    pub spec: PickerSourceSpec,
}
Expand description

PC.9: dir-pick — FilePickSource’s directory peer. Browse to a directory and supply its path as a value.

§Incremental, not a walk

The candidates are the children of the directory the query names, filtered by the basename it ends with — gen:directories’ model, which is what emacs’s read-directory-name does. It shares the implementation with that generator (lattice_completion::builtins::generators::path_entries) rather than copying it, so <Tab> on the : line and this picker cannot disagree about what listing a path means.

walk_files_for_picker with directories instead of files was the obvious alternative and is the wrong one here: it has no depth cap and a flat FILE_PICKER_MAX_ENTRIES ceiling, so pointed anywhere near a home directory it stops somewhere arbitrary and the directory you wanted may simply not be in the list. Incremental has no ceiling, reaches any depth, and opens in one read_dir.

§It starts at HOME, where file-pick starts at the workspace root

Not an inconsistency. Picking a file is nearly always picking one in the project you are in, so the workspace root is the useful default. Picking a directory is nearly always about going somewhere you are not — the motivating case is choosing a project you have never opened — and rooting that at the project you are already in would make the common case start in the one place it does not want.

An explicit start argument still wins, and :picker dir-pick . is the spelling for “here”.

§Tilde survives into the rows on purpose

A row’s text keeps whatever spelling the query used (~/src/…), because that is what the user is reading and typing against, and descending re-lists from it unchanged. The value handed back on accept is the expanded absolute path off CandidateData::File, because a consumer resolving it has no obligation to know about ~.

Fields§

§spec: PickerSourceSpec

Implementations§

Trait Implementations§

Source§

impl Default for DirPickSource

Source§

fn default() -> DirPickSource

Returns the “default value” for a type. Read more
Source§

impl PickerSourceGenerator for DirPickSource

Source§

fn on_query_changed( &self, _ctx: &PickerContext<'_>, query: &str, ) -> Option<Result<PickerInitResult, String>>

Re-list on every keystroke. An unreadable query yields an EMPTY list, not an error: half a typed path names nothing yet, and that is the state the user is in for most of the keystrokes — erroring on it would mean the picker spends its life reporting failure.

Source§

fn descend( &self, _ctx: &PickerContext<'_>, candidate: &RawCandidate, ) -> Option<String>

<C-l>: the selected row’s own text becomes the query, so the next listing is of its children. It already ends in / — path_entries puts one on every directory — which is exactly the prefix that lists a directory’s contents rather than its siblings.

Source§

fn accept_navigates( &self, _ctx: &PickerContext<'_>, candidate: &RawCandidate, ) -> Option<String>

PP.3: <CR> on ../ GOES UP. It does not choose the parent.

PP.1 shipped the other reading — ../ is an ordinary row, so <CR> supplies its path like every other row does — and it was wrong in the way that only shows up in use. ../ reads as a verb, every file browser there is (netrw, oil, ranger, lf, telescope-file-browser) treats <CR> on .. as “go up”, and the UX-convention rule says muscle memory wins on a surface like this one.

What it looked like in practice: <CR> on ../ at ~/ supplied /Users, which the project flow then refused — an error message where the user had asked to go up a level.

Only this row. Every other row in this picker is a directory you might be choosing, and <CR> still chooses it.

Source§

fn ascend(&self, query: &str) -> Option<String>

<C-w>: drop the last path component.

parent_of does the work, shared with the ../ row so the key and the row cannot land in different places. / stays a fixed point — parent_of answers None there, and this returns the query unchanged so the host recognises it and spends no re-query.

Source§

fn initial_query(&self, args: &[String]) -> Option<String>

PP.1: open on the start directory rather than on an empty query.

The query IS the directory being listed here, so an empty one leaves the prompt unable to say where you are — every row carries a path and the one line meant to orient you carries nothing. It also left ascend with no last component to drop, so the first press did nothing and the second worked.

The trailing / is what makes it a LISTING rather than a filter: path_entries("~/src") lists ~’s children whose names start with src, where path_entries("~/src/") lists what is inside. Seeding the un-slashed form is the bug this normalisation exists to prevent, and :picker dir-pick /tmp walked straight into it.

Source§

fn spec(&self) -> &PickerSourceSpec

Generator metadata. Returned by reference so the registry can stamp it into :describe-picker / :picker <Tab> listings without cloning.
Source§

fn init( &self, _ctx: &PickerContext<'_>, args: &[String], ) -> Result<PickerInitResult, String>

Build the candidate set. Sync prelude: read what’s needed from ctx, clone into async captures if necessary, return the appropriate PickerInitResult variant. Synchronous errors (no active buffer when one was required, args validation failure) return Err; the host echoes the error and leaves the picker closed. Read more
Source§

fn accept( &self, _ctx: &PickerContext<'_>, routing: &RoutingPayload, ) -> Result<PickerAcceptOutcome, String>

Translate the user’s chosen routing payload into a typed PickerAcceptOutcome the host applies. The generator owns the mapping from its emitted routing-payload variant(s) to outcome(s); mismatch returns Err, which the host echoes.
Source§

fn accept_async( &self, _ctx: &PickerContext<'_>, _routing: &RoutingPayload, ) -> Option<Pin<Box<dyn Future<Output = Result<PickerAcceptOutcome, String>> + Send>>>

Async-accept hook. Default None means “this source resolves accept synchronously” — every native source takes this path and is unchanged. Read more
Source§

fn preview( &self, _ctx: &PickerContext<'_>, _routing: &RoutingPayload, ) -> Option<PickerPreviewOutcome>

T.12: live-preview hook — invoked as the picker SELECTION moves to a candidate (before accept). Default None = no preview. A source returns an outcome the host applies immediately for a live preview; the host restores prior state on . Read more
Source§

fn preview_debounce(&self) -> Option<Duration>

MG.54: how long the selection must sit still before the host calls preview. None (the default) = call it inline on every selection move, which is right for a source whose preview is a cheap projection of data it already holds. Read more
Source§

fn owner_plugin(&self) -> Option<u64>

PH.1: the host-issued id of the plugin that contributed this source, None for a native one. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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 more
§

impl<T> IntoMaybeUndefined<T> for T

§

fn into_maybe_undefined(self) -> MaybeUndefined<T>

Converts this value into a three-state builder argument.
§

impl<T> IntoOption<T> for T

§

fn into_option(self) -> Option<T>

Converts this value into an optional builder argument.
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> Pointee for T

§

type Pointer = u32

§

fn debug( pointer: <T as Pointee>::Pointer, f: &mut Formatter<'_>, ) -> Result<(), Error>

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more