forked from extern/nushell
Came from [this discussion](https://discord.com/channels/601130461678272522/1348791953784836147/1349699872059691038) on discord with @fdncred # Description Small refactoring where I rename commands from "SubCommand" to its proper name. Motivations: better clarity (although subjective), better searchable, consistency. The only commands I didn't touch were "split list" and "ansi gradient" because of name clashes. # User-Facing Changes None # Tests + Formatting cargo fmt and clippy OK # After Submitting nothing required
53 lines
1.6 KiB
Rust
53 lines
1.6 KiB
Rust
use nu_engine::command_prelude::*;
|
|
use unicode_segmentation::UnicodeSegmentation;
|
|
|
|
#[derive(Clone)]
|
|
pub struct CommandlineGetCursor;
|
|
|
|
impl Command for CommandlineGetCursor {
|
|
fn name(&self) -> &str {
|
|
"commandline get-cursor"
|
|
}
|
|
|
|
fn signature(&self) -> Signature {
|
|
Signature::build(self.name())
|
|
.input_output_types(vec![(Type::Nothing, Type::Int)])
|
|
.allow_variants_without_examples(true)
|
|
.category(Category::Core)
|
|
}
|
|
|
|
fn description(&self) -> &str {
|
|
"Get the current cursor position."
|
|
}
|
|
|
|
fn search_terms(&self) -> Vec<&str> {
|
|
vec!["repl", "interactive"]
|
|
}
|
|
|
|
fn run(
|
|
&self,
|
|
engine_state: &EngineState,
|
|
_stack: &mut Stack,
|
|
call: &Call,
|
|
_input: PipelineData,
|
|
) -> Result<PipelineData, ShellError> {
|
|
let repl = engine_state.repl_state.lock().expect("repl state mutex");
|
|
let char_pos = repl
|
|
.buffer
|
|
.grapheme_indices(true)
|
|
.chain(std::iter::once((repl.buffer.len(), "")))
|
|
.position(|(i, _c)| i == repl.cursor_pos)
|
|
.expect("Cursor position isn't on a grapheme boundary");
|
|
match i64::try_from(char_pos) {
|
|
Ok(pos) => Ok(Value::int(pos, call.head).into_pipeline_data()),
|
|
Err(e) => Err(ShellError::GenericError {
|
|
error: "Failed to convert cursor position to int".to_string(),
|
|
msg: e.to_string(),
|
|
span: None,
|
|
help: None,
|
|
inner: vec![],
|
|
}),
|
|
}
|
|
}
|
|
}
|