add command_type to help (#14165)

# Description

This PR adds an indicator when listing subcommands. That indicator tells
whether the command is a plugin, alias, or custom_command.

![image](https://github.com/user-attachments/assets/02889f8a-17b4-4678-bb44-3a487b3d1066)

I changed some of the API to make this work a little easier, namely
`get_signatures()` is now `get_signatures_and_declids()`. It was used in
only one other place (run-external), so I thought it was fine to change
it.

There is a long-standing issue with aliases where they reference the
command name instead of the alias name. This PR doesn't fix that bug.
Example.
```nushell
❯ alias "str fill" = str wrap
```
```nushell
❯ str
... other stuff
Subcommands:

  str wrap (alias) - Alias for `str wrap`
  str wrap (plugin) - Wrap text passed into pipeline.

```


# User-Facing Changes
Slightly different output of subcommands.
This commit is contained in:
Darren Schroeder
2024-10-24 12:06:49 -05:00
committed by GitHub
parent af9c31152a
commit 69d81cc065
3 changed files with 26 additions and 12 deletions

View File

@ -2,6 +2,7 @@ use crate::eval_call;
use nu_protocol::{
ast::{Argument, Call, Expr, Expression, RecordItem},
debugger::WithoutDebug,
engine::CommandType,
engine::{Command, EngineState, Stack, UNKNOWN_SPAN_ID},
record, Category, Config, Example, IntoPipelineData, PipelineData, PositionalArg, Signature,
Span, SpanId, Spanned, SyntaxShape, Type, Value,
@ -112,16 +113,29 @@ fn get_documentation(
// - https://github.com/nushell/nushell/issues/11447
// - https://github.com/nushell/nushell/issues/11625
let mut subcommands = vec![];
let signatures = engine_state.get_signatures(true);
for sig in signatures {
let signatures = engine_state.get_signatures_and_declids(true);
for (sig, decl_id) in signatures {
let command_type = engine_state.get_decl(decl_id).command_type();
// Don't display removed/deprecated commands in the Subcommands list
if sig.name.starts_with(&format!("{cmd_name} "))
&& !matches!(sig.category, Category::Removed)
{
subcommands.push(format!(
" {help_subcolor_one}{}{RESET} - {}",
sig.name, sig.description
));
// If it's a plugin, alias, or custom command, display that information in the help
if command_type == CommandType::Plugin
|| command_type == CommandType::Alias
|| command_type == CommandType::Custom
{
subcommands.push(format!(
" {help_subcolor_one}{} {help_section_name}({}){RESET} - {}",
sig.name, command_type, sig.description
));
} else {
subcommands.push(format!(
" {help_subcolor_one}{}{RESET} - {}",
sig.name, sig.description
));
}
}
}