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

@ -449,8 +449,8 @@ pub fn command_not_found(
}
// Try to match the name with the search terms of existing commands.
let signatures = engine_state.get_signatures(false);
if let Some(sig) = signatures.iter().find(|sig| {
let signatures = engine_state.get_signatures_and_declids(false);
if let Some((sig, _)) = signatures.iter().find(|(sig, _)| {
sig.search_terms
.iter()
.any(|term| term.to_folded_case() == name.to_folded_case())
@ -463,7 +463,7 @@ pub fn command_not_found(
}
// Try a fuzzy search on the names of all existing commands.
if let Some(cmd) = did_you_mean(signatures.iter().map(|sig| &sig.name), name) {
if let Some(cmd) = did_you_mean(signatures.iter().map(|(sig, _)| &sig.name), name) {
// The user is invoking an external command with the same name as a
// built-in command. Remind them of this.
if cmd == name {