mirror of
https://github.com/ClementTsang/bottom
synced 2024-11-12 23:47:17 +00:00
feature: allow searching by state, add more keyword variants
Allows searching by state (`state = sleep`), and adds more keyword variants for searching: `cpu%`, `mem%`, `r/s`, `w/s`, matching the columns.
This commit is contained in:
parent
c82f4d40b4
commit
3394b9ee66
5 changed files with 118 additions and 111 deletions
|
@ -15,6 +15,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
- [#183](https://github.com/ClementTsang/bottom/pull/183): Added sorting capabilities to any column.
|
||||
|
||||
- Add (estimated) memory usage values, toggle this from percent to values for processes with `%`.
|
||||
|
||||
- Support searching processes by process state.
|
||||
|
||||
### Changes
|
||||
|
||||
- Added `WASD` as an alternative widget movement system.
|
||||
|
@ -43,8 +47,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
|
||||
- [#114](https://github.com/ClementTsang/bottom/pull/114): Show process state per process (originally in 0.4.0, moved to later). This only shows if the processes are not merged together; I couldn't think of a nice way to show it when grouped together, unfortunately.
|
||||
|
||||
- Add (estimated) memory usage values, toggle this from percent to values for processes with `%`.
|
||||
|
||||
### Changes
|
||||
|
||||
- [#156](https://github.com/ClementTsang/bottom/issues/156) - Removal of the `/` CPU core showing in the chart. It felt clunky to use, was not really useful, and hard to work with with large core counts.
|
||||
|
|
24
README.md
24
README.md
|
@ -275,20 +275,20 @@ Run using `btm`.
|
|||
|
||||
![quote searching](assets/quote_search.png)
|
||||
|
||||
#### Supported keywords
|
||||
|
||||
Searching without a keyword will search by process or command name (depends on what column is being shown by the current process widget).
|
||||
#### Supported search types
|
||||
|
||||
| Keywords | Example | Description |
|
||||
| -------- | ------------------ | ------------------------------------------------------------------------------------------------- |
|
||||
| `pid` | `pid: 1044` | Matches by PID; supports regex and requiring matching the entire PID |
|
||||
| `cpu` | `cpu > 0.5` | Matches the condition for the CPU column; supports comparison operators |
|
||||
| `memb` | `memb > 1000 b` | Matches the condition for the memory column in terms of bytes; supports comparison operators |
|
||||
| `mem` | `mem < 0.5` | Matches the condition for the memory column in terms of percent; supports comparison operators |
|
||||
| `read` | `read = 1 mb` | Matches the condition for the read/s column in terms of bytes; supports comparison operators |
|
||||
| `write` | `write >= 1 kb` | Matches the condition for the write/s column in terms of bytes; supports comparison operators |
|
||||
| `tread` | `tread <= 1024 gb` | Matches the condition for the total read column in terms of bytes; supports comparison operators |
|
||||
| `twrite` | `twrite > 1024 tb` | Matches the condition for the total write column in terms of bytes; supports comparison operators |
|
||||
| ------------------- | ------------------ | ------------------------------------------------------------------------------- |
|
||||
| | `btm` | Matches by process or command name; supports regex |
|
||||
| `pid` | `pid=1044` | Matches by PID; supports regex |
|
||||
| `cpu`, `cpu%` | `cpu > 0.5` | Matches the CPU column; supports comparison operators |
|
||||
| `memb` | `memb > 1000 b` | Matches the memory column in terms of bytes; supports comparison operators |
|
||||
| `mem`, `mem%` | `mem < 0.5` | Matches the memory column in terms of percent; supports comparison operators |
|
||||
| `read`, `r/s` | `read = 1 mb` | Matches the read/s column in terms of bytes; supports comparison operators |
|
||||
| `write`, `w/s` | `write >= 1 kb` | Matches the write/s column in terms of bytes; supports comparison operators |
|
||||
| `tread`, `t.read` | `tread <= 1024 gb` | Matches he total read column in terms of bytes; supports comparison operators |
|
||||
| `twrite`, `t.write` | `twrite > 1024 tb` | Matches the total write column in terms of bytes; supports comparison operators |
|
||||
| `state` | `state=running` | Matches by state; supports regex |
|
||||
|
||||
#### Supported comparison operators
|
||||
|
||||
|
|
|
@ -38,8 +38,8 @@ impl std::fmt::Display for ProcessSorting {
|
|||
Mem => "Mem",
|
||||
ReadPerSecond => "R/s",
|
||||
WritePerSecond => "W/s",
|
||||
TotalRead => "Read",
|
||||
TotalWrite => "Write",
|
||||
TotalRead => "T.Read",
|
||||
TotalWrite => "T.Write",
|
||||
State => "State",
|
||||
ProcessName => "Name",
|
||||
Command => "Command",
|
||||
|
|
|
@ -258,7 +258,7 @@ impl ProcessQuery for ProcWidgetState {
|
|||
compare_prefix: None,
|
||||
})
|
||||
}
|
||||
PrefixType::Pid => {
|
||||
PrefixType::Pid | PrefixType::State => {
|
||||
// We have to check if someone put an "="...
|
||||
if content == "=" {
|
||||
// Check next string if possible
|
||||
|
@ -571,6 +571,7 @@ pub enum PrefixType {
|
|||
TRead,
|
||||
TWrite,
|
||||
Name,
|
||||
State,
|
||||
__Nonexhaustive,
|
||||
}
|
||||
|
||||
|
@ -581,17 +582,18 @@ impl std::str::FromStr for PrefixType {
|
|||
use PrefixType::*;
|
||||
|
||||
let lower_case = s.to_lowercase();
|
||||
// Didn't add %cpu, %mem, mem_bytes, total_read, and total_write
|
||||
// Didn't add mem_bytes, total_read, and total_write
|
||||
// for now as it causes help to be clogged.
|
||||
match lower_case.as_str() {
|
||||
"cpu" => Ok(PCpu),
|
||||
"mem" => Ok(PMem),
|
||||
"cpu" | "cpu%" => Ok(PCpu),
|
||||
"mem" | "mem%" => Ok(PMem),
|
||||
"memb" => Ok(MemBytes),
|
||||
"read" => Ok(Rps),
|
||||
"write" => Ok(Wps),
|
||||
"tread" => Ok(TRead),
|
||||
"twrite" => Ok(TWrite),
|
||||
"read" | "r/s" => Ok(Rps),
|
||||
"write" | "w/s" => Ok(Wps),
|
||||
"tread" | "t.read" => Ok(TRead),
|
||||
"twrite" | "t.write" => Ok(TWrite),
|
||||
"pid" => Ok(Pid),
|
||||
"state" => Ok(State),
|
||||
_ => Ok(Name),
|
||||
}
|
||||
}
|
||||
|
@ -618,7 +620,7 @@ impl Prefix {
|
|||
} else if let Some((prefix_type, query_content)) = &mut self.regex_prefix {
|
||||
if let StringQuery::Value(regex_string) = query_content {
|
||||
match prefix_type {
|
||||
PrefixType::Pid | PrefixType::Name => {
|
||||
PrefixType::Pid | PrefixType::Name | PrefixType::State => {
|
||||
let escaped_regex: String;
|
||||
let final_regex_string = &format!(
|
||||
"{}{}{}{}",
|
||||
|
@ -667,6 +669,7 @@ impl Prefix {
|
|||
match prefix_type {
|
||||
PrefixType::Name => r.is_match(process.name.as_str()),
|
||||
PrefixType::Pid => r.is_match(process.pid.to_string().as_str()),
|
||||
PrefixType::State => r.is_match(process.process_state.as_str()),
|
||||
_ => true,
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -107,7 +107,7 @@ pub const PROCESS_HELP_TEXT: [&str; 12] = [
|
|||
"% Toggle between values and percentages for memory usage",
|
||||
];
|
||||
|
||||
pub const SEARCH_HELP_TEXT: [&str; 44] = [
|
||||
pub const SEARCH_HELP_TEXT: [&str; 46] = [
|
||||
"4 - Process search widget\n",
|
||||
"Tab Toggle between searching for PID and name\n",
|
||||
"Esc Close the search widget (retains the filter)\n",
|
||||
|
@ -122,15 +122,17 @@ pub const SEARCH_HELP_TEXT: [&str; 44] = [
|
|||
"Left, Alt-h Move cursor left\n",
|
||||
"Right, Alt-l Move cursor right\n",
|
||||
"\n",
|
||||
"Search keywords:\n",
|
||||
"Supported search types:\n",
|
||||
"<by name/cmd> ex: btm\n",
|
||||
"pid ex: pid 825\n",
|
||||
"cpu ex: cpu > 4.2\n",
|
||||
"mem ex: mem < 4.2\n",
|
||||
"cpu, cpu% ex: cpu > 4.2\n",
|
||||
"mem, mem% ex: mem < 4.2\n",
|
||||
"memb ex: memb < 100 kb\n",
|
||||
"read ex: read >= 1 b\n",
|
||||
"write ex: write <= 1 tb\n",
|
||||
"tread ex: tread = 1\n",
|
||||
"twrite ex: twrite = 1\n",
|
||||
"read, r/s ex: read >= 1 b\n",
|
||||
"write, w/s ex: write <= 1 tb\n",
|
||||
"tread, t.read ex: tread = 1\n",
|
||||
"twrite, t.write ex: twrite = 1\n",
|
||||
"state ex: state = running\n",
|
||||
"\n",
|
||||
"Comparison operators:\n",
|
||||
"= ex: cpu = 1\n",
|
||||
|
|
Loading…
Reference in a new issue