use crate::ported::modules::zutil::testforstyle;
use crate::ported::params::{getiparam, getsparam, setsparam};
use crate::ported::zle::compcore::set_compstate_str;
pub fn _list() -> i32 {
if getiparam("_matcher_num") > 1 {
return 1;
}
let curcontext = getsparam("curcontext").unwrap_or_default();
let ctx = format!(":completion:{}:", curcontext);
let (pre, suf) = if testforstyle(&ctx, "word") == 0 {
let histno = getsparam("HISTNO").unwrap_or_default();
let lbuf = getsparam("LBUFFER").unwrap_or_default();
let rbuf = getsparam("RBUFFER").unwrap_or_default();
(format!("{}{}", histno, lbuf), rbuf)
} else {
(
getsparam("PREFIX").unwrap_or_default(),
getsparam("SUFFIX").unwrap_or_default(),
)
};
let cond_style = testforstyle(&ctx, "condition") == 0;
let condition_on = cond_style || testforstyle(&ctx, "condition") != 0;
let last_pre = getsparam("_list_prefix").unwrap_or_default();
let last_suf = getsparam("_list_suffix").unwrap_or_default();
if condition_on && (pre != last_pre || suf != last_suf) {
set_compstate_str("insert", "");
set_compstate_str("list", "list force");
let _ = setsparam("_list_prefix", &pre);
let _ = setsparam("_list_suffix", &suf);
}
1
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ported::params::setiparam;
#[test]
fn always_returns_one() {
let _g = crate::test_util::global_state_lock();
setiparam("_matcher_num", 1);
assert_eq!(_list(), 1);
}
#[test]
fn matcher_num_gt_one_short_circuits() {
let _g = crate::test_util::global_state_lock();
setiparam("_matcher_num", 5);
let _ = setsparam("_list_prefix", "untouched");
assert_eq!(_list(), 1);
assert_eq!(getsparam("_list_prefix").as_deref(), Some("untouched"));
setiparam("_matcher_num", 0);
}
}