## Related topics
* [Multiple commands for a keybinding](https://github.com/kkawakam/rustyline/issues/306) and
[Conditional Bind Sequences](https://github.com/kkawakam/rustyline/issues/269) : original issues
* [Conditional Bind Sequences](https://github.com/kkawakam/rustyline/pull/293) : incomplete proposal
* [Add `Cmd::Yield` for complex custom bindings](https://github.com/kkawakam/rustyline/pull/342) : another proposal
* [Initial invoke trait and auto-indent example](https://github.com/kkawakam/rustyline/pull/466) : a validator is like a custom action triggered indirectly.
And other issues that should be solved if our design is good:
* [Extend Meta-F,Alt+Right feature for hint partial completion](https://github.com/kkawakam/rustyline/pull/430)
* [Use Arrow-Up to search history with prefix](https://github.com/kkawakam/rustyline/issues/423)
* [Execute Arbitrary Command Via Keybinding](https://github.com/kkawakam/rustyline/issues/418)
* [Use Ctrl-E for hint completion](https://github.com/kkawakam/rustyline/pull/407)
* [Add History Search Behaviour](https://github.com/kkawakam/rustyline/pull/424)
* ...
## Conditions / Filters
See https://python-prompt-toolkit.readthedocs.io/en/master/pages/advanced_topics/key_bindings.html?highlight=filter#attaching-a-filter-condition
Some keys/commands may behave differently depending on:
* edit mode (emacs vs vi)
* vi input mode (insert vs replace vs command modes)
* empty line
* cursor position
* repeat count
* original key pressed (when same command is bound to different key)
* hint
* ...
## More input
Some keys/commands may ask for more input.
I am not sure this point should be tackle here.
## Multiple / complex actions
For one key/command, we may want to perform multiple actions.
We should ask the undo manager to start a "transaction" before first action and commit it after the last action.
Should we do something specific with the kill ring ?
We should refresh / repaint only when all actions are performed (or if ask explicitly?) depending on cumulated action impacts.
...
## Misc
```rust
/// Command / action result
#[derive(Debug, Clone, PartialEq, Copy)]
#[non_exhaustive]
pub enum ActionResult {
// Interrupt / reject user input
// => Err should be fine
//Bail,
///
Continue,
/// Accept user input (except if `Validator` disagrees)
Return,
}
```
```rust
bitflags::bitflags! {
#[doc = "Action invocation impacts"]
pub struct Impacts: u8 {
const PUSH_CHAR = 0b0000_0001;
const BEEP = 0b0000_0010;
const MOVE_CURSOR = 0b0000_0100; // State::move_cursor
const REFRESH = 0b0000_1000; // State::refresh_line
const CLEAR_SREEN = 0b0001_0000; // State::clear_screen
}
}
```