on master help sign in
Fix #1413 Can't use `bat` at all! (Error: Use of bat as a pager is disallowed...)
dd0d44bMartin Nordholts
src/pager.rs+14−4
@@ -98,10 +98,20 @@ pub(crate) fn get_pager(config_pager: Option<&str>) -> Result<Option<Pager>, Par
98 Some((bin, args)) => {
98 Some((bin, args)) => {
99 let kind = PagerKind::from_bin(bin);
99 let kind = PagerKind::from_bin(bin);
100
100
101+ let use_less_instead = match source {
102+ PagerSource::EnvVarPager => {
101− // 'more' and 'most' do not supports colors; automatically use 'less' instead
103+ // 'more' and 'most' do not supports colors; automatically use 'less' instead
102− // if the problematic pager came from the generic PAGER env var
104+ // if the problematic pager came from the generic PAGER env var
103− let no_color_support = kind == PagerKind::More || kind == PagerKind::Most;
105+ let no_color_support = kind == PagerKind::More || kind == PagerKind::Most;
104− let use_less_instead = no_color_support && source == PagerSource::EnvVarPager;
106+
107+ // If PAGER=bat, silently use 'less' instead to prevent recursion ...
108+ let is_self = kind == PagerKind::Bat;
109+
110+ no_color_support || is_self
111+ },
112+ // Never silently replace with less if bat-specific means to set a pager is used
113+ _ => false
114+ } ;
105
115
106 Ok(Some(if use_less_instead {
116 Ok(Some(if use_less_instead {
107 let no_args = vec![];
117 let no_args = vec![];
tests/integration_tests.rs+24−1
@@ -499,6 +499,28 @@ fn pager_disable() {
499 .stdout(predicate::eq("hello world\n").normalize());
499 .stdout(predicate::eq("hello world\n").normalize());
500}
500}
501
501
502+#[test]
503+fn env_var_pager_value_bat() {
504+ bat()
505+ .env("PAGER", "bat")
506+ .arg("--paging=always")
507+ .arg("test.txt")
508+ .assert()
509+ .success()
510+ .stdout(predicate::eq("hello world\n").normalize());
511+}
512+
513+#[test]
514+fn env_var_bat_pager_value_bat() {
515+ bat()
516+ .env("BAT_PAGER", "bat")
517+ .arg("--paging=always")
518+ .arg("test.txt")
519+ .assert()
520+ .failure()
521+ .stderr(predicate::str::contains("bat as a pager is disallowed"));
522+}
523+
502#[test]
524#[test]
503fn pager_value_bat() {
525fn pager_value_bat() {
504 bat()
526 bat()
@@ -506,7 +528,8 @@ fn pager_value_bat() {
506 .arg("--paging=always")
528 .arg("--paging=always")
507 .arg("test.txt")
529 .arg("test.txt")
508 .assert()
530 .assert()
509− .failure();
531+ .failure()
532+ .stderr(predicate::str::contains("bat as a pager is disallowed"));
510}
533}
511
534
512/// We shall use less instead of most if PAGER is used since PAGER
535/// We shall use less instead of most if PAGER is used since PAGER