Read the odd startup option from org-mode files.

This commit is contained in:
Tom Alexander 2023-09-15 22:31:15 -04:00
parent 8450785186
commit a74ea730f4
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
3 changed files with 31 additions and 0 deletions

View File

@ -22,6 +22,11 @@ pub struct GlobalSettings<'g, 's> {
/// ///
/// Corresponds to the tab-width elisp variable. /// Corresponds to the tab-width elisp variable.
pub tab_width: IndentationLevel, pub tab_width: IndentationLevel,
/// Whether to only allow odd headline levels.
///
/// Corresponds to org-odd-levels-only elisp variable.
pub odd_levels_only: HeadlineLevelFilter,
} }
impl<'g, 's> GlobalSettings<'g, 's> { impl<'g, 's> GlobalSettings<'g, 's> {
@ -35,6 +40,7 @@ impl<'g, 's> GlobalSettings<'g, 's> {
complete_todo_keywords: BTreeSet::new(), complete_todo_keywords: BTreeSet::new(),
org_list_allow_alphabetical: false, org_list_allow_alphabetical: false,
tab_width: 8, tab_width: 8,
odd_levels_only: HeadlineLevelFilter::OddEven,
} }
} }
} }
@ -44,3 +50,9 @@ impl<'g, 's> Default for GlobalSettings<'g, 's> {
GlobalSettings::new() GlobalSettings::new()
} }
} }
#[derive(Debug, Clone)]
pub enum HeadlineLevelFilter {
Odd,
OddEven,
}

View File

@ -25,5 +25,6 @@ pub(crate) use exiting::ExitClass;
pub use file_access_interface::FileAccessInterface; pub use file_access_interface::FileAccessInterface;
pub use file_access_interface::LocalFileAccessInterface; pub use file_access_interface::LocalFileAccessInterface;
pub use global_settings::GlobalSettings; pub use global_settings::GlobalSettings;
pub use global_settings::HeadlineLevelFilter;
pub(crate) use list::List; pub(crate) use list::List;
pub(crate) use parser_with_context::parser_with_context; pub(crate) use parser_with_context::parser_with_context;

View File

@ -1,13 +1,17 @@
use nom::branch::alt; use nom::branch::alt;
use nom::bytes::complete::is_not;
use nom::bytes::complete::tag_no_case; use nom::bytes::complete::tag_no_case;
use nom::character::complete::anychar; use nom::character::complete::anychar;
use nom::character::complete::space1;
use nom::combinator::map; use nom::combinator::map;
use nom::multi::many0; use nom::multi::many0;
use nom::multi::many_till; use nom::multi::many_till;
use nom::multi::separated_list0;
use super::keyword::filtered_keyword; use super::keyword::filtered_keyword;
use super::keyword_todo::todo_keywords; use super::keyword_todo::todo_keywords;
use super::OrgSource; use super::OrgSource;
use crate::context::HeadlineLevelFilter;
use crate::error::Res; use crate::error::Res;
use crate::types::Keyword; use crate::types::Keyword;
use crate::GlobalSettings; use crate::GlobalSettings;
@ -50,6 +54,7 @@ pub(crate) fn apply_in_buffer_settings<'g, 's, 'sf>(
) -> Result<GlobalSettings<'g, 's>, String> { ) -> Result<GlobalSettings<'g, 's>, String> {
let mut new_settings = original_settings.clone(); let mut new_settings = original_settings.clone();
// Todo Keywords
for kw in keywords.iter().filter(|kw| { for kw in keywords.iter().filter(|kw| {
kw.key.eq_ignore_ascii_case("todo") kw.key.eq_ignore_ascii_case("todo")
|| kw.key.eq_ignore_ascii_case("seq_todo") || kw.key.eq_ignore_ascii_case("seq_todo")
@ -65,5 +70,18 @@ pub(crate) fn apply_in_buffer_settings<'g, 's, 'sf>(
.extend(complete_words.into_iter().map(str::to_string)); .extend(complete_words.into_iter().map(str::to_string));
} }
// Startup settings
for kw in keywords
.iter()
.filter(|kw| kw.key.eq_ignore_ascii_case("startup"))
{
let (_remaining, settings) =
separated_list0(space1::<&str, nom::error::Error<_>>, is_not(" \t"))(kw.value)
.map_err(|err: nom::Err<_>| err.to_string())?;
if settings.contains(&"odd") {
new_settings.odd_levels_only = HeadlineLevelFilter::Odd;
}
}
Ok(new_settings) Ok(new_settings)
} }