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
#### 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 |
| -------- | ------------------ | ------------------------------------------------------------------------------------------------- |
| `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 |
| Keywords | Example | Description |
| ------------------- | ------------------ | ------------------------------------------------------------------------------- |
| | `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

@ -55,123 +55,125 @@ pub const HELP_CONTENTS_TEXT: [&str; 8] = [
pub const GENERAL_HELP_TEXT: [&str; 29] = [
"1 - General\n",
"q, Ctrl-c Quit\n",
"Esc Close dialog windows, search, widgets, or exit expanded mode\n",
"Ctrl-r Reset display and any collected data\n",
"f Freeze/unfreeze updating with new data\n",
"Ctrl-Left, \n",
"Shift-Left, Move widget selection left\n",
"H, A \n",
"Ctrl-Right, \n",
"Shift-Right, Move widget selection right\n",
"L, D \n",
"Ctrl-Up, \n",
"Shift-Up, Move widget selection up\n",
"K, W \n",
"Ctrl-Down, \n",
"Shift-Down, Move widget selection down\n",
"J, S \n",
"Left, h Move left within widget\n",
"Down, j Move down within widget\n",
"Up, k Move up within widget\n",
"Right, l Move right within widget\n",
"? Open help menu\n",
"gg Jump to the first entry\n",
"G Jump to the last entry\n",
"e Expand the currently selected widget\n",
"+ Zoom in on chart (decrease time range)\n",
"- Zoom out on chart (increase time range)\n",
"= Reset zoom\n",
"Mouse scroll Scroll through the tables or zoom in/out of charts by scrolling up/down",
"q, Ctrl-c Quit\n",
"Esc Close dialog windows, search, widgets, or exit expanded mode\n",
"Ctrl-r Reset display and any collected data\n",
"f Freeze/unfreeze updating with new data\n",
"Ctrl-Left, \n",
"Shift-Left, Move widget selection left\n",
"H, A \n",
"Ctrl-Right, \n",
"Shift-Right, Move widget selection right\n",
"L, D \n",
"Ctrl-Up, \n",
"Shift-Up, Move widget selection up\n",
"K, W \n",
"Ctrl-Down, \n",
"Shift-Down, Move widget selection down\n",
"J, S \n",
"Left, h Move left within widget\n",
"Down, j Move down within widget\n",
"Up, k Move up within widget\n",
"Right, l Move right within widget\n",
"? Open help menu\n",
"gg Jump to the first entry\n",
"G Jump to the last entry\n",
"e Expand the currently selected widget\n",
"+ Zoom in on chart (decrease time range)\n",
"- Zoom out on chart (increase time range)\n",
"= Reset zoom\n",
"Mouse scroll Scroll through the tables or zoom in/out of charts by scrolling up/down",
];
pub const CPU_HELP_TEXT: [&str; 2] = [
"2 - CPU widget\n",
"Mouse scroll Scrolling over an CPU core/average shows only that entry on the chart",
"Mouse scroll Scrolling over an CPU core/average shows only that entry on the chart",
];
// TODO [Help]: Search in help?
// TODO [Help]: Move to using tables for easier formatting?
pub const PROCESS_HELP_TEXT: [&str; 12] = [
"3 - Process widget\n",
"dd Kill the selected process\n",
"c Sort by CPU usage, press again to reverse sorting order\n",
"m Sort by memory usage, press again to reverse sorting order\n",
"p Sort by PID name, press again to reverse sorting order\n",
"n Sort by process name, press again to reverse sorting order\n",
"Tab Group/un-group processes with the same name\n",
"Ctrl-f, / Open process search widget\n",
"P Toggle between showing the full path or just the process name\n",
"s, F6 Open process sort widget\n",
"I Invert current sort\n",
"% Toggle between values and percentages for memory usage",
"dd Kill the selected process\n",
"c Sort by CPU usage, press again to reverse sorting order\n",
"m Sort by memory usage, press again to reverse sorting order\n",
"p Sort by PID name, press again to reverse sorting order\n",
"n Sort by process name, press again to reverse sorting order\n",
"Tab Group/un-group processes with the same name\n",
"Ctrl-f, / Open process search widget\n",
"P Toggle between showing the full path or just the process name\n",
"s, F6 Open process sort widget\n",
"I Invert current sort\n",
"% 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",
"Ctrl-a Skip to the start of the search query\n",
"Ctrl-e Skip to the end of the search query\n",
"Ctrl-u Clear the current search query\n",
"Backspace Delete the character behind the cursor\n",
"Delete Delete the character at the cursor\n",
"Alt-c/F1 Toggle matching case\n",
"Alt-w/F2 Toggle matching the entire word\n",
"Alt-r/F3 Toggle using regex\n",
"Left, Alt-h Move cursor left\n",
"Right, Alt-l Move cursor right\n",
"Tab Toggle between searching for PID and name\n",
"Esc Close the search widget (retains the filter)\n",
"Ctrl-a Skip to the start of the search query\n",
"Ctrl-e Skip to the end of the search query\n",
"Ctrl-u Clear the current search query\n",
"Backspace Delete the character behind the cursor\n",
"Delete Delete the character at the cursor\n",
"Alt-c/F1 Toggle matching case\n",
"Alt-w/F2 Toggle matching the entire word\n",
"Alt-r/F3 Toggle using regex\n",
"Left, Alt-h Move cursor left\n",
"Right, Alt-l Move cursor right\n",
"\n",
"Search keywords:\n",
"pid ex: pid 825\n",
"cpu ex: cpu > 4.2\n",
"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",
"Supported search types:\n",
"<by name/cmd> ex: btm\n",
"pid ex: pid 825\n",
"cpu, cpu% ex: cpu > 4.2\n",
"mem, mem% ex: mem < 4.2\n",
"memb ex: memb < 100 kb\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",
"> ex: cpu > 1\n",
"< ex: cpu < 1\n",
">= ex: cpu >= 1\n",
"<= ex: cpu <= 1\n",
"= ex: cpu = 1\n",
"> ex: cpu > 1\n",
"< ex: cpu < 1\n",
">= ex: cpu >= 1\n",
"<= ex: cpu <= 1\n",
"\n",
"Logical operators:\n",
"and/&&/<Space> ex: btm and cpu > 1 and mem > 1\n",
"or/|| ex: btm or firefox\n",
"and/&&/<Space> ex: btm and cpu > 1 and mem > 1\n",
"or/|| ex: btm or firefox\n",
"\n",
"Supported units:\n",
"B ex: read > 1 b\n",
"KB ex: read > 1 kb\n",
"MB ex: read > 1 mb\n",
"TB ex: read > 1 tb\n",
"KiB ex: read > 1 kib\n",
"MiB ex: read > 1 mib\n",
"GiB ex: read > 1 gib\n",
"TiB ex: read > 1 tib",
"B ex: read > 1 b\n",
"KB ex: read > 1 kb\n",
"MB ex: read > 1 mb\n",
"TB ex: read > 1 tb\n",
"KiB ex: read > 1 kib\n",
"MiB ex: read > 1 mib\n",
"GiB ex: read > 1 gib\n",
"TiB ex: read > 1 tib",
];
pub const SORT_HELP_TEXT: [&str; 6] = [
"5 - Sort widget\n",
"Down, 'j' Scroll down in list\n",
"Up, 'k' Scroll up in list\n",
"Mouse scroll Scroll through sort widget\n",
"Esc Close the sort widget\n",
"Enter Sort by current selected column",
"Down, 'j' Scroll down in list\n",
"Up, 'k' Scroll up in list\n",
"Mouse scroll Scroll through sort widget\n",
"Esc Close the sort widget\n",
"Enter Sort by current selected column",
];
pub const BATTERY_HELP_TEXT: [&str; 3] = [
"6 - Battery widget\n",
"Left Go to previous battery\n",
"Right Go to next battery",
"Left Go to previous battery\n",
"Right Go to next battery",
];
pub const BASIC_MEM_HELP_TEXT: [&str; 2] = [
"7 - Basic memory widget\n",
"% Toggle between values and percentages for memory usage",
"% Toggle between values and percentages for memory usage",
];
lazy_static! {