mirror of
https://github.com/nushell/nushell.git
synced 2025-08-16 23:41:40 +02:00
[MVP][WIP] less
like pager (#6984)
Run it as `explore`. #### example ```nu ls | explore ``` Configuration points in `config.nu` file. ``` # A 'explore' utility config explore_config: { highlight: { bg: 'yellow', fg: 'black' } status_bar: { bg: '#C4C9C6', fg: '#1D1F21' } command_bar: { fg: '#C4C9C6' } split_line: '#404040' cursor: true # selected_column: 'blue' # selected_row: { fg: 'yellow', bg: '#C1C2A3' } # selected_cell: { fg: 'white', bg: '#777777' } # line_shift: false, # line_index: false, # line_head_top: false, # line_head_bottom: false, } ``` You can start without a pipeline and type `explore` and it'll give you a few tips.  If you type `:help` you an see the help screen with some information on what tui keybindings are available.  From the `:help` screen you can now hit `i` and that puts you in `cursor` aka `inspection` mode and you can move the cursor left right up down and it you put it on an area such as `[table 5 rows]` and hit the enter key, you'll see something like this, which shows all the `:` commands. If you hit `esc` it will take you to the previous screen.  If you then type `:try` you'll get this type of window where you can type in the top portion and see results in the bottom.  The `:nu` command is interesting because you can type pipelines like `:nu ls | sort-by type size` or another pipeline of your choosing such as `:nu sys` and that will show the table that looks like this, which we're calling "table mode".  If you hit the `t` key it will now transpose the view to look like this.  In table mode or transposed table mode you can use the `i` key to inspect any collapsed field like `{record 8 fields}`, `[table 16 rows]`, `[list x]`, etc. One of the original benefits was that when you're in a view that has a lot of columns, `explore` gives you the ability to scroll left, right, up, and down. `explore` is also smart enough to know when you're in table mode versus preview mode. If you do `open Cargo.toml | explore` you get this.  If you type `open --raw Cargo.toml | explore` you get this where you can scroll left, right, up, down. This is called preview mode.  When you're in table mode, you can also type `:preview`. So, with `open --raw Cargo.toml | explore`, if you type `:preview`, it will look like this.  Signed-off-by: Maxim Zhiburt <zhiburt@gmail.com> Co-authored-by: Darren Schroeder <343840+fdncred@users.noreply.github.com>
This commit is contained in:
60
crates/nu-explore/src/lib.rs
Normal file
60
crates/nu-explore/src/lib.rs
Normal file
@ -0,0 +1,60 @@
|
||||
mod command;
|
||||
mod commands;
|
||||
mod events;
|
||||
mod nu_common;
|
||||
mod pager;
|
||||
mod views;
|
||||
|
||||
use std::io;
|
||||
|
||||
use nu_common::{collect_pipeline, CtrlC};
|
||||
use nu_protocol::{
|
||||
engine::{EngineState, Stack},
|
||||
PipelineData, Value,
|
||||
};
|
||||
use pager::{Page, Pager};
|
||||
use terminal_size::{Height, Width};
|
||||
use views::{InformationView, Preview, RecordView};
|
||||
|
||||
pub use pager::{StyleConfig, TableConfig, TableSplitLines, ViewConfig};
|
||||
|
||||
pub fn run_pager(
|
||||
engine_state: &EngineState,
|
||||
stack: &mut Stack,
|
||||
ctrlc: CtrlC,
|
||||
table_cfg: TableConfig,
|
||||
view_cfg: ViewConfig,
|
||||
input: PipelineData,
|
||||
) -> io::Result<Option<Value>> {
|
||||
let commands = command::CommandList::new(table_cfg);
|
||||
|
||||
let mut p = Pager::new(table_cfg, view_cfg.clone());
|
||||
|
||||
let (columns, data) = collect_pipeline(input);
|
||||
|
||||
let has_no_input = columns.is_empty() && data.is_empty();
|
||||
if has_no_input {
|
||||
let view = Some(Page::new(InformationView, true));
|
||||
return p.run(engine_state, stack, ctrlc, view, commands);
|
||||
}
|
||||
|
||||
let has_single_value = data.len() == 1 && data[0].len() == 1;
|
||||
let is_simple_type = !matches!(&data[0][0], Value::List { .. } | Value::Record { .. });
|
||||
if has_single_value && is_simple_type {
|
||||
let text = data[0][0].into_abbreviated_string(view_cfg.config);
|
||||
|
||||
let view = Some(Page::new(Preview::new(&text), true));
|
||||
return p.run(engine_state, stack, ctrlc, view, commands);
|
||||
}
|
||||
|
||||
let mut view = RecordView::new(columns, data, table_cfg);
|
||||
|
||||
if table_cfg.reverse {
|
||||
if let Some((Width(w), Height(h))) = terminal_size::terminal_size() {
|
||||
view.reverse(w, h);
|
||||
}
|
||||
}
|
||||
|
||||
let view = Some(Page::new(view, false));
|
||||
p.run(engine_state, stack, ctrlc, view, commands)
|
||||
}
|
Reference in New Issue
Block a user