This improves the compatibility and adds the ability to introduce
non-breaking changes by using a builder pattern.
Example:
```rust
fn main() {
match xplr::runner(None).and_then(|a| a.run()) {
Ok(Some(out)) => print!("{}", out),
Ok(None) => {}
Err(err) => {
if !err.to_string().is_empty() {
eprintln!("error: {}", err);
};
std::process::exit(1);
}
}
}
```
Also be less aggressive for version compatibility.
Use the following logic:
Knowing that we use `{major}.{minor}.{patch}` versioning,
- Major version mismatch are incompatible. Fail with error, suggesting to
visit the Upgrade Guide.
- Minor version updates and patch fixes are compatible. Suggest user to
update the config file version manually. Or visit the Upgrade Guide.
- However, if the config file has greater value for minor version
than the app, also fail with error. Suggesting the user to visit Upgrade
Guide. Though in this case, the user will be downgrading.
Ref: https://github.com/sayanarijit/xplr/issues/45
- Auto `Refresh` every second.
- Add alias `BashExec` to message `Call` with args [`-c`, `bash` ...].
Also, Create alias `BashExec` to message `Call` with arguments [`bash`, `-c`]