From ec641d4de21789cd9562908b6789857254727493 Mon Sep 17 00:00:00 2001 From: Isak Date: Fri, 19 Jan 2024 11:07:47 +0100 Subject: [PATCH] Add ctrl+u/d/b/f vim keys (#582) Ctrl+u/d = fast scroll up/down Ctrl+b/f = page up/down --- src/btop_config.cpp | 2 +- src/btop_draw.cpp | 19 +++++++++++++++++-- src/btop_input.cpp | 6 +++++- src/btop_menu.cpp | 2 ++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/btop_config.cpp b/src/btop_config.cpp index 18e60ae..9f12b91 100644 --- a/src/btop_config.cpp +++ b/src/btop_config.cpp @@ -63,7 +63,7 @@ namespace Config { "#* Use whitespace \" \" as separator between different presets.\n" "#* Example: \"cpu:0:default,mem:0:tty,proc:1:default cpu:0:braille,proc:0:tty\""}, - {"vim_keys", "#* Set to True to enable \"h,j,k,l,g,G\" keys for directional control in lists.\n" + {"vim_keys", "#* Set to True to enable \"h,j,k,l,g,G,ctrl+u/d/b/f\" keys for directional control in lists.\n" "#* Conflicting keys for h:\"help\" and k:\"kill\" is accessible while holding shift."}, {"rounded_corners", "#* Rounded corners on boxes, is ignored if TTY mode is ON."}, diff --git a/src/btop_draw.cpp b/src/btop_draw.cpp index acab14c..c972f0b 100644 --- a/src/btop_draw.cpp +++ b/src/btop_draw.cpp @@ -1501,11 +1501,11 @@ namespace Proc { } else selected++; } - else if (cmd_key == "page_up") { + else if (cmd_key == "page_up" or (vim_keys and cmd_key == "ctrl+b")) { if (selected > 0 and start == 0) selected = 0; else start = max(0, start - select_max); } - else if (cmd_key == "page_down") { + else if (cmd_key == "page_down" or (vim_keys and cmd_key == "ctrl+f")) { if (selected > 0 and start >= numpids - select_max) selected = select_max; else start = clamp(start + select_max, 0, max(0, numpids - select_max)); } @@ -1517,6 +1517,21 @@ namespace Proc { start = max(0, numpids - select_max); if (selected > 0) selected = select_max; } + else if (vim_keys and cmd_key == "ctrl+u") { + if (start > 0 and selected <= 10) { + start = max(0, start - 10); + } + else selected = max(0, selected - 10); + if (Config::getI("proc_last_selected") > 0) Config::set("proc_last_selected", 0); + } + else if (vim_keys and cmd_key == "ctrl+d") { + if (start < numpids - select_max and selected == select_max) start += 10; + else if (selected == 0 and last_selected > 0) { + selected = last_selected; + Config::set("proc_last_selected", 0); + } + else selected += 10; + } else if (cmd_key.starts_with("mousey")) { int mouse_y = std::stoi(cmd_key.substr(6)); start = clamp((int)round((double)mouse_y * (numpids - select_max - 2) / (select_max - 2)), 0, max(0, numpids - select_max)); diff --git a/src/btop_input.cpp b/src/btop_input.cpp index fbbae58..4602c47 100644 --- a/src/btop_input.cpp +++ b/src/btop_input.cpp @@ -65,6 +65,10 @@ namespace Input { {"[6~", "page_down"}, {"\t", "tab"}, {"[Z", "shift_tab"}, + {"\x15", "ctrl+u"}, + {"\x04", "ctrl+d"}, + {"\x06", "ctrl+f"}, + {"\x02", "ctrl+b"}, {"OP", "f1"}, {"OQ", "f2"}, {"OR", "f3"}, @@ -407,7 +411,7 @@ namespace Input { Menu::show(Menu::Menus::SignalChoose); return; } - else if (is_in(key, "up", "down", "page_up", "page_down", "home", "end") or (vim_keys and is_in(key, "j", "k", "g", "G"))) { + else if (is_in(key, "up", "down", "page_up", "page_down", "home", "end") or (vim_keys and is_in(key, "j", "k", "g", "G", "ctrl+d", "ctrl+u", "ctrl+f", "ctrl+b"))) { proc_mouse_scroll: redraw = false; auto old_selected = Config::getI("proc_selected"); diff --git a/src/btop_menu.cpp b/src/btop_menu.cpp index fb119aa..dfa6ba3 100644 --- a/src/btop_menu.cpp +++ b/src/btop_menu.cpp @@ -246,6 +246,8 @@ namespace Menu { "Enable vim keys.", "Set to True to enable \"h,j,k,l\" keys for", "directional control in lists.", + "Also enables ctrl + u/d for quicker scrolling", + "and ctrl + b/f for page up/down.", "", "Conflicting keys for", "h (help) and k (kill)",