mirror of
https://github.com/nushell/nushell
synced 2024-12-27 05:23:11 +00:00
Allow hooks to be lists of blocks (#5480)
This commit is contained in:
parent
3a35bf7d4e
commit
54fc164e1c
2 changed files with 39 additions and 26 deletions
|
@ -12,7 +12,7 @@ use nu_engine::{convert_env_values, eval_block};
|
||||||
use nu_parser::lex;
|
use nu_parser::lex;
|
||||||
use nu_protocol::{
|
use nu_protocol::{
|
||||||
engine::{EngineState, Stack, StateWorkingSet},
|
engine::{EngineState, Stack, StateWorkingSet},
|
||||||
PipelineData, ShellError, Span, Value,
|
BlockId, PipelineData, ShellError, Span, Value,
|
||||||
};
|
};
|
||||||
use reedline::{DefaultHinter, Emacs, Vi};
|
use reedline::{DefaultHinter, Emacs, Vi};
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
|
@ -197,6 +197,15 @@ pub fn evaluate_repl(
|
||||||
info!("prompt_update {}:{}:{}", file!(), line!(), column!());
|
info!("prompt_update {}:{}:{}", file!(), line!(), column!());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Right before we start our prompt and take input from the user,
|
||||||
|
// fire the "pre_prompt" hook
|
||||||
|
if let Some(hook) = &config.hooks.pre_prompt {
|
||||||
|
if let Err(err) = run_hook(engine_state, stack, hook) {
|
||||||
|
let working_set = StateWorkingSet::new(engine_state);
|
||||||
|
report_error(&working_set, &err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let prompt =
|
let prompt =
|
||||||
prompt_update::update_prompt(config, engine_state, stack, &mut nu_prompt, is_perf_true);
|
prompt_update::update_prompt(config, engine_state, stack, &mut nu_prompt, is_perf_true);
|
||||||
|
|
||||||
|
@ -211,15 +220,6 @@ pub fn evaluate_repl(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Right before we start our prompt and take input from the user,
|
|
||||||
// fire the "pre_prompt" hook
|
|
||||||
if let Some(hook) = &config.hooks.pre_prompt {
|
|
||||||
if let Err(err) = run_hook(engine_state, stack, hook) {
|
|
||||||
let working_set = StateWorkingSet::new(engine_state);
|
|
||||||
report_error(&working_set, &err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let input = line_editor.read_line(prompt);
|
let input = line_editor.read_line(prompt);
|
||||||
let use_shell_integration = config.shell_integration;
|
let use_shell_integration = config.shell_integration;
|
||||||
|
|
||||||
|
@ -384,22 +384,17 @@ pub fn run_hook(
|
||||||
value: &Value,
|
value: &Value,
|
||||||
) -> Result<(), ShellError> {
|
) -> Result<(), ShellError> {
|
||||||
match value {
|
match value {
|
||||||
|
Value::List { vals, .. } => {
|
||||||
|
for val in vals {
|
||||||
|
run_hook(engine_state, stack, val)?
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Value::Block {
|
Value::Block {
|
||||||
val: block_id,
|
val: block_id,
|
||||||
span,
|
span,
|
||||||
..
|
..
|
||||||
} => {
|
} => run_hook_block(engine_state, stack, *block_id, *span),
|
||||||
let block = engine_state.get_block(*block_id);
|
|
||||||
let input = PipelineData::new(*span);
|
|
||||||
|
|
||||||
match eval_block(engine_state, stack, block, input, false, false) {
|
|
||||||
Ok(pipeline_data) => match pipeline_data.into_value(*span) {
|
|
||||||
Value::Error { error } => Err(error),
|
|
||||||
_ => Ok(()),
|
|
||||||
},
|
|
||||||
Err(err) => Err(err),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x => match x.span() {
|
x => match x.span() {
|
||||||
Ok(span) => Err(ShellError::MissingConfigValue(
|
Ok(span) => Err(ShellError::MissingConfigValue(
|
||||||
"block for hook in config".into(),
|
"block for hook in config".into(),
|
||||||
|
@ -412,3 +407,21 @@ pub fn run_hook(
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn run_hook_block(
|
||||||
|
engine_state: &EngineState,
|
||||||
|
stack: &mut Stack,
|
||||||
|
block_id: BlockId,
|
||||||
|
span: Span,
|
||||||
|
) -> Result<(), ShellError> {
|
||||||
|
let block = engine_state.get_block(block_id);
|
||||||
|
let input = PipelineData::new(span);
|
||||||
|
|
||||||
|
match eval_block(engine_state, stack, block, input, false, false) {
|
||||||
|
Ok(pipeline_data) => match pipeline_data.into_value(span) {
|
||||||
|
Value::Error { error } => Err(error),
|
||||||
|
_ => Ok(()),
|
||||||
|
},
|
||||||
|
Err(err) => Err(err),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -200,12 +200,12 @@ let-env config = {
|
||||||
disable_table_indexes: false # set to true to remove the index column from tables
|
disable_table_indexes: false # set to true to remove the index column from tables
|
||||||
cd_with_abbreviations: false # set to true to allow you to do things like cd s/o/f and nushell expand it to cd some/other/folder
|
cd_with_abbreviations: false # set to true to allow you to do things like cd s/o/f and nushell expand it to cd some/other/folder
|
||||||
hooks: {
|
hooks: {
|
||||||
pre_prompt: {
|
pre_prompt: [{
|
||||||
$nothing # replace with source code to run before the prompt is shown
|
$nothing # replace with source code to run before the prompt is shown
|
||||||
}
|
}]
|
||||||
pre_execution: {
|
pre_execution: [{
|
||||||
$nothing # replace with source code to run before the repl input is run
|
$nothing # replace with source code to run before the repl input is run
|
||||||
}
|
}]
|
||||||
}
|
}
|
||||||
menus: [
|
menus: [
|
||||||
# Configuration for default nushell menus
|
# Configuration for default nushell menus
|
||||||
|
|
Loading…
Reference in a new issue