configs: add the ability to disable paging via ui.paginate

This commit is contained in:
Matt Stavola 2023-08-11 00:22:19 -04:00 committed by Matt Freitas-Stavola
parent 083e971dfb
commit 4760b565c5
6 changed files with 36 additions and 6 deletions

View file

@ -53,6 +53,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* `jj log`/`obslog`/`op log` now supports `--limit N` option to show the first
`N` entries.
* Added the `ui.paginate` option to enable/disable pager usage in commands
### Fixed bugs
* SSH authentication could hang when ssh-agent couldn't be reached

View file

@ -2488,7 +2488,7 @@ fn handle_early_args(
args.config_toml.push(format!(r#"ui.color="{choice}""#));
}
if args.no_pager.unwrap_or_default() {
ui.set_pagination(crate::ui::PaginationChoice::No);
ui.set_pagination(crate::ui::PaginationChoice::Never);
}
if !args.config_toml.is_empty() {
layered_configs.parse_config_args(&args.config_toml)?;

View file

@ -55,6 +55,15 @@
],
"default": "auto"
},
"paginate": {
"type": "string",
"description": "Whether or not to use a pager",
"enum": [
"never",
"auto"
],
"default": "auto"
},
"pager": {
"type": "string",
"description": "Pager to use for displaying command output",

View file

@ -5,5 +5,6 @@
# Placeholder: added by user
[ui]
paginate = "auto"
pager = { command = ["less", "-FRX"], env = { LESSCHARSET = "utf-8" } }
log-word-wrap = false

View file

@ -84,13 +84,20 @@ fn use_color(choice: ColorChoice) -> bool {
}
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize)]
#[serde(rename_all(deserialize = "kebab-case"))]
pub enum PaginationChoice {
No,
Never,
#[default]
Auto,
}
fn pagination_setting(config: &config::Config) -> Result<PaginationChoice, CommandError> {
config
.get::<PaginationChoice>("ui.paginate")
.map_err(|err| CommandError::ConfigError(format!("Invalid `ui.paginate`: {err:?}")))
}
fn pager_setting(config: &config::Config) -> Result<CommandNameAndArgs, CommandError> {
config
.get::<CommandNameAndArgs>("ui.pager")
@ -109,7 +116,7 @@ impl Ui {
color,
formatter_factory,
pager_cmd: pager_setting(config)?,
paginate: PaginationChoice::Auto,
paginate: pagination_setting(config)?,
progress_indicator,
output: UiOutput::new_terminal(),
})
@ -117,6 +124,7 @@ impl Ui {
pub fn reset(&mut self, config: &config::Config) -> Result<(), CommandError> {
self.color = use_color(color_setting(config));
self.paginate = pagination_setting(config)?;
self.pager_cmd = pager_setting(config)?;
self.progress_indicator = progress_indicator_setting(config);
let sanitize = io::stdout().is_terminal();
@ -132,8 +140,9 @@ impl Ui {
/// Switches the output to use the pager, if allowed.
#[instrument(skip_all)]
pub fn request_pager(&mut self) {
if self.paginate == PaginationChoice::No {
return;
match self.paginate {
PaginationChoice::Never => return,
PaginationChoice::Auto => {}
}
match self.output {

View file

@ -267,6 +267,15 @@ a `$`):
`less -FRX` is the default pager in the absence of any other setting.
Additionally, paging behavior can be toggled via `ui.paginate` like so:
```toml
# Enable pagination for commands that support it (default)
ui.paginate = "auto"
# Disable all pagination, equivalent to using --no-pager
ui.paginate = "never"
```
### Processing contents to be paged
If you'd like to pass the output through a formatter e.g.