use std::sync::Mutex;
static ZLE_PARAM_SNAPSHOT: Mutex<Option<(String, String, String, i64)>> = Mutex::new(None);
pub fn arm_snapshot(buffer: String, lbuffer: String, rbuffer: String, cursor: i64) {
*ZLE_PARAM_SNAPSHOT.lock().unwrap() = Some((buffer, lbuffer, rbuffer, cursor));
}
pub fn clear_snapshot() {
*ZLE_PARAM_SNAPSHOT.lock().unwrap() = None;
}
pub fn active() -> bool {
ZLE_PARAM_SNAPSHOT.lock().unwrap().is_some()
}
pub fn sync_from_paramtab() {
let snap = ZLE_PARAM_SNAPSHOT.lock().unwrap().clone();
let Some((pre_buf, pre_lbuf, pre_rbuf, pre_cur)) = snap else {
return;
};
let post_buf = crate::ported::params::getsparam("BUFFER").unwrap_or_default();
let post_lbuf = crate::ported::params::getsparam("LBUFFER").unwrap_or_default();
let post_rbuf = crate::ported::params::getsparam("RBUFFER").unwrap_or_default();
let post_cur = crate::ported::params::getiparam("CURSOR");
if post_buf != pre_buf {
crate::ported::zle::zle_params::set_buffer(&post_buf);
} else if post_lbuf != pre_lbuf || post_rbuf != pre_rbuf {
let joined = format!("{}{}", post_lbuf, post_rbuf);
crate::ported::zle::zle_params::set_buffer(&joined);
crate::ported::zle::zle_params::set_cursor(post_lbuf.chars().count());
}
if post_cur != pre_cur && post_cur >= 0 {
crate::ported::zle::zle_params::set_cursor(post_cur as usize);
}
}