st-scrollback-mark-0.9.2.diff (2933B)
1 From eed328240d04caedfaeef83342cf219758e20ded Mon Sep 17 00:00:00 2001 2 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= <nabijaczleweli@nabijaczleweli.xyz> 3 Date: Sat, 6 Jul 2024 01:00:30 +0200 4 Subject: [PATCH] Add \e[ m escape to mark a line. Ctrl+PgUp/+PgDn scroll to 5 marked lines 6 7 Primarily useful for C++ enthusiasts so if you get a megabyte of errors 8 you can go back to the first one 9 10 Recommended usage: PS1="$PS1\e[ m" 11 12 Ref: https://101010.pl/@atax1a@infosec.exchange/112734806523834451 13 --- 14 config.def.h | 2 ++ 15 st.c | 41 +++++++++++++++++++++++++++++++++++++++++ 16 st.h | 3 +++ 17 3 files changed, 46 insertions(+) 18 19 diff --git a/config.def.h b/config.def.h 20 index fc3079e..5bf8132 100644 21 --- a/config.def.h 22 +++ b/config.def.h 23 @@ -226,7 +226,9 @@ static Shortcut shortcuts[] = { 24 { ShiftMask, XK_Insert, selpaste, {.i = 0} }, 25 { TERMMOD, XK_Num_Lock, numlock, {.i = 0} }, 26 { ShiftMask, XK_Page_Up, kscrollup, {.i = -1} }, 27 + { ControlMask, XK_Page_Up, kscrolltoprevmark }, 28 { ShiftMask, XK_Page_Down, kscrolldown, {.i = -1} }, 29 + { ControlMask, XK_Page_Down, kscrolltonextmark }, 30 { TERMMOD, XK_I, iso14755, {.i = 0} }, 31 }; 32 33 diff --git a/st.c b/st.c 34 index ddd14c1..353d6c6 100644 35 --- a/st.c 36 +++ b/st.c 37 @@ -1104,6 +1104,44 @@ kscrollup(const Arg* a) 38 } 39 } 40 41 +void 42 +kscrolltonextmark(const Arg* a) 43 +{ 44 + int orig_scr = term.scr; 45 + 46 + while (--term.scr >= 0) 47 + if (TLINE(0)->mode & ATTR_MARKED) { 48 + found: 49 + if (term.scr != orig_scr) { 50 + selscroll(0, term.scr - orig_scr); 51 + tfulldirt(); 52 + } 53 + return; 54 + } 55 + 56 + term.scr = 0; 57 + for(int i = 0; i < term.row; ++i) 58 + if (TLINE(i)->mode & ATTR_MARKED) 59 + goto found; 60 + 61 + term.scr = orig_scr; 62 +} 63 + 64 +void 65 +kscrolltoprevmark(const Arg* a) 66 +{ 67 + int orig_scr = term.scr; 68 + 69 + while (++term.scr <= HISTSIZE) 70 + if (TLINE(0)->mode & ATTR_MARKED) { 71 + selscroll(0, term.scr - orig_scr); 72 + tfulldirt(); 73 + return; 74 + } 75 + 76 + term.scr = orig_scr; 77 +} 78 + 79 void 80 tscrolldown(int orig, int n, int copyhist) 81 { 82 @@ -1881,6 +1919,9 @@ csihandle(void) 83 if (xsetcursor(csiescseq.arg[0])) 84 goto unknown; 85 break; 86 + case 'm': /* mark line to quickly scroll back to later */ 87 + term.line[term.c.y]->mode |= ATTR_MARKED; 88 + break; 89 default: 90 goto unknown; 91 } 92 diff --git a/st.h b/st.h 93 index 9dba57d..469e5c4 100644 94 --- a/st.h 95 +++ b/st.h 96 @@ -35,6 +35,7 @@ enum glyph_attribute { 97 ATTR_WDUMMY = 1 << 10, 98 ATTR_BOXDRAW = 1 << 11, 99 ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, 100 + ATTR_MARKED = 1 << 12, 101 }; 102 103 enum selection_mode { 104 @@ -84,6 +85,8 @@ void draw(void); 105 106 void kscrolldown(const Arg *); 107 void kscrollup(const Arg *); 108 +void kscrolltonextmark(const Arg *); 109 +void kscrolltoprevmark(const Arg *); 110 void iso14755(const Arg *); 111 void printscreen(const Arg *); 112 void printsel(const Arg *); 113 -- 114 2.39.2 115