pager: Add show_extra_headers option
Show custom set headers on pager, if existent. Quoting meli.conf(5): > show_extra_headers [String] (optional) Extra headers to > display, if present, in the > default header preamble of > the pager. This setting is > useful especially when used > per-folder or per-account. > For example, if you use > ‘rss2email’ (See r2e(1)) the > e-mail you will receive will > have the ‘X-RSS-Feed’ header > by default. You can show > them only in the folder > where you keep your feed > items: > > [accounts."personal".mailboxes] > INBOX = {} > "INBOX/Sent" = { sort_order=0 } > "INBOX/Feeds" = { pager.show_extra_headers = ["X-RSS-Feed"] } > (empty)pull/223/head
parent
d332e4578d
commit
58889bcadd
|
@ -599,7 +599,7 @@ Forward emails as attachment? (Alternative is inline).
|
||||||
.Pq Em optional
|
.Pq Em optional
|
||||||
Alternative lists of reply prefixes (etc. ["Re:", "RE:", ...]) to strip.
|
Alternative lists of reply prefixes (etc. ["Re:", "RE:", ...]) to strip.
|
||||||
.\" default value
|
.\" default value
|
||||||
.Pq Em ["Re:", "RE:", "Fwd:", "Fw:", "回复:", "回覆:", "SV:", "Sv:", "VS:", "Antw:", "Doorst:", "VS:", "VL:", "REF:", "TR:", "TR:", "AW:", "WG:", "ΑΠ:", "Απ:", "απ:", "ΠΡΘ:", "Πρθ:", "πρθ:", "ΣΧΕΤ:", "Σχετ:", "σχετ:", "ΠΡΘ:", "Πρθ:", "πρθ:", "Vá:", "Továbbítás:", "R:", "I:", "RIF:", "FS:", "BLS:", "TRS:", "VS:", "VB:", "RV:", "RES:", "Res", "ENC:", "Odp:", "PD:", "YNT:", "İLT:", "ATB:", "YML:"]
|
.Dl Em [Re:, RE:, Fwd:, Fw:, 回复:, 回覆:, SV:, Sv:, VS:, Antw:, Doorst:, VS:, VL:, REF:, TR:, TR:, AW:, WG:, ΑΠ:, Απ:, απ:, ΠΡΘ:, Πρθ:, πρθ:, ΣΧΕΤ:, Σχετ:, σχετ:, ΠΡΘ:, Πρθ:, πρθ:, Vá:, Továbbítás:, R:, I:, RIF:, FS:, BLS:, TRS:, VS:, VB:, RV:, RES:, Res, ENC:, Odp:, PD:, YNT:, İLT:, ATB:, YML:]
|
||||||
.It Ic reply_prefix Ar String
|
.It Ic reply_prefix Ar String
|
||||||
.Pq Em optional
|
.Pq Em optional
|
||||||
The prefix to use in reply subjects.
|
The prefix to use in reply subjects.
|
||||||
|
@ -1166,6 +1166,26 @@ A command to launch URLs with.
|
||||||
The URL will be given as the first argument of the command.
|
The URL will be given as the first argument of the command.
|
||||||
.\" default value
|
.\" default value
|
||||||
.Pq Em xdg-open
|
.Pq Em xdg-open
|
||||||
|
.It Ic show_extra_headers Ar [String]
|
||||||
|
.Pq Em optional
|
||||||
|
Extra headers to display, if present, in the default header preamble of the pager.
|
||||||
|
This setting is useful especially when used per-folder or per-account.
|
||||||
|
For example, if you use
|
||||||
|
.Ql rss2email
|
||||||
|
.Pq See Xr r2e 1
|
||||||
|
the e-mail you will receive will have the
|
||||||
|
.Ql X-RSS-Feed
|
||||||
|
header by default.
|
||||||
|
You can show them only in the folder where you keep your feed items:
|
||||||
|
.Pp
|
||||||
|
.Bd -literal -compact
|
||||||
|
[accounts."personal".mailboxes]
|
||||||
|
INBOX = {}
|
||||||
|
"INBOX/Sent" = { sort_order=0 }
|
||||||
|
"INBOX/Feeds" = { pager.show_extra_headers = ["X-RSS-Feed"] }
|
||||||
|
.Ed
|
||||||
|
.\" default value
|
||||||
|
.Pq Em empty
|
||||||
.El
|
.El
|
||||||
.Sh LISTING
|
.Sh LISTING
|
||||||
Default values are shown in parentheses.
|
Default values are shown in parentheses.
|
||||||
|
|
|
@ -28,7 +28,7 @@ use std::{
|
||||||
process::{Command, Stdio},
|
process::{Command, Stdio},
|
||||||
};
|
};
|
||||||
|
|
||||||
use melib::{email::attachment_types::ContentType, list_management, parser::BytesExt};
|
use melib::{email::attachment_types::ContentType, list_management, parser::BytesExt, HeaderName};
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -1208,12 +1208,12 @@ impl Component for MailView {
|
||||||
) || height_p < height;
|
) || height_p < height;
|
||||||
let (_, mut y) = upper_left;
|
let (_, mut y) = upper_left;
|
||||||
macro_rules! print_header {
|
macro_rules! print_header {
|
||||||
($(($header:literal, $string:expr)),*$(,)?) => {
|
($(($header:path, $string:expr)),*$(,)?) => {
|
||||||
$({
|
$({
|
||||||
if sticky || skip_header_ctr == 0 {
|
if sticky || skip_header_ctr == 0 {
|
||||||
if y <= get_y(bottom_right) {
|
if y <= get_y(bottom_right) {
|
||||||
let (_x, _y) = write_string_to_grid(
|
let (_x, _y) = write_string_to_grid(
|
||||||
$header,
|
&format!("{}:", $header),
|
||||||
grid,
|
grid,
|
||||||
headers_names.fg,
|
headers_names.fg,
|
||||||
headers_names.bg,
|
headers_names.bg,
|
||||||
|
@ -1299,25 +1299,28 @@ impl Component for MailView {
|
||||||
orig_date.into()
|
orig_date.into()
|
||||||
};
|
};
|
||||||
print_header!(
|
print_header!(
|
||||||
("Date:", date_str),
|
(HeaderName::DATE, date_str),
|
||||||
("From:", envelope.field_from_to_string()),
|
(HeaderName::FROM, envelope.field_from_to_string()),
|
||||||
("To:", envelope.field_to_to_string()),
|
(HeaderName::TO, envelope.field_to_to_string()),
|
||||||
);
|
);
|
||||||
if envelope.other_headers().contains_key("Cc")
|
if envelope.other_headers().contains_key(HeaderName::CC)
|
||||||
&& !envelope.other_headers()["Cc"].is_empty()
|
&& !envelope.other_headers()[HeaderName::CC].is_empty()
|
||||||
{
|
{
|
||||||
print_header!(("Cc:", envelope.field_cc_to_string()));
|
print_header!((HeaderName::CC, envelope.field_cc_to_string()));
|
||||||
}
|
}
|
||||||
print_header!(
|
print_header!(
|
||||||
("Subject:", envelope.subject()),
|
(HeaderName::SUBJECT, envelope.subject()),
|
||||||
("Message-ID:", format!("<{}>", envelope.message_id_raw()))
|
(
|
||||||
|
HeaderName::MESSAGE_ID,
|
||||||
|
format!("<{}>", envelope.message_id_raw())
|
||||||
|
)
|
||||||
);
|
);
|
||||||
if self.expand_headers {
|
if self.expand_headers {
|
||||||
if let Some(val) = envelope.in_reply_to_display() {
|
if let Some(val) = envelope.in_reply_to_display() {
|
||||||
print_header!(
|
print_header!(
|
||||||
("In-Reply-To:", val),
|
(HeaderName::IN_REPLY_TO, val),
|
||||||
(
|
(
|
||||||
"References:",
|
HeaderName::REFERENCES,
|
||||||
envelope
|
envelope
|
||||||
.references()
|
.references()
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -1328,6 +1331,18 @@ impl Component for MailView {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for hdr in mailbox_settings!(
|
||||||
|
context[self.coordinates.0][&self.coordinates.1]
|
||||||
|
.pager
|
||||||
|
.show_extra_headers
|
||||||
|
) {
|
||||||
|
if let Some((val, hdr)) = HeaderName::try_from(hdr)
|
||||||
|
.ok()
|
||||||
|
.and_then(|hdr| Some((envelope.other_headers().get(&hdr)?, hdr)))
|
||||||
|
{
|
||||||
|
print_header!((hdr, val));
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Some(list_management::ListActions {
|
if let Some(list_management::ListActions {
|
||||||
ref id,
|
ref id,
|
||||||
ref archive,
|
ref archive,
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
use super::*;
|
use super::*;
|
||||||
use melib::HeaderName;
|
use melib::HeaderName;
|
||||||
|
|
||||||
# [derive (Debug , Serialize , Deserialize , Clone)] # [serde (deny_unknown_fields)] pub struct PagerSettingsOverride { # [doc = " Number of context lines when going to next page."] # [doc = " Default: 0"] # [serde (alias = "pager-context")] # [serde (default)] pub pager_context : Option < usize > , # [doc = " Stop at the end instead of displaying next mail."] # [doc = " Default: false"] # [serde (alias = "pager-stop")] # [serde (default)] pub pager_stop : Option < bool > , # [doc = " Always show headers when scrolling."] # [doc = " Default: true"] # [serde (alias = "headers-sticky")] # [serde (default)] pub headers_sticky : Option < bool > , # [doc = " The height of the pager in mail view, in percent."] # [doc = " Default: 80"] # [serde (alias = "pager-ratio")] # [serde (default)] pub pager_ratio : Option < usize > , # [doc = " A command to pipe mail output through for viewing in pager."] # [doc = " Default: None"] # [serde (deserialize_with = "non_empty_opt_string")] # [serde (default)] pub filter : Option < Option < String > > , # [doc = " A command to pipe html output before displaying it in a pager"] # [doc = " Default: None"] # [serde (deserialize_with = "non_empty_opt_string" , alias = "html-filter")] # [serde (default)] pub html_filter : Option < Option < String > > , # [doc = " Respect \"format=flowed\""] # [doc = " Default: true"] # [serde (alias = "format-flowed")] # [serde (default)] pub format_flowed : Option < bool > , # [doc = " Split long lines that would overflow on the x axis."] # [doc = " Default: true"] # [serde (alias = "split-long-lines")] # [serde (default)] pub split_long_lines : Option < bool > , # [doc = " Minimum text width in columns."] # [doc = " Default: 80"] # [serde (alias = "minimum-width")] # [serde (default)] pub minimum_width : Option < usize > , # [doc = " Choose `text/html` alternative if `text/plain` is empty in"] # [doc = " `multipart/alternative` attachments."] # [doc = " Default: true"] # [serde (alias = "auto-choose-multipart-alternative")] # [serde (default)] pub auto_choose_multipart_alternative : Option < ToggleFlag > , # [doc = " Show Date: in my timezone"] # [doc = " Default: true"] # [serde (alias = "show-date-in-my-timezone")] # [serde (default)] pub show_date_in_my_timezone : Option < ToggleFlag > , # [doc = " A command to launch URLs with. The URL will be given as the first"] # [doc = " argument of the command. Default: None"] # [serde (deserialize_with = "non_empty_opt_string")] # [serde (default)] pub url_launcher : Option < Option < String > > , # [doc = " A command to open html files."] # [doc = " Default: None"] # [serde (deserialize_with = "non_empty_opt_string" , alias = "html-open")] # [serde (default)] pub html_open : Option < Option < String > > } impl Default for PagerSettingsOverride { fn default () -> Self { PagerSettingsOverride { pager_context : None , pager_stop : None , headers_sticky : None , pager_ratio : None , filter : None , html_filter : None , format_flowed : None , split_long_lines : None , minimum_width : None , auto_choose_multipart_alternative : None , show_date_in_my_timezone : None , url_launcher : None , html_open : None } } }
|
# [derive (Debug , Serialize , Deserialize , Clone)] # [serde (deny_unknown_fields)] pub struct PagerSettingsOverride { # [doc = " Number of context lines when going to next page."] # [doc = " Default: 0"] # [serde (alias = "pager-context")] # [serde (default)] pub pager_context : Option < usize > , # [doc = " Stop at the end instead of displaying next mail."] # [doc = " Default: false"] # [serde (alias = "pager-stop")] # [serde (default)] pub pager_stop : Option < bool > , # [doc = " Always show headers when scrolling."] # [doc = " Default: true"] # [serde (alias = "headers-sticky")] # [serde (default)] pub headers_sticky : Option < bool > , # [doc = " The height of the pager in mail view, in percent."] # [doc = " Default: 80"] # [serde (alias = "pager-ratio")] # [serde (default)] pub pager_ratio : Option < usize > , # [doc = " A command to pipe mail output through for viewing in pager."] # [doc = " Default: None"] # [serde (deserialize_with = "non_empty_opt_string")] # [serde (default)] pub filter : Option < Option < String > > , # [doc = " A command to pipe html output before displaying it in a pager"] # [doc = " Default: None"] # [serde (deserialize_with = "non_empty_opt_string" , alias = "html-filter")] # [serde (default)] pub html_filter : Option < Option < String > > , # [doc = " Respect \"format=flowed\""] # [doc = " Default: true"] # [serde (alias = "format-flowed")] # [serde (default)] pub format_flowed : Option < bool > , # [doc = " Split long lines that would overflow on the x axis."] # [doc = " Default: true"] # [serde (alias = "split-long-lines")] # [serde (default)] pub split_long_lines : Option < bool > , # [doc = " Minimum text width in columns."] # [doc = " Default: 80"] # [serde (alias = "minimum-width")] # [serde (default)] pub minimum_width : Option < usize > , # [doc = " Choose `text/html` alternative if `text/plain` is empty in"] # [doc = " `multipart/alternative` attachments."] # [doc = " Default: true"] # [serde (alias = "auto-choose-multipart-alternative")] # [serde (default)] pub auto_choose_multipart_alternative : Option < ToggleFlag > , # [doc = " Show Date: in my timezone"] # [doc = " Default: true"] # [serde (alias = "show-date-in-my-timezone")] # [serde (default)] pub show_date_in_my_timezone : Option < ToggleFlag > , # [doc = " A command to launch URLs with. The URL will be given as the first"] # [doc = " argument of the command. Default: None"] # [serde (deserialize_with = "non_empty_opt_string")] # [serde (default)] pub url_launcher : Option < Option < String > > , # [doc = " A command to open html files."] # [doc = " Default: None"] # [serde (deserialize_with = "non_empty_opt_string" , alias = "html-open")] # [serde (default)] pub html_open : Option < Option < String > > , # [doc = " Extra headers to display, if present, in the default header preamble."] # [doc = " Default: []"] # [serde (alias = "show-extra-headers")] # [serde (default)] pub show_extra_headers : Option < Vec < String > > } impl Default for PagerSettingsOverride { fn default () -> Self { PagerSettingsOverride { pager_context : None , pager_stop : None , headers_sticky : None , pager_ratio : None , filter : None , html_filter : None , format_flowed : None , split_long_lines : None , minimum_width : None , auto_choose_multipart_alternative : None , show_date_in_my_timezone : None , url_launcher : None , html_open : None , show_extra_headers : None } } }
|
||||||
|
|
||||||
# [derive (Debug , Serialize , Deserialize , Clone)] # [serde (deny_unknown_fields)] pub struct ListingSettingsOverride { # [doc = " Number of context lines when going to next page."] # [doc = " Default: 0"] # [serde (alias = "context-lines")] # [serde (default)] pub context_lines : Option < usize > , # [doc = "Show auto-hiding scrollbar in accounts sidebar menu."] # [doc = "Default: True"] # [serde (default)] pub show_menu_scrollbar : Option < bool > , # [doc = " Datetime formatting passed verbatim to strftime(3)."] # [doc = " Default: %Y-%m-%d %T"] # [serde (alias = "datetime-fmt")] # [serde (default)] pub datetime_fmt : Option < Option < String > > , # [doc = " Show recent dates as `X {minutes,hours,days} ago`, up to 7 days."] # [doc = " Default: true"] # [serde (alias = "recent-dates")] # [serde (default)] pub recent_dates : Option < bool > , # [doc = " Show only envelopes that match this query"] # [doc = " Default: None"] # [serde (default)] pub filter : Option < Option < Query > > , # [serde (alias = "index-style")] # [serde (default)] pub index_style : Option < IndexStyle > , # [doc = "Default: \" \""] # [serde (default)] pub sidebar_mailbox_tree_has_sibling : Option < Option < String > > , # [doc = "Default: \" \""] # [serde (default)] pub sidebar_mailbox_tree_no_sibling : Option < Option < String > > , # [doc = "Default: \" \""] # [serde (default)] pub sidebar_mailbox_tree_has_sibling_leaf : Option < Option < String > > , # [doc = "Default: \" \""] # [serde (default)] pub sidebar_mailbox_tree_no_sibling_leaf : Option < Option < String > > , # [doc = "Default: ' '"] # [serde (default)] pub sidebar_divider : Option < char > , # [doc = "Default: 90"] # [serde (default)] pub sidebar_ratio : Option < usize > , # [doc = " Flag to show if thread entry contains unseen mail."] # [doc = " Default: \"●\""] # [serde (default)] pub unseen_flag : Option < Option < String > > , # [doc = " Flag to show if thread has been snoozed."] # [doc = " Default: \"💤\""] # [serde (default)] pub thread_snoozed_flag : Option < Option < String > > , # [doc = " Flag to show if thread entry has been selected."] # [doc = " Default: \"☑\u{fe0f}\""] # [serde (default)] pub selected_flag : Option < Option < String > > , # [doc = " Flag to show if thread entry contains attachments."] # [doc = " Default: \"📎\""] # [serde (default)] pub attachment_flag : Option < Option < String > > , # [doc = " Should threads with differentiating Subjects show a list of those"] # [doc = " subjects on the entry title?"] # [doc = " Default: \"true\""] # [serde (default)] pub thread_subject_pack : Option < bool > } impl Default for ListingSettingsOverride { fn default () -> Self { ListingSettingsOverride { context_lines : None , show_menu_scrollbar : None , datetime_fmt : None , recent_dates : None , filter : None , index_style : None , sidebar_mailbox_tree_has_sibling : None , sidebar_mailbox_tree_no_sibling : None , sidebar_mailbox_tree_has_sibling_leaf : None , sidebar_mailbox_tree_no_sibling_leaf : None , sidebar_divider : None , sidebar_ratio : None , unseen_flag : None , thread_snoozed_flag : None , selected_flag : None , attachment_flag : None , thread_subject_pack : None } } }
|
# [derive (Debug , Serialize , Deserialize , Clone)] # [serde (deny_unknown_fields)] pub struct ListingSettingsOverride { # [doc = " Number of context lines when going to next page."] # [doc = " Default: 0"] # [serde (alias = "context-lines")] # [serde (default)] pub context_lines : Option < usize > , # [doc = "Show auto-hiding scrollbar in accounts sidebar menu."] # [doc = "Default: True"] # [serde (default)] pub show_menu_scrollbar : Option < bool > , # [doc = " Datetime formatting passed verbatim to strftime(3)."] # [doc = " Default: %Y-%m-%d %T"] # [serde (alias = "datetime-fmt")] # [serde (default)] pub datetime_fmt : Option < Option < String > > , # [doc = " Show recent dates as `X {minutes,hours,days} ago`, up to 7 days."] # [doc = " Default: true"] # [serde (alias = "recent-dates")] # [serde (default)] pub recent_dates : Option < bool > , # [doc = " Show only envelopes that match this query"] # [doc = " Default: None"] # [serde (default)] pub filter : Option < Option < Query > > , # [serde (alias = "index-style")] # [serde (default)] pub index_style : Option < IndexStyle > , # [doc = "Default: \" \""] # [serde (default)] pub sidebar_mailbox_tree_has_sibling : Option < Option < String > > , # [doc = "Default: \" \""] # [serde (default)] pub sidebar_mailbox_tree_no_sibling : Option < Option < String > > , # [doc = "Default: \" \""] # [serde (default)] pub sidebar_mailbox_tree_has_sibling_leaf : Option < Option < String > > , # [doc = "Default: \" \""] # [serde (default)] pub sidebar_mailbox_tree_no_sibling_leaf : Option < Option < String > > , # [doc = "Default: ' '"] # [serde (default)] pub sidebar_divider : Option < char > , # [doc = "Default: 90"] # [serde (default)] pub sidebar_ratio : Option < usize > , # [doc = " Flag to show if thread entry contains unseen mail."] # [doc = " Default: \"●\""] # [serde (default)] pub unseen_flag : Option < Option < String > > , # [doc = " Flag to show if thread has been snoozed."] # [doc = " Default: \"💤\""] # [serde (default)] pub thread_snoozed_flag : Option < Option < String > > , # [doc = " Flag to show if thread entry has been selected."] # [doc = " Default: \"☑\u{fe0f}\""] # [serde (default)] pub selected_flag : Option < Option < String > > , # [doc = " Flag to show if thread entry contains attachments."] # [doc = " Default: \"📎\""] # [serde (default)] pub attachment_flag : Option < Option < String > > , # [doc = " Should threads with differentiating Subjects show a list of those"] # [doc = " subjects on the entry title?"] # [doc = " Default: \"true\""] # [serde (default)] pub thread_subject_pack : Option < bool > } impl Default for ListingSettingsOverride { fn default () -> Self { ListingSettingsOverride { context_lines : None , show_menu_scrollbar : None , datetime_fmt : None , recent_dates : None , filter : None , index_style : None , sidebar_mailbox_tree_has_sibling : None , sidebar_mailbox_tree_no_sibling : None , sidebar_mailbox_tree_has_sibling_leaf : None , sidebar_mailbox_tree_no_sibling_leaf : None , sidebar_divider : None , sidebar_ratio : None , unseen_flag : None , thread_snoozed_flag : None , selected_flag : None , attachment_flag : None , thread_subject_pack : None } } }
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,11 @@ pub struct PagerSettings {
|
||||||
alias = "html-open"
|
alias = "html-open"
|
||||||
)]
|
)]
|
||||||
pub html_open: Option<String>,
|
pub html_open: Option<String>,
|
||||||
|
|
||||||
|
/// Extra headers to display, if present, in the default header preamble.
|
||||||
|
/// Default: []
|
||||||
|
#[serde(default = "Vec::new", alias = "show-extra-headers")]
|
||||||
|
pub show_extra_headers: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for PagerSettings {
|
impl Default for PagerSettings {
|
||||||
|
@ -123,6 +128,7 @@ impl Default for PagerSettings {
|
||||||
auto_choose_multipart_alternative: ToggleFlag::InternalVal(true),
|
auto_choose_multipart_alternative: ToggleFlag::InternalVal(true),
|
||||||
show_date_in_my_timezone: ToggleFlag::InternalVal(true),
|
show_date_in_my_timezone: ToggleFlag::InternalVal(true),
|
||||||
url_launcher: None,
|
url_launcher: None,
|
||||||
|
show_extra_headers: vec![],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,6 +154,7 @@ impl DotAddressable for PagerSettings {
|
||||||
}
|
}
|
||||||
"show_date_in_my_timezone" => self.show_date_in_my_timezone.lookup(field, tail),
|
"show_date_in_my_timezone" => self.show_date_in_my_timezone.lookup(field, tail),
|
||||||
"url_launcher" => self.html_filter.lookup(field, tail),
|
"url_launcher" => self.html_filter.lookup(field, tail),
|
||||||
|
"show_extra_headers" => self.show_extra_headers.lookup(field, tail),
|
||||||
other => Err(Error::new(format!(
|
other => Err(Error::new(format!(
|
||||||
"{} has no field named {}",
|
"{} has no field named {}",
|
||||||
parent_field, other
|
parent_field, other
|
||||||
|
|
Loading…
Reference in New Issue