sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

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