mirror of
https://github.com/nushell/nushell
synced 2025-01-14 14:14:13 +00:00
add command g to switch shell quickly (#4014)
Signed-off-by: Tw <tw19881113@gmail.com>
This commit is contained in:
parent
bd0baa961c
commit
1297499d7a
6 changed files with 70 additions and 0 deletions
51
crates/nu-command/src/commands/shells/goto.rs
Normal file
51
crates/nu-command/src/commands/shells/goto.rs
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
use crate::prelude::*;
|
||||||
|
use nu_engine::WholeStreamCommand;
|
||||||
|
use nu_errors::ShellError;
|
||||||
|
use nu_protocol::{CommandAction, ReturnSuccess, Signature, SyntaxShape};
|
||||||
|
|
||||||
|
pub struct Goto;
|
||||||
|
|
||||||
|
impl WholeStreamCommand for Goto {
|
||||||
|
fn name(&self) -> &str {
|
||||||
|
"g"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn signature(&self) -> Signature {
|
||||||
|
Signature::build("g").required("index", SyntaxShape::Int, "the shell's index to go to")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn usage(&self) -> &str {
|
||||||
|
"Go to specified shell."
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_with_actions(&self, args: CommandArgs) -> Result<ActionStream, ShellError> {
|
||||||
|
goto(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn examples(&self) -> Vec<Example> {
|
||||||
|
vec![Example {
|
||||||
|
description: "Enter the first shell",
|
||||||
|
example: "g 0",
|
||||||
|
result: None,
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn goto(args: CommandArgs) -> Result<ActionStream, ShellError> {
|
||||||
|
Ok(ActionStream::one(ReturnSuccess::action(
|
||||||
|
CommandAction::GotoShell(args.req(0)?),
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::Goto;
|
||||||
|
use super::ShellError;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn examples_work_as_expected() -> Result<(), ShellError> {
|
||||||
|
use crate::examples::test as test_examples;
|
||||||
|
|
||||||
|
test_examples(Goto {})
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,11 +1,13 @@
|
||||||
mod command;
|
mod command;
|
||||||
mod enter;
|
mod enter;
|
||||||
mod exit;
|
mod exit;
|
||||||
|
mod goto;
|
||||||
mod next;
|
mod next;
|
||||||
mod prev;
|
mod prev;
|
||||||
|
|
||||||
pub use command::Shells;
|
pub use command::Shells;
|
||||||
pub use enter::Enter;
|
pub use enter::Enter;
|
||||||
pub use exit::Exit;
|
pub use exit::Exit;
|
||||||
|
pub use goto::Goto;
|
||||||
pub use next::Next;
|
pub use next::Next;
|
||||||
pub use prev::Previous;
|
pub use prev::Previous;
|
||||||
|
|
|
@ -77,6 +77,7 @@ pub fn create_default_context(interactive: bool) -> Result<EvaluationContext, Bo
|
||||||
// Shells
|
// Shells
|
||||||
whole_stream_command(Next),
|
whole_stream_command(Next),
|
||||||
whole_stream_command(Previous),
|
whole_stream_command(Previous),
|
||||||
|
whole_stream_command(Goto),
|
||||||
whole_stream_command(Shells),
|
whole_stream_command(Shells),
|
||||||
whole_stream_command(Enter),
|
whole_stream_command(Enter),
|
||||||
whole_stream_command(Exit),
|
whole_stream_command(Exit),
|
||||||
|
|
|
@ -177,6 +177,9 @@ impl Iterator for InternalIterator {
|
||||||
CommandAction::NextShell => {
|
CommandAction::NextShell => {
|
||||||
self.context.shell_manager().next();
|
self.context.shell_manager().next();
|
||||||
}
|
}
|
||||||
|
CommandAction::GotoShell(i) => {
|
||||||
|
self.context.shell_manager().goto(i);
|
||||||
|
}
|
||||||
CommandAction::LeaveShell(code) => {
|
CommandAction::LeaveShell(code) => {
|
||||||
self.context.shell_manager().remove_at_current();
|
self.context.shell_manager().remove_at_current();
|
||||||
if self.context.shell_manager().is_empty() {
|
if self.context.shell_manager().is_empty() {
|
||||||
|
|
|
@ -136,6 +136,16 @@ impl ShellManager {
|
||||||
self.set_path(self.path())
|
self.set_path(self.path())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn goto(&self, i: usize) {
|
||||||
|
{
|
||||||
|
let shell_len = self.shells.lock().len();
|
||||||
|
if i < shell_len {
|
||||||
|
self.current_shell.store(i, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.set_path(self.path())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn homedir(&self) -> Option<PathBuf> {
|
pub fn homedir(&self) -> Option<PathBuf> {
|
||||||
let env = self.shells.lock();
|
let env = self.shells.lock();
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,8 @@ pub enum CommandAction {
|
||||||
PreviousShell,
|
PreviousShell,
|
||||||
/// Go to the next shell in the shell ring buffer
|
/// Go to the next shell in the shell ring buffer
|
||||||
NextShell,
|
NextShell,
|
||||||
|
/// Jump to the specified shell in the shell ring buffer
|
||||||
|
GotoShell(usize),
|
||||||
/// Leave the current shell. If it's the last shell, exit out of Nu
|
/// Leave the current shell. If it's the last shell, exit out of Nu
|
||||||
LeaveShell(i32),
|
LeaveShell(i32),
|
||||||
}
|
}
|
||||||
|
@ -51,6 +53,7 @@ impl PrettyDebug for CommandAction {
|
||||||
CommandAction::AddPlugins(..) => DbgDocBldr::description("add plugins"),
|
CommandAction::AddPlugins(..) => DbgDocBldr::description("add plugins"),
|
||||||
CommandAction::PreviousShell => DbgDocBldr::description("previous shell"),
|
CommandAction::PreviousShell => DbgDocBldr::description("previous shell"),
|
||||||
CommandAction::NextShell => DbgDocBldr::description("next shell"),
|
CommandAction::NextShell => DbgDocBldr::description("next shell"),
|
||||||
|
CommandAction::GotoShell(_) => DbgDocBldr::description("goto shell"),
|
||||||
CommandAction::LeaveShell(_) => DbgDocBldr::description("leave shell"),
|
CommandAction::LeaveShell(_) => DbgDocBldr::description("leave shell"),
|
||||||
CommandAction::UnloadConfig(cfg) => {
|
CommandAction::UnloadConfig(cfg) => {
|
||||||
DbgDocBldr::description(format!("unload config {:?}", cfg))
|
DbgDocBldr::description(format!("unload config {:?}", cfg))
|
||||||
|
|
Loading…
Reference in a new issue