mirror of
https://github.com/ClementTsang/bottom
synced 2024-11-22 12:13:06 +00:00
change: Update macOS config dir
Update documentation and program to use the correct config directory as per the dirs package.
This commit is contained in:
parent
6e38d73116
commit
e1a7378386
5 changed files with 81 additions and 51 deletions
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
|
@ -41,6 +41,7 @@
|
|||
"whitespaces",
|
||||
"winapi",
|
||||
"winnt",
|
||||
"xzvf"
|
||||
"xzvf",
|
||||
"ytop"
|
||||
]
|
||||
}
|
|
@ -19,6 +19,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
- Changed to just support stable (and newer) Rust, due to library incompatibilities.
|
||||
|
||||
- For macOS, support `$HOME/Library/Application Support` instead of `$HOME/.config` for config files. For
|
||||
backwards compatibility's sake, for macOS, this will still check `.config` if it exists first,
|
||||
but otherwise, it will default to the new location.
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
## [0.4.5] - 2020-07-08
|
||||
|
|
74
README.md
74
README.md
|
@ -377,7 +377,14 @@ Note custom layouts are currently not available when this is used.
|
|||
|
||||
### Config files
|
||||
|
||||
bottom supports reading from a config file to customize its behaviour and look. By default, bottom will look at `~/.config/bottom/bottom.toml` or `C:\Users\<USER>\AppData\Roaming\bottom\bottom.toml` on Unix and Windows systems respectively.
|
||||
bottom supports reading from a config file to customize its behaviour and look.
|
||||
By default, bottom will look at (based on [dirs](https://github.com/dirs-dev/dirs-rs#features)):
|
||||
|
||||
| OS | Location |
|
||||
| ----------------------------------------------------------------------- | -------- |
|
||||
| `~/.config/bottom/bottom.toml` or `$XDG_CONFIG_HOME/bottom/bottom.toml` | Linux |
|
||||
| `$HOME/Library/Application Support/bottom/bottom.toml` | macOS |
|
||||
| `C:\Users\<USER>\AppData\Roaming\bottom\bottom.toml` | Windows |
|
||||
|
||||
Note that if a config file does not exist at either the default location or the passed in location via `-C` or `--config`, one is automatically created with no settings applied.
|
||||
|
||||
|
@ -386,27 +393,28 @@ Note that if a config file does not exist at either the default location or the
|
|||
The following options can be set under `[flags]` to achieve the same effect as passing in a flag on runtime. Note that if a flag is given, it will override the config file.
|
||||
|
||||
These are the following supported flag config values:
|
||||
| Field | Type |
|
||||
|------------------------|---------------------------------------------------------------------------------------|
|
||||
| `hide_avg_cpu` | Boolean |
|
||||
| `dot_marker` | Boolean |
|
||||
| `left_legend` | Boolean |
|
||||
| `current_usage` | Boolean |
|
||||
| `group_processes` | Boolean |
|
||||
| `case_sensitive` | Boolean |
|
||||
| `whole_word` | Boolean |
|
||||
| `regex` | Boolean |
|
||||
| `show_disabled_data` | Boolean |
|
||||
| `basic` | Boolean |
|
||||
| `hide_table_count`| Boolean |
|
||||
| `use_old_network_legend`| Boolean |
|
||||
| `battery` | Boolean |
|
||||
| `rate` | Unsigned Int (represents milliseconds) |
|
||||
| `default_time_value` | Unsigned Int (represents milliseconds) |
|
||||
| `time_delta` | Unsigned Int (represents milliseconds) |
|
||||
| `temperature_type` | String (one of ["k", "f", "c", "kelvin", "fahrenheit", "celsius"]) |
|
||||
| `default_widget_type` | String (one of ["cpu", "proc", "net", "temp", "mem", "disk"], same as layout options) |
|
||||
| `default_widget_count` | Unsigned Int (represents which `default_widget_type`) |
|
||||
|
||||
| Field | Type |
|
||||
| ------------------------ | ------------------------------------------------------------------------------------- |
|
||||
| `hide_avg_cpu` | Boolean |
|
||||
| `dot_marker` | Boolean |
|
||||
| `left_legend` | Boolean |
|
||||
| `current_usage` | Boolean |
|
||||
| `group_processes` | Boolean |
|
||||
| `case_sensitive` | Boolean |
|
||||
| `whole_word` | Boolean |
|
||||
| `regex` | Boolean |
|
||||
| `show_disabled_data` | Boolean |
|
||||
| `basic` | Boolean |
|
||||
| `hide_table_count` | Boolean |
|
||||
| `use_old_network_legend` | Boolean |
|
||||
| `battery` | Boolean |
|
||||
| `rate` | Unsigned Int (represents milliseconds) |
|
||||
| `default_time_value` | Unsigned Int (represents milliseconds) |
|
||||
| `time_delta` | Unsigned Int (represents milliseconds) |
|
||||
| `temperature_type` | String (one of ["k", "f", "c", "kelvin", "fahrenheit", "celsius"]) |
|
||||
| `default_widget_type` | String (one of ["cpu", "proc", "net", "temp", "mem", "disk"], same as layout options) |
|
||||
| `default_widget_count` | Unsigned Int (represents which `default_widget_type`) |
|
||||
|
||||
#### Theming
|
||||
|
||||
|
@ -470,16 +478,17 @@ represents either a _column or a widget_. A column can have any number of `child
|
|||
represents a _widget_. A widget is represented by having a `type` field set to a string.
|
||||
|
||||
The following `type` values are supported:
|
||||
| | |
|
||||
|---------|--------------------------|
|
||||
| `"cpu"` | CPU chart and legend |
|
||||
| `"mem", "memory"` | Memory chart |
|
||||
| `"net", "network"` | Network chart and legend |
|
||||
|
||||
| | |
|
||||
| -------------------------------- | ------------------------ |
|
||||
| `"cpu"` | CPU chart and legend |
|
||||
| `"mem", "memory"` | Memory chart |
|
||||
| `"net", "network"` | Network chart and legend |
|
||||
| `"proc", "process", "processes"` | Process table and search |
|
||||
| `"temp", "temperature"` | Temperature table |
|
||||
| `"disk"` | Disk table |
|
||||
| `"empty"` | An empty space |
|
||||
| `"batt", "battery"` | Battery statistics |
|
||||
| `"temp", "temperature"` | Temperature table |
|
||||
| `"disk"` | Disk table |
|
||||
| `"empty"` | An empty space |
|
||||
| `"batt", "battery"` | Battery statistics |
|
||||
|
||||
Each component of the layout accepts a `ratio` value. If this is not set, it defaults to 1.
|
||||
|
||||
|
@ -564,7 +573,8 @@ Thanks to all contributors ([emoji key](https://allcontributors.org/docs/en/emoj
|
|||
## Thanks
|
||||
|
||||
- This project is very much inspired by both
|
||||
[gotop](https://github.com/cjbassi/gotop) and [gtop](https://github.com/aksakalli/gtop).
|
||||
[gotop](https://github.com/cjbassi/gotop), its successor
|
||||
[ytop](https://github.com/cjbassi/ytop), and [gtop](https://github.com/aksakalli/gtop).
|
||||
|
||||
- Basic mode is heavily inspired by [htop's](https://hisham.hm/htop/) design.
|
||||
|
||||
|
|
|
@ -164,8 +164,7 @@ lazy_static! {
|
|||
}
|
||||
|
||||
// Config and flags
|
||||
pub const DEFAULT_UNIX_CONFIG_FILE_PATH: &str = ".config/bottom/bottom.toml";
|
||||
pub const DEFAULT_WINDOWS_CONFIG_FILE_PATH: &str = "bottom/bottom.toml";
|
||||
pub const DEFAULT_CONFIG_FILE_PATH: &str = "bottom/bottom.toml";
|
||||
|
||||
// Default config file
|
||||
pub const DEFAULT_CONFIG_CONTENT: &str = r##"
|
||||
|
|
48
src/main.rs
48
src/main.rs
|
@ -354,34 +354,50 @@ fn handle_key_event_or_break(
|
|||
fn create_config(flag_config_location: Option<&str>) -> error::Result<Config> {
|
||||
use std::{ffi::OsString, fs};
|
||||
let config_path = if let Some(conf_loc) = flag_config_location {
|
||||
OsString::from(conf_loc)
|
||||
Some(OsString::from(conf_loc))
|
||||
} else if cfg!(target_os = "windows") {
|
||||
if let Some(home_path) = dirs::config_dir() {
|
||||
let mut path = home_path;
|
||||
path.push(DEFAULT_WINDOWS_CONFIG_FILE_PATH);
|
||||
path.into_os_string()
|
||||
path.push(DEFAULT_CONFIG_FILE_PATH);
|
||||
Some(path.into_os_string())
|
||||
} else {
|
||||
OsString::new()
|
||||
None
|
||||
}
|
||||
} else if let Some(home_path) = dirs::home_dir() {
|
||||
let mut path = home_path;
|
||||
// TODO: This should not be done like this IMO... it should be based on the defaults set by dirs rather than home_dir
|
||||
// This WILL cause breaking changes on macOS though, warning!
|
||||
path.push(DEFAULT_UNIX_CONFIG_FILE_PATH);
|
||||
path.into_os_string()
|
||||
path.push(".config/");
|
||||
path.push(DEFAULT_CONFIG_FILE_PATH);
|
||||
if path.exists() {
|
||||
// If it already exists, use the old one.
|
||||
Some(path.into_os_string())
|
||||
} else {
|
||||
// If it does not, use the new one!
|
||||
if let Some(config_path) = dirs::config_dir() {
|
||||
let mut path = config_path;
|
||||
path.push(DEFAULT_CONFIG_FILE_PATH);
|
||||
Some(path.into_os_string())
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
} else {
|
||||
OsString::new()
|
||||
None
|
||||
};
|
||||
|
||||
let path = std::path::Path::new(&config_path);
|
||||
if let Some(config_path) = config_path {
|
||||
let path = std::path::Path::new(&config_path);
|
||||
|
||||
if let Ok(config_string) = fs::read_to_string(path) {
|
||||
Ok(toml::from_str(config_string.as_str())?)
|
||||
} else {
|
||||
if let Some(parent_path) = path.parent() {
|
||||
fs::create_dir_all(parent_path)?;
|
||||
if let Ok(config_string) = fs::read_to_string(path) {
|
||||
Ok(toml::from_str(config_string.as_str())?)
|
||||
} else {
|
||||
if let Some(parent_path) = path.parent() {
|
||||
fs::create_dir_all(parent_path)?;
|
||||
}
|
||||
fs::File::create(path)?.write_all(DEFAULT_CONFIG_CONTENT.as_bytes())?;
|
||||
Ok(toml::from_str(DEFAULT_CONFIG_CONTENT)?)
|
||||
}
|
||||
fs::File::create(path)?.write_all(DEFAULT_CONFIG_CONTENT.as_bytes())?;
|
||||
} else {
|
||||
// Don't write otherwise...
|
||||
Ok(toml::from_str(DEFAULT_CONFIG_CONTENT)?)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue