move to the prev/next header with Alt + n/p - iomenu - interactive terminal-based selection menu
(HTM) git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
(DIR) LICENSE
---
(DIR) commit e72aa011e805f26becc50b68673bad057a743c39
(DIR) parent 49b2a2f664d47cd98352daf4068933ae56633cf7
(HTM) Author: Josuah Demangeon <mail@josuah.net>
Date: Sat, 5 May 2018 23:03:27 +0200
move to the prev/next header with Alt + n/p
Diffstat:
M iomenu.1 | 5 ++++-
M iomenu.c | 34 +++++++++++++++++++++++++++----
2 files changed, 34 insertions(+), 5 deletions(-)
---
(DIR) diff --git a/iomenu.1 b/iomenu.1
@@ -40,11 +40,14 @@ An active selection is highlighted, and can be controlled with keybindings.
As printable keys are entered, the lines are filtered to match each
word from the input.
.
-.Bl -tag -width XXXXXXXXXXXXXXX
+.Bl -tag -width 6n
.
.It Ic Up Ns , Ic Down Ns , Ic Ctrl + p Ns , Ic Ctrl + n
Move selection to the previous/next item.
.
+.It Ic Alt + p Ns , Ic Alt + n
+Move selection to the previous/next header.
+.
.It Ic PageUp Ns , Ic PageDown Ns , Ic Alt + v Ns , Ic Ctrl + v
Move one page up or down.
.
(DIR) diff --git a/iomenu.c b/iomenu.c
@@ -124,15 +124,15 @@ read_stdin(void)
}
static void
-move(int direction)
+move(int sign)
{
extern char **matchv;
extern int matchc;
int i;
- for (i = cur + direction; 0 <= i && i < matchc; i += direction) {
- if (!hsflag || matchv[i][0] != '#') {
+ for (i = cur + sign; 0 <= i && i < matchc; i += sign) {
+ if (hsflag == 0 || matchv[i][0] != '#') {
cur = i;
break;
}
@@ -180,7 +180,7 @@ static void
move_page(signed int sign)
{
extern struct winsize ws;
- extern int matchc;
+ extern int matchc, cur;
int i, rows;
@@ -193,6 +193,26 @@ move_page(signed int sign)
}
static void
+move_header(signed int sign)
+{
+ extern char **matchv;
+ extern int matchc, cur;
+
+ move(sign);
+ if (hsflag == 0)
+ return;
+ for (cur += sign; 0 <= cur; cur += sign) {
+ if (cur >= matchc) {
+ cur--;
+ break;
+ }
+ if (matchv[cur][0] == '#')
+ break;
+ }
+ move(+1);
+}
+
+static void
remove_word()
{
extern char input[LINE_MAX];
@@ -277,10 +297,16 @@ top:
case CTL('P'):
move(-1);
break;
+ case ALT('p'):
+ move_header(-1);
+ break;
case CSI('B'): /* down */
case CTL('N'):
move(+1);
break;
+ case ALT('n'):
+ move_header(+1);
+ break;
case CSI('5'): /* page up */
if (getkey() != '~')
break;