mirror of
https://github.com/wez/wezterm.git
synced 2024-12-23 05:12:40 +03:00
Add ResetTerminal and pane:inject_output method
refs: https://github.com/wez/wezterm/discussions/2606
This commit is contained in:
parent
473316934b
commit
4e5945c061
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -2662,6 +2662,7 @@ dependencies = [
|
||||
"mux",
|
||||
"portable-pty",
|
||||
"smol",
|
||||
"termwiz",
|
||||
"wezterm-dynamic",
|
||||
"wezterm-term",
|
||||
]
|
||||
|
@ -531,6 +531,8 @@ pub enum KeyAssignment {
|
||||
SplitPane(SplitPane),
|
||||
PaneSelect(PaneSelectArguments),
|
||||
CharSelect(CharSelectArguments),
|
||||
|
||||
ResetTerminal,
|
||||
}
|
||||
impl_lua_conversion_dynamic!(KeyAssignment);
|
||||
|
||||
|
@ -39,6 +39,8 @@ As features stabilize some brief notes about them will accumulate here.
|
||||
[#2537](https://github.com/wez/wezterm/discussions/2537)
|
||||
* [window-focus-changed](config/lua/window-events/window-focus-changed.md)
|
||||
event.
|
||||
* [pane:inject_output](config/lua/pane/inject_output.md) method
|
||||
* [ResetTerminal](config/lua/keyassignment/ResetTerminal.md) key assignment
|
||||
|
||||
#### Fixed
|
||||
* Wayland: key repeat gets stuck after pressing two keys in quick succession.
|
||||
|
11
docs/config/lua/keyassignment/ResetTerminal.md
Normal file
11
docs/config/lua/keyassignment/ResetTerminal.md
Normal file
@ -0,0 +1,11 @@
|
||||
# ResetTerminal
|
||||
|
||||
*since: nightly builds only*
|
||||
|
||||
Sends the `RIS` "Reset to Initial State" escape sequence (`ESC-c`) to the
|
||||
output side of the current pane, causing the terminal emulator to reset its
|
||||
state.
|
||||
|
||||
This will reset tab stops, margins, modes, graphic rendition, palette, activate
|
||||
the primary screen, erase the display and move the cursor to the home position.
|
||||
|
34
docs/config/lua/pane/inject_output.md
Normal file
34
docs/config/lua/pane/inject_output.md
Normal file
@ -0,0 +1,34 @@
|
||||
# `pane:inject_output(text)`
|
||||
|
||||
*Since: nightly builds only*
|
||||
|
||||
Sends text, which may include escape sequences, to the output side of the
|
||||
current pane. The text will be evaluated by the terminal emulator and can thus
|
||||
be used to inject/force the terminal to process escape sequences that adjust
|
||||
the current mode, as well as sending human readable output to the terminal.
|
||||
|
||||
Note that if you move the cursor position as a result of using this method, you
|
||||
should expect the display to change and for text UI programs to get confused.
|
||||
|
||||
In this contrived and useless example, pressing ALT-k will output `hello there`
|
||||
in italics to the current pane:
|
||||
|
||||
```lua
|
||||
local wezterm = require 'wezterm'
|
||||
|
||||
return {
|
||||
keys = {
|
||||
{
|
||||
key = 'k',
|
||||
mods = 'ALT',
|
||||
action = wezterm.action_callback(function(window, pane)
|
||||
pane:inject_output '\r\n\x1b[3mhello there\r\n'
|
||||
end),
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
Not all panes support this method; at the time of writing, this works for local
|
||||
panes but not for multiplexer panes.
|
||||
|
@ -15,4 +15,5 @@ log = "0.4"
|
||||
luahelper = { path = "../../luahelper" }
|
||||
portable-pty = { path = "../../pty" }
|
||||
smol = "1.2"
|
||||
termwiz = { path = "../../termwiz" }
|
||||
mux = { path = "../../mux" }
|
||||
|
@ -196,6 +196,18 @@ impl UserData for MuxPane {
|
||||
None => Ok("".to_string()),
|
||||
}
|
||||
});
|
||||
|
||||
methods.add_method("inject_output", |_, this, text: String| {
|
||||
let mux = get_mux()?;
|
||||
let pane = this.resolve(&mux)?;
|
||||
|
||||
let mut parser = termwiz::escape::parser::Parser::new();
|
||||
let mut actions = vec![];
|
||||
parser.parse(text.as_bytes(), |action| actions.push(action));
|
||||
|
||||
pane.perform_actions(actions);
|
||||
Ok(())
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -244,6 +244,25 @@ impl UserData for GuiWin {
|
||||
|
||||
Ok(result)
|
||||
});
|
||||
methods.add_async_method("active_pane", |_, this, _: ()| async move {
|
||||
let (tx, rx) = smol::channel::bounded(1);
|
||||
this.window
|
||||
.notify(TermWindowNotif::Apply(Box::new(move |term_window| {
|
||||
tx.try_send(
|
||||
term_window
|
||||
.get_active_pane_or_overlay()
|
||||
.map(|pane| MuxPane(pane.pane_id())),
|
||||
)
|
||||
.ok();
|
||||
})));
|
||||
let result = rx
|
||||
.recv()
|
||||
.await
|
||||
.map_err(|e| anyhow::anyhow!("{:#}", e))
|
||||
.map_err(luaerr)?;
|
||||
|
||||
Ok(result)
|
||||
});
|
||||
methods.add_method("active_workspace", |_, _, _: ()| {
|
||||
let mux = Mux::get()
|
||||
.ok_or_else(|| anyhow::anyhow!("must be called on main thread"))
|
||||
|
@ -2719,6 +2719,11 @@ impl TermWindow {
|
||||
let modal = crate::termwindow::charselect::CharSelector::new(self, args);
|
||||
self.modal.borrow_mut().replace(Rc::new(modal));
|
||||
}
|
||||
ResetTerminal => {
|
||||
pane.perform_actions(vec![termwiz::escape::Action::Esc(
|
||||
termwiz::escape::Esc::Code(termwiz::escape::EscCode::FullReset),
|
||||
)]);
|
||||
}
|
||||
};
|
||||
Ok(PerformAssignmentResult::Handled)
|
||||
}
|
||||
@ -2953,7 +2958,7 @@ impl TermWindow {
|
||||
/// then that will be returned instead. Otherwise, if the pane has
|
||||
/// an active overlay (such as search or copy mode) then that will
|
||||
/// be returned.
|
||||
fn get_active_pane_or_overlay(&self) -> Option<Rc<dyn Pane>> {
|
||||
pub fn get_active_pane_or_overlay(&self) -> Option<Rc<dyn Pane>> {
|
||||
let mux = Mux::get().unwrap();
|
||||
let tab = match mux.get_active_tab_for_window(self.mux_window_id) {
|
||||
Some(tab) => tab,
|
||||
|
Loading…
Reference in New Issue
Block a user