aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2023-04-09 22:29:48 +0200
committerKirill Chibisov <contact@kchibisov.com>2023-04-15 03:09:27 +0300
commit586f982a260a1864f61f9aff6a861d3231bf3301 (patch)
treece8a6accf9a03db01fc1b92d2250f0e17b9f8b46
parent8b0305d3f01bbeaedabca8dee4619bb03d8c0561 (diff)
downloadalacritty-586f982a260a1864f61f9aff6a861d3231bf3301.tar.gz
alacritty-586f982a260a1864f61f9aff6a861d3231bf3301.zip
Allow mode-exclusive bindings in any mode
This patch enables binding chains that go beyond mode changes by allowing bindings to be defined for modes they do not usually have an effect in.
-rw-r--r--CHANGELOG.md4
-rw-r--r--alacritty/src/config/bindings.rs22
-rw-r--r--alacritty/src/event.rs2
-rw-r--r--alacritty/src/input.rs9
4 files changed, 17 insertions, 20 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9609ecc7..8288b589 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 0.13.0-dev
+### Changed
+
+- Mode-specific bindings can now be bound in any mode for easier macros
+
### Fixed
- Character `;` inside the `URI` in `OSC 8` sequence breaking the URI
diff --git a/alacritty/src/config/bindings.rs b/alacritty/src/config/bindings.rs
index e3ee41e7..0e50807a 100644
--- a/alacritty/src/config/bindings.rs
+++ b/alacritty/src/config/bindings.rs
@@ -1114,26 +1114,8 @@ impl<'a> Deserialize<'a> for RawBinding {
let action = match (action, chars, command) {
(Some(action @ Action::ViMotion(_)), None, None)
- | (Some(action @ Action::Vi(_)), None, None) => {
- if !mode.intersects(BindingMode::VI) || not_mode.intersects(BindingMode::VI)
- {
- return Err(V::Error::custom(format!(
- "action `{}` is only available in vi mode, try adding `mode: Vi`",
- action,
- )));
- }
- action
- },
- (Some(action @ Action::Search(_)), None, None) => {
- if !mode.intersects(BindingMode::SEARCH) {
- return Err(V::Error::custom(format!(
- "action `{}` is only available in search mode, try adding `mode: \
- Search`",
- action,
- )));
- }
- action
- },
+ | (Some(action @ Action::Vi(_)), None, None) => action,
+ (Some(action @ Action::Search(_)), None, None) => action,
(Some(action @ Action::Mouse(_)), None, None) => {
if mouse.is_none() {
return Err(V::Error::custom(format!(
diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs
index 3248a1e7..21b866d2 100644
--- a/alacritty/src/event.rs
+++ b/alacritty/src/event.rs
@@ -496,6 +496,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon
// Enable IME so we can input into the search bar with it if we were in Vi mode.
self.window().set_ime_allowed(true);
+ self.terminal.mark_fully_damaged();
self.display.pending_update.dirty = true;
}
@@ -983,6 +984,7 @@ impl<'a, N: Notify + 'a, T: EventListener> ActionContext<'a, N, T> {
let vi_mode = self.terminal.mode().contains(TermMode::VI);
self.window().set_ime_allowed(!vi_mode);
+ self.terminal.mark_fully_damaged();
self.display.pending_update.dirty = true;
self.search_state.history_index = None;
diff --git a/alacritty/src/input.rs b/alacritty/src/input.rs
index 992b01df..935fc046 100644
--- a/alacritty/src/input.rs
+++ b/alacritty/src/input.rs
@@ -14,6 +14,7 @@ use std::marker::PhantomData;
use std::mem;
use std::time::{Duration, Instant};
+use log::debug;
use winit::dpi::PhysicalPosition;
use winit::event::{
ElementState, KeyboardInput, ModifiersState, MouseButton, MouseScrollDelta,
@@ -162,6 +163,11 @@ impl<T: EventListener> Execute<T> for Action {
ctx.on_typing_start();
ctx.toggle_vi_mode()
},
+ action @ (Action::ViMotion(_) | Action::Vi(_))
+ if !ctx.terminal().mode().contains(TermMode::VI) =>
+ {
+ debug!("Ignoring {action:?}: Vi mode inactive");
+ },
Action::ViMotion(motion) => {
ctx.on_typing_start();
ctx.terminal_mut().vi_motion(*motion);
@@ -246,6 +252,9 @@ impl<T: EventListener> Execute<T> for Action {
ctx.scroll(Scroll::Delta(scroll_lines));
},
+ action @ Action::Search(_) if !ctx.search_active() => {
+ debug!("Ignoring {action:?}: Search mode inactive");
+ },
Action::Search(SearchAction::SearchFocusNext) => {
ctx.advance_search_origin(ctx.search_direction());
},