ui: Add pipe action for Pager
parent
f3d019f7ed
commit
f13da6a26a
|
@ -493,7 +493,7 @@ impl Component for Pager {
|
||||||
}
|
}
|
||||||
fn process_event(&mut self, event: &mut UIEvent, context: &mut Context) -> bool {
|
fn process_event(&mut self, event: &mut UIEvent, context: &mut Context) -> bool {
|
||||||
let shortcuts = &self.get_shortcuts(context)[Self::DESCRIPTION];
|
let shortcuts = &self.get_shortcuts(context)[Self::DESCRIPTION];
|
||||||
match *event {
|
match event {
|
||||||
UIEvent::Input(ref key) if *key == shortcuts["scroll_up"] => {
|
UIEvent::Input(ref key) if *key == shortcuts["scroll_up"] => {
|
||||||
if self.cursor_pos > 0 {
|
if self.cursor_pos > 0 {
|
||||||
self.cursor_pos -= 1;
|
self.cursor_pos -= 1;
|
||||||
|
@ -521,6 +521,41 @@ impl Component for Pager {
|
||||||
UIEvent::ChangeMode(UIMode::Normal) => {
|
UIEvent::ChangeMode(UIMode::Normal) => {
|
||||||
self.dirty = true;
|
self.dirty = true;
|
||||||
}
|
}
|
||||||
|
UIEvent::Action(Pager(Pipe(ref bin, ref args))) => {
|
||||||
|
use std::io::Write;
|
||||||
|
use std::process::{Command, Stdio};
|
||||||
|
let mut command_obj = match Command::new(bin)
|
||||||
|
.args(args.as_slice())
|
||||||
|
.stdin(Stdio::piped())
|
||||||
|
.stdout(Stdio::piped())
|
||||||
|
.spawn()
|
||||||
|
{
|
||||||
|
Ok(o) => o,
|
||||||
|
Err(e) => {
|
||||||
|
context.replies.push_back(UIEvent::StatusEvent(
|
||||||
|
StatusEvent::DisplayMessage(format!(
|
||||||
|
"Could not pipe to {}: {}",
|
||||||
|
bin, e
|
||||||
|
)),
|
||||||
|
));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let stdin = command_obj.stdin.as_mut().expect("failed to open stdin");
|
||||||
|
stdin
|
||||||
|
.write_all(self.text.as_bytes())
|
||||||
|
.expect("Failed to write to stdin");
|
||||||
|
|
||||||
|
context
|
||||||
|
.replies
|
||||||
|
.push_back(UIEvent::StatusEvent(StatusEvent::DisplayMessage(format!(
|
||||||
|
"Pager text piped to '{}{}{}'",
|
||||||
|
&bin,
|
||||||
|
if args.is_empty() { "" } else { " " },
|
||||||
|
args.join(", ")
|
||||||
|
))));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
UIEvent::Resize => {
|
UIEvent::Resize => {
|
||||||
self.dirty = true;
|
self.dirty = true;
|
||||||
self.max_cursor_pos = None;
|
self.max_cursor_pos = None;
|
||||||
|
|
|
@ -28,6 +28,7 @@ pub mod actions;
|
||||||
pub use crate::actions::Action::{self, *};
|
pub use crate::actions::Action::{self, *};
|
||||||
pub use crate::actions::ListingAction::{self, *};
|
pub use crate::actions::ListingAction::{self, *};
|
||||||
pub use crate::actions::MailingListAction::{self, *};
|
pub use crate::actions::MailingListAction::{self, *};
|
||||||
|
pub use crate::actions::PagerAction::{self, *};
|
||||||
pub use crate::actions::TabAction::{self, *};
|
pub use crate::actions::TabAction::{self, *};
|
||||||
|
|
||||||
/* Create a const table with every command part that can be auto-completed and its description */
|
/* Create a const table with every command part that can be auto-completed and its description */
|
||||||
|
@ -161,6 +162,29 @@ define_commands!([
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
)
|
)
|
||||||
|
},
|
||||||
|
/* Pipe pager contents to binary */
|
||||||
|
{ tags: ["pipe "],
|
||||||
|
desc: "pipe EXECUTABLE ARGS",
|
||||||
|
parser:(
|
||||||
|
named!( pipe<Action>,
|
||||||
|
alt_complete!(
|
||||||
|
do_parse!(
|
||||||
|
ws!(tag!("pipe"))
|
||||||
|
>> bin: map_res!(is_not!(" "), std::str::from_utf8)
|
||||||
|
>> is_a!(" ")
|
||||||
|
>> args: separated_list!(is_a!(" "), is_not!(" "))
|
||||||
|
>> ({
|
||||||
|
Pager(Pipe(bin.to_string(), args.into_iter().map(|v| String::from_utf8(v.to_vec()).unwrap()).collect::<Vec<String>>()))
|
||||||
|
})) | do_parse!(
|
||||||
|
ws!(tag!("pipe"))
|
||||||
|
>> bin: ws!(map_res!(is_not!(" "), std::str::from_utf8))
|
||||||
|
>> ({
|
||||||
|
Pager(Pipe(bin.to_string(), Vec::new()))
|
||||||
|
})
|
||||||
|
))
|
||||||
|
);
|
||||||
|
)
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -207,5 +231,5 @@ named!(
|
||||||
alt_complete!(toggle | envelope_action | filter | toggle_thread_snooze)
|
alt_complete!(toggle | envelope_action | filter | toggle_thread_snooze)
|
||||||
);
|
);
|
||||||
named!(pub parse_command<Action>,
|
named!(pub parse_command<Action>,
|
||||||
alt_complete!( goto | listing_action | sort | subsort | close | mailinglist | setenv | printenv)
|
alt_complete!( goto | listing_action | sort | subsort | close | mailinglist | setenv | printenv | pipe)
|
||||||
);
|
);
|
||||||
|
|
|
@ -59,6 +59,11 @@ pub enum MailingListAction {
|
||||||
ListUnsubscribe,
|
ListUnsubscribe,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum PagerAction {
|
||||||
|
Pipe(String, Vec<String>),
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Action {
|
pub enum Action {
|
||||||
Listing(ListingAction),
|
Listing(ListingAction),
|
||||||
|
@ -68,6 +73,7 @@ pub enum Action {
|
||||||
Tab(TabAction),
|
Tab(TabAction),
|
||||||
ToggleThreadSnooze,
|
ToggleThreadSnooze,
|
||||||
MailingListAction(MailingListAction),
|
MailingListAction(MailingListAction),
|
||||||
|
Pager(PagerAction),
|
||||||
SetEnv(String, String),
|
SetEnv(String, String),
|
||||||
PrintEnv(String),
|
PrintEnv(String),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue