diff options
author | Joe Wilm <joe@jwilm.com> | 2016-11-28 14:39:37 -0800 |
---|---|---|
committer | Joe Wilm <joe@jwilm.com> | 2016-12-11 20:23:41 -0800 |
commit | ff5081d5e5cd2ddcf775357853b81afbcf45aef4 (patch) | |
tree | 3deec43af92f64e41cdd96f9137e25c0ea38c10b /src | |
parent | 7bf3d059c39c0b8e4529db6f7d84a1e1997738e8 (diff) | |
download | alacritty-ff5081d5e5cd2ddcf775357853b81afbcf45aef4.tar.gz alacritty-ff5081d5e5cd2ddcf775357853b81afbcf45aef4.zip |
Add support for bracketed paste
Binding/Action execute now has access to TermMode to support bracketed
paste mode.
Diffstat (limited to 'src')
-rw-r--r-- | src/ansi.rs | 3 | ||||
-rw-r--r-- | src/input.rs | 22 | ||||
-rw-r--r-- | src/term/mod.rs | 3 |
3 files changed, 20 insertions, 8 deletions
diff --git a/src/ansi.rs b/src/ansi.rs index c9341620..32c7751d 100644 --- a/src/ansi.rs +++ b/src/ansi.rs @@ -243,6 +243,8 @@ pub enum Mode { ReportMouseClicks = 1000, /// ?1049 SwapScreenAndSetRestoreCursor = 1049, + /// ?2004 + BracketedPaste = 2004, } impl Mode { @@ -258,6 +260,7 @@ impl Mode { 25 => Mode::ShowCursor, 1000 => Mode::ReportMouseClicks, 1049 => Mode::SwapScreenAndSetRestoreCursor, + 2004 => Mode::BracketedPaste, _ => return None }) } else { diff --git a/src/input.rs b/src/input.rs index e266dbbc..796e0fb5 100644 --- a/src/input.rs +++ b/src/input.rs @@ -135,8 +135,8 @@ impl KeyBinding { } #[inline] - fn execute<N: Notify>(&self, notifier: &mut N) { - self.binding.action.execute(notifier) + fn execute<N: Notify>(&self, notifier: &mut N, mode: &TermMode) { + self.binding.action.execute(notifier, mode) } } @@ -155,8 +155,8 @@ impl MouseBinding { } #[inline] - fn execute<N: Notify>(&self, notifier: &mut N) { - self.binding.action.execute(notifier) + fn execute<N: Notify>(&self, notifier: &mut N, mode: &TermMode) { + self.binding.action.execute(notifier, mode) } } @@ -174,7 +174,7 @@ pub enum Action { impl Action { #[inline] - fn execute<N: Notify>(&self, notifier: &mut N) { + fn execute<N: Notify>(&self, notifier: &mut N, mode: &TermMode) { match *self { Action::Esc(ref s) => notifier.notify(s.clone().into_bytes()), Action::Paste | Action::PasteSelection => { @@ -183,7 +183,13 @@ impl Action { clip.load_selection() .map(|contents| { println!("got contents"); - notifier.notify(contents.into_bytes()) + if mode.contains(mode::BRACKETED_PASTE) { + notifier.notify("\x1b[200~".as_bytes()); + notifier.notify(contents.into_bytes()); + notifier.notify("\x1b[201~".as_bytes()); + } else { + notifier.notify(contents.into_bytes()); + } }) .unwrap_or_else(|err| { err_println!("Error getting clipboard contents: {}", err); @@ -410,7 +416,7 @@ impl Processor { for binding in bindings { if binding.is_triggered_by(&mode, &mods, &key) { // binding was triggered; run the action - binding.execute(notifier); + binding.execute(notifier, &mode); return true; } } @@ -436,7 +442,7 @@ impl Processor { for binding in bindings { if binding.is_triggered_by(&mode, &mods, &button) { // binding was triggered; run the action - binding.execute(notifier); + binding.execute(notifier, &mode); return true; } } diff --git a/src/term/mod.rs b/src/term/mod.rs index b5ccb244..acbb70ac 100644 --- a/src/term/mod.rs +++ b/src/term/mod.rs @@ -164,6 +164,7 @@ pub mod mode { const APP_CURSOR = 0b00000010, const APP_KEYPAD = 0b00000100, const MOUSE_REPORT_CLICK = 0b00001000, + const BRACKETED_PASTE = 0b00010000, const ANY = 0b11111111, const NONE = 0b00000000, } @@ -838,6 +839,7 @@ impl ansi::Handler for Term { ansi::Mode::ShowCursor => self.mode.insert(mode::SHOW_CURSOR), ansi::Mode::CursorKeys => self.mode.insert(mode::APP_CURSOR), ansi::Mode::ReportMouseClicks => self.mode.insert(mode::MOUSE_REPORT_CLICK), + ansi::Mode::BracketedPaste => self.mode.insert(mode::BRACKETED_PASTE), _ => { debug_println!(".. ignoring set_mode"); } @@ -852,6 +854,7 @@ impl ansi::Handler for Term { ansi::Mode::ShowCursor => self.mode.remove(mode::SHOW_CURSOR), ansi::Mode::CursorKeys => self.mode.remove(mode::APP_CURSOR), ansi::Mode::ReportMouseClicks => self.mode.remove(mode::MOUSE_REPORT_CLICK), + ansi::Mode::BracketedPaste => self.mode.remove(mode::BRACKETED_PASTE), _ => { debug_println!(".. ignoring unset_mode"); } |