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.
- 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.

View file

@ -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

View file

@ -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",

View file

@ -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 {

View file

@ -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",