pub struct Conf {Show 23 fields
pub files: Vec<PathBuf>,
pub default_flags: Option<String>,
pub date_time_format: Option<String>,
pub verbs: Vec<VerbConf>,
pub skin: Option<AHashMap<String, SkinEntry>>,
pub special_paths: AHashMap<Glob, SpecialHandling>,
pub search_modes: Option<FnvHashMap<String, String>>,
pub disable_mouse_capture: Option<bool>,
pub capture_mouse: Option<bool>,
pub cols_order: Option<ColsConf>,
pub show_selection_mark: Option<bool>,
pub ext_colors: AHashMap<String, String>,
pub syntax_theme: Option<SyntaxTheme>,
pub true_colors: Option<bool>,
pub icon_theme: Option<String>,
pub modal: Option<bool>,
pub max_panels_count: Option<usize>,
pub quit_on_last_cancel: Option<bool>,
pub file_sum_threads_count: Option<usize>,
pub max_staged_count: Option<usize>,
pub imports: Vec<Import>,
pub show_matching_characters_on_path_searches: Option<bool>,
pub content_search_max_file_size: Option<u64>,
}
Expand description
The configuration read from conf.toml or conf.hjson file(s)
Fields§
§files: Vec<PathBuf>
the files used to load this configuration
default_flags: Option<String>
§date_time_format: Option<String>
§verbs: Vec<VerbConf>
§skin: Option<AHashMap<String, SkinEntry>>
§special_paths: AHashMap<Glob, SpecialHandling>
§search_modes: Option<FnvHashMap<String, String>>
§disable_mouse_capture: Option<bool>
Obsolete, kept for compatibility: you should now use capture_mouse
capture_mouse: Option<bool>
§cols_order: Option<ColsConf>
§show_selection_mark: Option<bool>
§ext_colors: AHashMap<String, String>
§syntax_theme: Option<SyntaxTheme>
§true_colors: Option<bool>
§icon_theme: Option<String>
§modal: Option<bool>
§max_panels_count: Option<usize>
§quit_on_last_cancel: Option<bool>
§file_sum_threads_count: Option<usize>
§max_staged_count: Option<usize>
§imports: Vec<Import>
§show_matching_characters_on_path_searches: Option<bool>
§content_search_max_file_size: Option<u64>
Implementations§
source§impl Conf
impl Conf
sourcepub fn default_location() -> PathBuf
pub fn default_location() -> PathBuf
return the path to the default conf.toml file. If there’s no conf.hjson file in the default conf directory, and if there’s a toml file, return this toml file.
Examples found in repository?
src/conf/conf.rs (line 133)
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
pub fn from_default_location() -> Result<Conf, ProgramError> {
let conf_dir = super::dir();
let conf_filepath = Conf::default_location();
if !conf_filepath.exists() {
write_default_conf_in(conf_dir)?;
println!(
"New Configuration files written in {}{:?}{}.",
Attribute::Bold,
&conf_dir,
Attribute::Reset,
);
println!("You should have a look at them.");
}
let mut conf = Conf::default();
conf.read_file(conf_filepath)?;
Ok(conf)
}
More examples
src/help/help_state.rs (line 235)
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
fn on_internal(
&mut self,
w: &mut W,
internal_exec: &InternalExecution,
input_invocation: Option<&VerbInvocation>,
trigger_type: TriggerType,
app_state: &mut AppState,
cc: &CmdContext,
) -> Result<CmdResult, ProgramError> {
use Internal::*;
Ok(match internal_exec.internal {
Internal::back => {
if self.pattern.is_some() {
self.pattern = Pattern::None;
CmdResult::Keep
} else {
CmdResult::PopState
}
}
help => CmdResult::Keep,
line_down | line_down_no_cycle => {
self.scroll += get_arg(input_invocation, internal_exec, 1);
CmdResult::Keep
}
line_up | line_up_no_cycle => {
let dy = get_arg(input_invocation, internal_exec, 1);
self.scroll = if self.scroll > dy {
self.scroll - dy
} else {
0
};
CmdResult::Keep
}
open_stay => match opener::open(&Conf::default_location()) {
Ok(exit_status) => {
info!("open returned with exit_status {:?}", exit_status);
CmdResult::Keep
}
Err(e) => CmdResult::DisplayError(format!("{:?}", e)),
},
// FIXME check we can't use the generic one
open_leave => {
CmdResult::from(Launchable::opener(
Conf::default_location()
))
}
page_down => {
self.scroll += self.text_area.height as usize;
CmdResult::Keep
}
page_up => {
let height = self.text_area.height as usize;
self.scroll = if self.scroll > height {
self.scroll - self.text_area.height as usize
} else {
0
};
CmdResult::Keep
}
_ => self.on_internal_generic(
w,
internal_exec,
input_invocation,
trigger_type,
app_state,
cc,
)?,
})
}
sourcepub fn from_default_location() -> Result<Conf, ProgramError>
pub fn from_default_location() -> Result<Conf, ProgramError>
read the configuration file from the default OS specific location. Create it if it doesn’t exist
Examples found in repository?
src/cli/mod.rs (line 91)
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
pub fn run() -> Result<Option<Launchable>, ProgramError> {
// parse the launch arguments we got from cli
let args = Args::parse();
let mut must_quit = false;
if let Some(dir) = &args.write_default_conf {
write_default_conf_in(dir)?;
must_quit = true;
}
// read the install related arguments
let install_args = InstallLaunchArgs::from(&args)?;
// execute installation things required by launch args
if let Some(state) = install_args.set_install_state {
write_state(state)?;
must_quit = true;
}
if let Some(shell) = &install_args.print_shell_function {
ShellInstall::print(shell)?;
must_quit = true;
}
if must_quit {
return Ok(None);
}
// read the list of specific config files
let specific_conf: Option<Vec<PathBuf>> = args.conf
.as_ref()
.map(|s| s.split(';').map(PathBuf::from).collect());
// if we don't run on a specific config file, we check the
// configuration
if specific_conf.is_none() && install_args.install != Some(false) {
let mut shell_install = ShellInstall::new(install_args.install == Some(true));
shell_install.check()?;
if shell_install.should_quit {
return Ok(None);
}
}
// read the configuration file(s): either the standard one
// or the ones required by the launch args
let mut config = match &specific_conf {
Some(conf_paths) => {
let mut conf = Conf::default();
for path in conf_paths {
conf.read_file(path.to_path_buf())?;
}
conf
}
_ => time!(Conf::from_default_location())?,
};
debug!("config: {:#?}", &config);
// verb store is completed from the config file(s)
let verb_store = VerbStore::new(&mut config)?;
let mut context = AppContext::from(args, verb_store, &config)?;
#[cfg(unix)]
if let Some(server_name) = &context.launch_args.send {
use crate::{
command::Sequence,
net::{Client, Message},
};
let client = Client::new(server_name);
if let Some(seq) = &context.launch_args.cmd {
let message = Message::Sequence(Sequence::new_local(seq.to_string()));
client.send(&message)?;
} else if !context.launch_args.get_root {
let message = Message::Command(
format!(":focus {}", context.initial_root.to_string_lossy())
);
client.send(&message)?;
};
if context.launch_args.get_root {
client.send(&Message::GetRoot)?;
}
return Ok(None);
}
let mut w = display::writer();
let app = App::new(&context)?;
w.queue(EnterAlternateScreen)?;
w.queue(cursor::Hide)?;
if context.capture_mouse {
w.queue(EnableMouseCapture)?;
}
let r = app.run(&mut w, &mut context, &config);
if context.capture_mouse {
w.queue(DisableMouseCapture)?;
}
w.queue(cursor::Show)?;
w.queue(LeaveAlternateScreen)?;
w.flush()?;
r
}
sourcepub fn solve_conf_path(&self, path: &str) -> Option<PathBuf>
pub fn solve_conf_path(&self, path: &str) -> Option<PathBuf>
Examples found in repository?
src/conf/conf.rs (line 202)
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
pub fn read_file(
&mut self,
path: PathBuf,
) -> Result<(), ProgramError> {
debug!("reading conf file: {:?}", &path);
let mut conf: Conf = SerdeFormat::read_file(&path)?;
overwrite!(self, default_flags, conf);
overwrite!(self, date_time_format, conf);
overwrite!(self, icon_theme, conf);
overwrite!(self, syntax_theme, conf);
overwrite!(self, disable_mouse_capture, conf);
overwrite!(self, capture_mouse, conf);
overwrite!(self, true_colors, conf);
overwrite!(self, show_selection_mark, conf);
overwrite!(self, cols_order, conf);
overwrite!(self, skin, conf);
overwrite!(self, search_modes, conf);
overwrite!(self, max_panels_count, conf);
overwrite!(self, modal, conf);
overwrite!(self, quit_on_last_cancel, conf);
overwrite!(self, file_sum_threads_count, conf);
overwrite!(self, max_staged_count, conf);
overwrite!(self, show_matching_characters_on_path_searches, conf);
overwrite!(self, content_search_max_file_size, conf);
self.verbs.append(&mut conf.verbs);
// the following maps are "additive": we can add entries from several
// config files and they still make sense
overwrite_map!(self, special_paths, conf);
overwrite_map!(self, ext_colors, conf);
self.files.push(path);
// read the imports
for import in &conf.imports {
let file = import.file();
if !import.applies() {
debug!("skipping not applying conf file : {:?}", file);
continue;
}
let import_path = self.solve_conf_path(file)
.ok_or_else(|| ConfError::ImportNotFound { path: file.to_string() })?;
if self.files.contains(&import_path) {
debug!("skipping import already read: {:?}", import_path);
continue;
}
self.read_file(import_path)?;
}
Ok(())
}
sourcepub fn read_file(&mut self, path: PathBuf) -> Result<(), ProgramError>
pub fn read_file(&mut self, path: PathBuf) -> Result<(), ProgramError>
read the configuration from a given path. Assume it exists. Values set in the read file replace the ones of self. Errors are printed on stderr (assuming this function is called before terminal alternation).
Examples found in repository?
src/conf/conf.rs (line 145)
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
pub fn from_default_location() -> Result<Conf, ProgramError> {
let conf_dir = super::dir();
let conf_filepath = Conf::default_location();
if !conf_filepath.exists() {
write_default_conf_in(conf_dir)?;
println!(
"New Configuration files written in {}{:?}{}.",
Attribute::Bold,
&conf_dir,
Attribute::Reset,
);
println!("You should have a look at them.");
}
let mut conf = Conf::default();
conf.read_file(conf_filepath)?;
Ok(conf)
}
pub fn solve_conf_path(&self, path: &str) -> Option<PathBuf> {
if path.ends_with(".toml") || path.ends_with(".hjson") {
for conf_file in self.files.iter().rev() {
let solved = path_from(conf_file, PathAnchor::Parent, path);
if solved.exists() {
return Some(solved)
}
}
}
None
}
/// read the configuration from a given path. Assume it exists.
/// Values set in the read file replace the ones of self.
/// Errors are printed on stderr (assuming this function is called
/// before terminal alternation).
pub fn read_file(
&mut self,
path: PathBuf,
) -> Result<(), ProgramError> {
debug!("reading conf file: {:?}", &path);
let mut conf: Conf = SerdeFormat::read_file(&path)?;
overwrite!(self, default_flags, conf);
overwrite!(self, date_time_format, conf);
overwrite!(self, icon_theme, conf);
overwrite!(self, syntax_theme, conf);
overwrite!(self, disable_mouse_capture, conf);
overwrite!(self, capture_mouse, conf);
overwrite!(self, true_colors, conf);
overwrite!(self, show_selection_mark, conf);
overwrite!(self, cols_order, conf);
overwrite!(self, skin, conf);
overwrite!(self, search_modes, conf);
overwrite!(self, max_panels_count, conf);
overwrite!(self, modal, conf);
overwrite!(self, quit_on_last_cancel, conf);
overwrite!(self, file_sum_threads_count, conf);
overwrite!(self, max_staged_count, conf);
overwrite!(self, show_matching_characters_on_path_searches, conf);
overwrite!(self, content_search_max_file_size, conf);
self.verbs.append(&mut conf.verbs);
// the following maps are "additive": we can add entries from several
// config files and they still make sense
overwrite_map!(self, special_paths, conf);
overwrite_map!(self, ext_colors, conf);
self.files.push(path);
// read the imports
for import in &conf.imports {
let file = import.file();
if !import.applies() {
debug!("skipping not applying conf file : {:?}", file);
continue;
}
let import_path = self.solve_conf_path(file)
.ok_or_else(|| ConfError::ImportNotFound { path: file.to_string() })?;
if self.files.contains(&import_path) {
debug!("skipping import already read: {:?}", import_path);
continue;
}
self.read_file(import_path)?;
}
Ok(())
}
More examples
src/cli/mod.rs (line 87)
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
pub fn run() -> Result<Option<Launchable>, ProgramError> {
// parse the launch arguments we got from cli
let args = Args::parse();
let mut must_quit = false;
if let Some(dir) = &args.write_default_conf {
write_default_conf_in(dir)?;
must_quit = true;
}
// read the install related arguments
let install_args = InstallLaunchArgs::from(&args)?;
// execute installation things required by launch args
if let Some(state) = install_args.set_install_state {
write_state(state)?;
must_quit = true;
}
if let Some(shell) = &install_args.print_shell_function {
ShellInstall::print(shell)?;
must_quit = true;
}
if must_quit {
return Ok(None);
}
// read the list of specific config files
let specific_conf: Option<Vec<PathBuf>> = args.conf
.as_ref()
.map(|s| s.split(';').map(PathBuf::from).collect());
// if we don't run on a specific config file, we check the
// configuration
if specific_conf.is_none() && install_args.install != Some(false) {
let mut shell_install = ShellInstall::new(install_args.install == Some(true));
shell_install.check()?;
if shell_install.should_quit {
return Ok(None);
}
}
// read the configuration file(s): either the standard one
// or the ones required by the launch args
let mut config = match &specific_conf {
Some(conf_paths) => {
let mut conf = Conf::default();
for path in conf_paths {
conf.read_file(path.to_path_buf())?;
}
conf
}
_ => time!(Conf::from_default_location())?,
};
debug!("config: {:#?}", &config);
// verb store is completed from the config file(s)
let verb_store = VerbStore::new(&mut config)?;
let mut context = AppContext::from(args, verb_store, &config)?;
#[cfg(unix)]
if let Some(server_name) = &context.launch_args.send {
use crate::{
command::Sequence,
net::{Client, Message},
};
let client = Client::new(server_name);
if let Some(seq) = &context.launch_args.cmd {
let message = Message::Sequence(Sequence::new_local(seq.to_string()));
client.send(&message)?;
} else if !context.launch_args.get_root {
let message = Message::Command(
format!(":focus {}", context.initial_root.to_string_lossy())
);
client.send(&message)?;
};
if context.launch_args.get_root {
client.send(&Message::GetRoot)?;
}
return Ok(None);
}
let mut w = display::writer();
let app = App::new(&context)?;
w.queue(EnterAlternateScreen)?;
w.queue(cursor::Hide)?;
if context.capture_mouse {
w.queue(EnableMouseCapture)?;
}
let r = app.run(&mut w, &mut context, &config);
if context.capture_mouse {
w.queue(DisableMouseCapture)?;
}
w.queue(cursor::Show)?;
w.queue(LeaveAlternateScreen)?;
w.flush()?;
r
}
Trait Implementations§
source§impl<'de> Deserialize<'de> for Conf
impl<'de> Deserialize<'de> for Conf
source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Auto Trait Implementations§
impl RefUnwindSafe for Conf
impl Send for Conf
impl Sync for Conf
impl Unpin for Conf
impl UnwindSafe for Conf
Blanket Implementations§
§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<R, P> ReadPrimitive<R> for Pwhere
R: Read + ReadEndian<P>,
P: Default,
impl<R, P> ReadPrimitive<R> for Pwhere
R: Read + ReadEndian<P>,
P: Default,
source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
Read this value from the supplied reader. Same as
ReadEndian::read_from_little_endian()
.