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:
Clement Tsang 2020-08-22 12:38:13 -07:00 committed by GitHub
parent c82f4d40b4
commit 3394b9ee66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 118 additions and 111 deletions

View File

@ -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. - [#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 ### Changes
- Added `WASD` as an alternative widget movement system. - 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. - [#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 ### 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. - [#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.

View File

@ -275,20 +275,20 @@ Run using `btm`.
![quote searching](assets/quote_search.png) ![quote searching](assets/quote_search.png)
#### Supported keywords #### Supported search types
Searching without a keyword will search by process or command name (depends on what column is being shown by the current process widget).
| Keywords | Example | Description | | Keywords | Example | Description |
| -------- | ------------------ | ------------------------------------------------------------------------------------------------- | | ------------------- | ------------------ | ------------------------------------------------------------------------------- |
| `pid` | `pid: 1044` | Matches by PID; supports regex and requiring matching the entire PID | | | `btm` | Matches by process or command name; supports regex |
| `cpu` | `cpu > 0.5` | Matches the condition for the CPU column; supports comparison operators | | `pid` | `pid=1044` | Matches by PID; supports regex |
| `memb` | `memb > 1000 b` | Matches the condition for the memory column in terms of bytes; supports comparison operators | | `cpu`, `cpu%` | `cpu > 0.5` | Matches the CPU column; supports comparison operators |
| `mem` | `mem < 0.5` | Matches the condition for the memory column in terms of percent; supports comparison operators | | `memb` | `memb > 1000 b` | Matches the memory column in terms of bytes; supports comparison operators |
| `read` | `read = 1 mb` | Matches the condition for the read/s column in terms of bytes; supports comparison operators | | `mem`, `mem%` | `mem < 0.5` | Matches the memory column in terms of percent; supports comparison operators |
| `write` | `write >= 1 kb` | Matches the condition for the write/s column in terms of bytes; supports comparison operators | | `read`, `r/s` | `read = 1 mb` | Matches the read/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 | | `write`, `w/s` | `write >= 1 kb` | Matches the write/s 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 | | `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 #### Supported comparison operators

View File

@ -38,8 +38,8 @@ impl std::fmt::Display for ProcessSorting {
Mem => "Mem", Mem => "Mem",
ReadPerSecond => "R/s", ReadPerSecond => "R/s",
WritePerSecond => "W/s", WritePerSecond => "W/s",
TotalRead => "Read", TotalRead => "T.Read",
TotalWrite => "Write", TotalWrite => "T.Write",
State => "State", State => "State",
ProcessName => "Name", ProcessName => "Name",
Command => "Command", Command => "Command",

View File

@ -258,7 +258,7 @@ impl ProcessQuery for ProcWidgetState {
compare_prefix: None, compare_prefix: None,
}) })
} }
PrefixType::Pid => { PrefixType::Pid | PrefixType::State => {
// We have to check if someone put an "="... // We have to check if someone put an "="...
if content == "=" { if content == "=" {
// Check next string if possible // Check next string if possible
@ -571,6 +571,7 @@ pub enum PrefixType {
TRead, TRead,
TWrite, TWrite,
Name, Name,
State,
__Nonexhaustive, __Nonexhaustive,
} }
@ -581,17 +582,18 @@ impl std::str::FromStr for PrefixType {
use PrefixType::*; use PrefixType::*;
let lower_case = s.to_lowercase(); 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. // for now as it causes help to be clogged.
match lower_case.as_str() { match lower_case.as_str() {
"cpu" => Ok(PCpu), "cpu" | "cpu%" => Ok(PCpu),
"mem" => Ok(PMem), "mem" | "mem%" => Ok(PMem),
"memb" => Ok(MemBytes), "memb" => Ok(MemBytes),
"read" => Ok(Rps), "read" | "r/s" => Ok(Rps),
"write" => Ok(Wps), "write" | "w/s" => Ok(Wps),
"tread" => Ok(TRead), "tread" | "t.read" => Ok(TRead),
"twrite" => Ok(TWrite), "twrite" | "t.write" => Ok(TWrite),
"pid" => Ok(Pid), "pid" => Ok(Pid),
"state" => Ok(State),
_ => Ok(Name), _ => Ok(Name),
} }
} }
@ -618,7 +620,7 @@ impl Prefix {
} else if let Some((prefix_type, query_content)) = &mut self.regex_prefix { } else if let Some((prefix_type, query_content)) = &mut self.regex_prefix {
if let StringQuery::Value(regex_string) = query_content { if let StringQuery::Value(regex_string) = query_content {
match prefix_type { match prefix_type {
PrefixType::Pid | PrefixType::Name => { PrefixType::Pid | PrefixType::Name | PrefixType::State => {
let escaped_regex: String; let escaped_regex: String;
let final_regex_string = &format!( let final_regex_string = &format!(
"{}{}{}{}", "{}{}{}{}",
@ -667,6 +669,7 @@ impl Prefix {
match prefix_type { match prefix_type {
PrefixType::Name => r.is_match(process.name.as_str()), PrefixType::Name => r.is_match(process.name.as_str()),
PrefixType::Pid => r.is_match(process.pid.to_string().as_str()), PrefixType::Pid => r.is_match(process.pid.to_string().as_str()),
PrefixType::State => r.is_match(process.process_state.as_str()),
_ => true, _ => true,
} }
} else { } else {

View File

@ -107,7 +107,7 @@ pub const PROCESS_HELP_TEXT: [&str; 12] = [
"% Toggle between values and percentages for memory usage", "% 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", "4 - Process search widget\n",
"Tab Toggle between searching for PID and name\n", "Tab Toggle between searching for PID and name\n",
"Esc Close the search widget (retains the filter)\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", "Left, Alt-h Move cursor left\n",
"Right, Alt-l Move cursor right\n", "Right, Alt-l Move cursor right\n",
"\n", "\n",
"Search keywords:\n", "Supported search types:\n",
"<by name/cmd> ex: btm\n",
"pid ex: pid 825\n", "pid ex: pid 825\n",
"cpu ex: cpu > 4.2\n", "cpu, cpu% ex: cpu > 4.2\n",
"mem ex: mem < 4.2\n", "mem, mem% ex: mem < 4.2\n",
"memb ex: memb < 100 kb\n", "memb ex: memb < 100 kb\n",
"read ex: read >= 1 b\n", "read, r/s ex: read >= 1 b\n",
"write ex: write <= 1 tb\n", "write, w/s ex: write <= 1 tb\n",
"tread ex: tread = 1\n", "tread, t.read ex: tread = 1\n",
"twrite ex: twrite = 1\n", "twrite, t.write ex: twrite = 1\n",
"state ex: state = running\n",
"\n", "\n",
"Comparison operators:\n", "Comparison operators:\n",
"= ex: cpu = 1\n", "= ex: cpu = 1\n",