From 230f2ba6e10e2c9f7cf0dc5e44666d2fe16d97c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20Hoffst=C3=A4tte?= Date: Sat, 11 Apr 2026 16:30:23 +0200 Subject: [PATCH 01/21] Fix several problems in signal handler autoconf check (#96) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The autoconf check for signal handler behaviour has several problems which lead to extremely confusing error messages and incorrect autoconf behaviour: - RETSIGTYPE is no longer defined because it has long been deprecated; since C89 signal handlers always return void. This causes both a build error and an implicit redefinition to int, leading to more problems. - the test is missing two prototypes for its own functions, which can lead to unexpected failures completely unrelated to signal handling. - very strict compiler settings lead to a warning about an unused function argument in the signal handler. Not critical, but easy to prevent in a portable manner by sinking the signal value into a void expression. With these changes the check compiles cleanly and correctly indicates the expected behaviour to autoconf. Signed-off-by: Holger Hoffstätte --- acinclude.m4 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/acinclude.m4 b/acinclude.m4 index 61d54804..caee1b65 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -59,10 +59,17 @@ AC_DEFUN([joe_REINSTALL_SIGHANDLERS], #include #endif +#ifndef RETSIGTYPE +typedef void RETSIGTYPE; +#endif + #ifndef HAVE_SIGHANDLER_T typedef RETSIGTYPE (*sighandler_t)(int); #endif +void set_signal(int signum, sighandler_t handler); +RETSIGTYPE sigint(int s); + int nsigint; void set_signal(int signum, sighandler_t handler) { @@ -86,6 +93,7 @@ void set_signal(int signum, sighandler_t handler) { } RETSIGTYPE sigint(int s) { + (void)s; nsigint++; } From bca792e639e74c0b2061b5c7d3d53bc6e5dbd715 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Sat, 11 Apr 2026 15:44:16 +0100 Subject: [PATCH 02/21] =?UTF-8?q?Only=20ASCII=20is=20safe=20to=20use=20in?= =?UTF-8?q?=20OSC=208=20link=20text,=20so=20use=20`->`=20instead=20of=20`?= =?UTF-8?q?=E2=86=92`.=20(#92)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Turns out that terminals will render in whatever they think the character set is. `→` will appear as itself or three other characters or one other character (the first of the three) or the pop-up text will be missing. --- joe/bw.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/joe/bw.c b/joe/bw.c index 305f1b1d..53f60a98 100644 --- a/joe/bw.c +++ b/joe/bw.c @@ -410,7 +410,8 @@ static struct state_debug_data out_osc8(const struct state_debug_data *oldstate, ttputs(";"); ttputs(state_names[newstate->name]); if (newstate->recolor && newstate->recolor != newstate->name) { - ttputs("→"); + /* ugh, only ASCII for OSC-8 pop-up text */ + ttputs("->"); ttputs(state_names[newstate->recolor]); } ttputs("\x1B\\"); From fd85065e9b739a68a2a3dd5f6595d81c5b02bde5 Mon Sep 17 00:00:00 2001 From: pcm1k <87557538+pcm1k@users.noreply.github.com> Date: Wed, 15 Apr 2026 10:06:53 -0400 Subject: [PATCH 03/21] fix GLO_OPT_INT issue (#100) --- joe/options.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/joe/options.c b/joe/options.c index b98461a6..bf456cf9 100644 --- a/joe/options.c +++ b/joe/options.c @@ -689,7 +689,7 @@ int glopt(char *s, char *arg, OPTIONS *options, int set) if (set && arg) { val = ztoi(arg); if (val >= opt->low && val <= opt->high) - *opt->set.b = val; + *opt->set.i = val; } ret = arg ? 2 : 1; break; From 922708e3d9f7856c782f649ca284f18bde00dad1 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Thu, 9 Apr 2026 02:54:05 +0100 Subject: [PATCH 04/21] Fix an off-by-one in m4.jsf. --- syntax/m4.jsf | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/syntax/m4.jsf b/syntax/m4.jsf index 24539eae..55ef1bf3 100644 --- a/syntax/m4.jsf +++ b/syntax/m4.jsf @@ -21,7 +21,7 @@ * idle "[" idle recolor=-1 call=.m4(quote -brace) # "[" idle recolor=-1 call=.quote() - "a-zA-Z_" ident buffer mark + "a-zA-Z_" ident_start noeat mark .ifdef quote "]" idle return .endif @@ -37,8 +37,14 @@ * idle noeat return .ifdef quote +:ident_start Constant string + * ident buffer + :ident Constant string .else +:ident_start Ident + * ident buffer + :ident Ident .endif * maybe_macro noeat strings From 0057eef75667e973538e036e63c5bbd257bfcfac Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Tue, 31 Mar 2026 20:37:00 +0100 Subject: [PATCH 05/21] Fix an off-by-one in sh keyword colouring. Noticed because I'd set the Ident colour to yellow. --- syntax/sh.jsf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/syntax/sh.jsf b/syntax/sh.jsf index 2f611dde..0faff5cc 100644 --- a/syntax/sh.jsf +++ b/syntax/sh.jsf @@ -40,7 +40,7 @@ "{}[]" brace recolor=-1 "-" option recolor=-1 "0-9" maybe_base recolor=-1 - "a-zA-Z!_/" ident buffer mark + "a-zA-Z!_/" ident_start mark noeat :brace Brace * idle noeat @@ -257,6 +257,9 @@ done "#" idle "0-9" maybe_base +:ident_start Ident + * ident buffer + :ident Ident * idle noeat strings "!" bang From 2f2a9aff6a0c5fad447ff174bfd6e73519b37e7d Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Tue, 31 Mar 2026 21:29:05 +0100 Subject: [PATCH 06/21] Construct a message when setting certain boolean options. (Fixes a segfault.) --- joe/options.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/joe/options.c b/joe/options.c index bf456cf9..7e6b644a 100644 --- a/joe/options.c +++ b/joe/options.c @@ -317,6 +317,8 @@ struct glopts { ptrdiff_t ofst; /* Local options structure member offset */ int low; /* Low limit for numeric options */ int high; /* High limit for numeric options */ + /* For *_OPT_BOOL, if .yes=NULL or .no=NULL, a message using the menu + * string (if non-NULL) & "ON" or "OFF" will be generated at need */ } glopts[] = { {"overwrite", LOC_OPT_BOOL, { NULL }, (char *) &fdefault.overtype, _("Overtype mode"), _("Insert mode"), _("Overtype mode"), 0, 0, 0 }, {"hex", LOC_OPT_BOOL, { NULL }, (char *) &fdefault.hex, _("Hex edit mode"), _("Text edit mode"), _("Hex edit display mode"), 0, 0, 0 }, @@ -1259,6 +1261,7 @@ static int find_option(char *s) static int applyopt(BW *bw, int *optp, int y, int flg) { int oldval, newval; + const char *msg; oldval = *optp; if (flg == 0) { @@ -1273,8 +1276,18 @@ static int applyopt(BW *bw, int *optp, int y, int flg) } *optp = newval; - msgnw(bw->parent, newval ? joe_gettext(glopts[y].yes) : joe_gettext(glopts[y].no)); + msg = newval ? glopts[y].yes : glopts[y].no; + if (msg) + msgnw(bw->parent, joe_gettext(msg)); + else { + msg = newval ? "ON" : "OFF"; + if (glopts[y].menu) { + joe_snprintf_2(msgbuf, JOE_MSGBUFSIZE, "%s: %s", joe_gettext(glopts[y].menu), msg); + msgnw(bw->parent, msgbuf); + } else + msgnw(bw->parent, msg); + } return oldval; } From e082df13c6cd795e6bc3e38bd01fb7cd8d22fb02 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Sat, 4 Apr 2026 12:45:22 +0100 Subject: [PATCH 07/21] =?UTF-8?q?debian/jsf=20indented=20line=20colouring:?= =?UTF-8?q?=20add=20<=E2=80=A6>,=20fix=20after=20line=20ends?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syntax/debian.jsf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/syntax/debian.jsf b/syntax/debian.jsf index f963e13c..1e285260 100644 --- a/syntax/debian.jsf +++ b/syntax/debian.jsf @@ -211,13 +211,14 @@ done :comma Idle * bad noeat ",|" resume call=.space() # next package - "([" bracketed save_c recolor=-1 # version or arch + "([<" bracketed save_c recolor=-1 # version or arch "\s" comma noeat call=.space() "\n" comma_reset :comma_reset Idle # at line start * NULL return noeat "#" comma_reset noeat call=.comment() "\s" comma call=.space() + "\n" NULL return noeat :subst Brace * bad noeat recolor=-2 @@ -231,6 +232,7 @@ done * NULL return noeat "#" bracket_reset noeat call=.comment() "\s" bracketed call=.space() + "\n" NULL return noeat :bad Bad * bad @@ -239,6 +241,7 @@ done * NULL return noeat "#" bad_reset noeat call=.comment() "\s" bad call=.space() + "\n" NULL return noeat .end # "deb" or "deb-src": old-style sources.list line From 2c97c05c5035c350757b641e30ecb39d4fb66c8e Mon Sep 17 00:00:00 2001 From: jhallen Date: Mon, 20 Apr 2026 12:30:34 -0400 Subject: [PATCH 08/21] Fix tags file security vulnerability (#105) * Fix tags file security vulnerability * Need offset.. --- joe/b.c | 13 +++++++++++++ joe/b.h | 3 +++ joe/main.c | 2 +- joe/uerror.c | 3 +++ joe/utag.c | 2 +- 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/joe/b.c b/joe/b.c index 6e337a52..f0801204 100644 --- a/joe/b.c +++ b/joe/b.c @@ -2513,6 +2513,19 @@ B *bread(int fi, off_t max, int binary) return b; } +/* Return true if filename will be interpreted as something other than a filename by bload() + It would be better to have a flag on bload, but more plumbing required */ + +int hack_check(const char *name) +{ + if (name[0] == '!') + return 1; + else if (name[0] == '>' && name[1] == '>') + return 1; + else + return 0; +} + /* Parse file name. * * Removes ',xxx,yyy' from end of name and puts their value into skip and amnt diff --git a/joe/b.h b/joe/b.h index 0eff9fa2..3d878baf 100644 --- a/joe/b.h +++ b/joe/b.h @@ -345,3 +345,6 @@ int ansi_code(char *s); char *ansi_string(int code); extern int guess_utf16; + +/* Return true if filename will be interpreted as something other than a filename */ +int hack_check(const char *name); diff --git a/joe/main.c b/joe/main.c index d5ba36e5..bcbd3c8f 100644 --- a/joe/main.c +++ b/joe/main.c @@ -754,7 +754,7 @@ int main(int argc, char **real_argv, const char * const *envv) cstart ((BW *)maint->curwin->object, NULL, NULL, NULL, NULL, 0, 1, NULL, SHELL_TYPE_RAW); /* Close stdin, so that if user kills the copying the program feeding stdin sees a SIGPIPE */ /* It won't if there are any extra file descriptors open */ - fclose(stdin); + //fclose(stdin); } } diff --git a/joe/uerror.c b/joe/uerror.c index 5a47c66b..7e37576b 100644 --- a/joe/uerror.c +++ b/joe/uerror.c @@ -471,6 +471,9 @@ int ugparse(W *w, int k) static int jump_to_file_line(BW *bw,char *file,off_t line,char *msg) { int omid; + /* Do not allow shell command! */ + if (hack_check(file)) + return -1; if (!bw->b->name || zcmp(file, bw->b->name)) { if (doswitch(bw->parent, vsdup(file), NULL, NULL)) return -1; diff --git a/joe/utag.c b/joe/utag.c index 03c7296a..765b8d10 100644 --- a/joe/utag.c +++ b/joe/utag.c @@ -222,7 +222,7 @@ static int dotag(W *w, char *s, void *obj, int *notify) ++x; } for (y = x; buf[y] && buf[y] != ' ' && buf[y] != '\t' && buf[y] != '\n'; ++y) ; - if (x != y) { + if (x != y && !hack_check(buf + x)) { /* Do not allow shell commands in tags file! */ char *file = 0; c = buf[y]; buf[y] = 0; From f8e792f336c37b62fa4a7080c72606a7986333cb Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Mon, 20 Apr 2026 17:58:04 +0100 Subject: [PATCH 09/21] Syntax fixes (#104) * debian.jsf: add missing . to allowed characters in package names. * Fix an off-by-one in rust.jsf. --- syntax/debian.jsf | 2 +- syntax/rust.jsf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/syntax/debian.jsf b/syntax/debian.jsf index 1e285260..a36d9852 100644 --- a/syntax/debian.jsf +++ b/syntax/debian.jsf @@ -204,7 +204,7 @@ done :name String # continuation * comma noeat call=.space() - "-\c" name + "-.\c" name "\s" comma noeat call=.space() "\n" comma_reset diff --git a/syntax/rust.jsf b/syntax/rust.jsf index a61d394c..40482bf8 100644 --- a/syntax/rust.jsf +++ b/syntax/rust.jsf @@ -38,7 +38,7 @@ "\"" string recolor=-1 "'" char recolor=-1 "/" slash recolor=-1 - "\i" ident buffer + "\i" ident buffer recolor=-1 :slash Idle * idle noeat From ac085f53a2da8f49c7a61c4fb39e2193be9bf9c9 Mon Sep 17 00:00:00 2001 From: pcm1k <87557538+pcm1k@users.noreply.github.com> Date: Mon, 20 Apr 2026 12:46:23 -0400 Subject: [PATCH 10/21] save filthist to state (#102) --- joe/state.c | 3 +++ joe/ublock.c | 2 +- joe/ublock.h | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/joe/state.c b/joe/state.c index f6fc37f1..02b283c2 100644 --- a/joe/state.c +++ b/joe/state.c @@ -126,6 +126,7 @@ void save_state(void) fprintf(f,"run\n"); save_hist(f,runhist); fprintf(f,"build\n"); save_hist(f,buildhist); fprintf(f,"grep\n"); save_hist(f,grephist); + fprintf(f,"filt\n"); save_hist(f,filthist); fprintf(f,"cmd\n"); save_hist(f,cmdhist); fprintf(f,"math\n"); save_hist(f,mathhist); fprintf(f,"yank\n"); save_yank(f); @@ -188,6 +189,8 @@ void load_state(void) load_hist(f,&buildhist); else if(!zcmp(buf,"grep\n")) load_hist(f,&grephist); + else if(!zcmp(buf,"filt\n")) + load_hist(f,&filthist); else if(!zcmp(buf,"cmd\n")) load_hist(f,&cmdhist); else if(!zcmp(buf,"math\n")) diff --git a/joe/ublock.c b/joe/ublock.c index b1f7d7d5..2e59144a 100644 --- a/joe/ublock.c +++ b/joe/ublock.c @@ -1281,7 +1281,7 @@ static int dofilt(W *w, char *s, void *object, int *notify) return 0; } -static B *filthist = NULL; +B *filthist = NULL; static void markall(BW *bw) { diff --git a/joe/ublock.h b/joe/ublock.h index 593d84ef..7ce0c560 100644 --- a/joe/ublock.h +++ b/joe/ublock.h @@ -48,3 +48,5 @@ int blklr(BW *bw, double *,double *, double *, double *, double *, int, int); char *blkget(BW *bw); extern int autoswap; /* Automatically swap markb and markk if need to make a valid block */ extern int nowmarking; /* Now marking flag (so make block bigger) for Ctrl-arrow key block selection */ + +extern B *filthist; /* Filter command history */ From a7b2993e3ff7dc325d52e95455663f24e9b67135 Mon Sep 17 00:00:00 2001 From: pcm1k <87557538+pcm1k@users.noreply.github.com> Date: Mon, 20 Apr 2026 13:06:40 -0400 Subject: [PATCH 11/21] allow notmod in PW (#103) --- joe/cmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/joe/cmd.c b/joe/cmd.c index a9cd9ee3..50d4f18c 100644 --- a/joe/cmd.c +++ b/joe/cmd.c @@ -139,7 +139,7 @@ const CMD cmds[] = { {"nextw", TYPETW + TYPEPW + TYPEMENU + TYPEQW, unextw, NULL, 1, "prevw"}, {"nextword", TYPETW + TYPEPW + EFIXXCOL, u_goto_next, NULL, 1, "prevword"}, {"nmark", TYPETW + TYPEPW, unmark, NULL, 0, NULL}, - {"notmod", TYPETW, unotmod, NULL, 0, NULL}, + {"notmod", TYPETW + TYPEPW, unotmod, NULL, 0, NULL}, {"nxterr", TYPETW, unxterr, NULL, 1, "prverr"}, {"open", TYPETW + TYPEPW + EFIXXCOL + EMOD, uopen, NULL, 1, "deleol"}, {"parserr", TYPETW, uparserr, NULL, 0, NULL}, From 273f44e5929b497c952bf7a849755730c9180976 Mon Sep 17 00:00:00 2001 From: Joe Allen Date: Mon, 20 Apr 2026 13:46:51 -0400 Subject: [PATCH 12/21] Fix: file does not work if JOE is reading from stdin pipe --- joe/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/joe/main.c b/joe/main.c index bcbd3c8f..6c215a80 100644 --- a/joe/main.c +++ b/joe/main.c @@ -754,7 +754,8 @@ int main(int argc, char **real_argv, const char * const *envv) cstart ((BW *)maint->curwin->object, NULL, NULL, NULL, NULL, 0, 1, NULL, SHELL_TYPE_RAW); /* Close stdin, so that if user kills the copying the program feeding stdin sees a SIGPIPE */ /* It won't if there are any extra file descriptors open */ - //fclose(stdin); + fclose(stdin); + stdin = fopen("/dev/tty", "rb"); } } From 153d31ce5a897b6469552f8f2b6941aa6b842039 Mon Sep 17 00:00:00 2001 From: Joe Allen Date: Mon, 20 Apr 2026 14:06:35 -0400 Subject: [PATCH 13/21] Update NEWS, bump version to 4.8 --- NEWS.md | 31 +++++++++++++++++++++++++++++++ configure.ac | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index bf574dd9..dd9d8bf5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -8,6 +8,37 @@ [Build instructions](INSTALL.md) +### JOE 4.8 + +* Enhancements + + * Allow notmod in prompt windows: if you set it in a macro, this + suppresses adding the prompt to the history. Good for keeping + history clean. + + * Save block filter prompt history in state file. + +* Bugs fixed + + * Fix tags file security vulnerability: Someone could share a tags + file that tricks a user into executing a shell command by using + JOE's '!' filename syntax. This fix prevents '!' from working + when opening files specified in the tags file. + + * Fix some build issues involving deprecated autoconf RETSIGTYPE. + + * Do not use unicode arrow in tooltips for new syntax debugging + feature + + * Fix a number of minor syntax coloring issues: sh, m4, debian, rust + + * Fix integer global option setting issue + + * Prevent segfault when referring to certain boolean options + + * Fix issue where block filtering does not work if JOE is reading + from stdin pipe + ### JOE 4.7 * Enhancements diff --git a/configure.ac b/configure.ac index 085853ac..fec0e57b 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,7 @@ AC_PREREQ([2.64]) AC_CONFIG_MACRO_DIR([m4]) #### Here's the only place where to change version number #### -AC_INIT([joe],[4.7]) +AC_INIT([joe],[4.8]) AC_CONFIG_SRCDIR([joe/b.c]) AC_CANONICAL_BUILD From ef1ca8afe6af0dcb1c423359964368f6bcfcea4b Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Sun, 12 Apr 2026 16:51:43 +0100 Subject: [PATCH 14/21] rtree_opt: don't try to malloc 0 bytes Caught by libefence. --- joe/cclass.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/joe/cclass.c b/joe/cclass.c index 0536a5ab..a2e06d98 100644 --- a/joe/cclass.c +++ b/joe/cclass.c @@ -646,8 +646,8 @@ void rtree_opt(struct Rtree *r) /* De-duplicate leaf nodes (it's not worth bothering with interior nodes) */ - equiv = (int *)joe_malloc(SIZEOF(int) * r->leaf.alloc); - repl = (short *)joe_malloc(SIZEOF(short) * r->leaf.alloc); + equiv = r->leaf.alloc ? (int *)joe_malloc(SIZEOF(int) * r->leaf.alloc) : NULL; + repl = r->leaf.alloc ? (short *)joe_malloc(SIZEOF(short) * r->leaf.alloc) : NULL; /* Create hash table index of all the leaf nodes */ dupcount = 0; From 72590acf9613c9f8304db331628393268a785753 Mon Sep 17 00:00:00 2001 From: jhallen Date: Mon, 20 Apr 2026 15:30:00 -0400 Subject: [PATCH 15/21] Fix selection bugs, make ^Z / ^X consistent (#106) * Fix selection bugs, make ^Z / ^X consistent * Protect all instances of toggle_marking --- joe/uedit.c | 2 ++ rc/jicerc.ru.in | 60 +++++++++++++++++++++++------------------------ rc/joerc.in | 60 +++++++++++++++++++++++------------------------ rc/joerc.zh_TW.in | 60 +++++++++++++++++++++++------------------------ rc/jstarrc.in | 60 +++++++++++++++++++++++------------------------ rc/rjoerc.in | 60 +++++++++++++++++++++++------------------------ 6 files changed, 152 insertions(+), 150 deletions(-) diff --git a/joe/uedit.c b/joe/uedit.c index 5ca6d14d..47c79d87 100644 --- a/joe/uedit.c +++ b/joe/uedit.c @@ -193,6 +193,8 @@ static int p_goto_prev(P *ptr) } else if (joe_isspace(map,c) || joe_ispunct(map,c)) { while ((c=prgetc(p)), (joe_isspace(map,c) || joe_ispunct(map,c))) /* Do nothing */; + if (c != NO_MORE_DATA) + pgetc(p); while(joe_isalnum_(map,(c=prgetc(p)))) /* Do nothing */; if (c != NO_MORE_DATA) diff --git a/rc/jicerc.ru.in b/rc/jicerc.ru.in index 0f310592..4642cb03 100644 --- a/rc/jicerc.ru.in +++ b/rc/jicerc.ru.in @@ -943,20 +943,20 @@ if,"markv",then,blkdel,nmark,else,delw,endif ^[ [ 3 ^ New Shift- -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ a rxvt -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ b -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ c -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ d -uparw,dnarw,begin_marking,pgup,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] -dnarw,uparw,begin_marking,pgdn,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 8 $ Shift-End Mark to eol +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ a rxvt +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ b +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ c +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ d +uparw,dnarw,begin_marking,pgup!,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] +dnarw,uparw,begin_marking,pgdn!,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 8 $ Shift-End Mark to eol if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 ; 2 ~ Ctrl-Del Delete block or line if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 $ dellin ^[ [ 3 ; 2 ~ Shift-Del @@ -967,29 +967,29 @@ yank ^[ [ 2 $ Shift-Ctrl- upslide ^[ [ 1 ; 6 A Shift-Ctrl-Up -uparw,dnarw,begin_marking,bop,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph +uparw,dnarw,begin_marking,bop!,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph dnslide ^[ [ 1 ; 6 B Shift-Ctrl-Down -dnarw,uparw,begin_marking,eop,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph -rtarw,ltarw,begin_marking,nextword,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word -ltarw,rtarw,begin_marking,prevword,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word +dnarw,uparw,begin_marking,eop!,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph +rtarw,ltarw,begin_marking,nextword!,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word +ltarw,rtarw,begin_marking,prevword!,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word Uncomment these if you want JOE to work the old way (Ctrl-cursor marks) - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 5 A Old Gnome-terminal - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ O a Rxvt + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 5 A Old Gnome-terminal + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ O a Rxvt - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 5 B Mark down - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ O b + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 5 B Mark down + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ O b - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 5 C - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ O c + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 5 C + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ O c - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 5 D - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ O d + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 5 D + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ O d paste ^[ [ 2 0 2 ~ Base64 paste (obsolete) ??? brpaste ^[ [ 2 0 0 ~ Bracketed paste diff --git a/rc/joerc.in b/rc/joerc.in index f08ea56e..ec1bbe7e 100644 --- a/rc/joerc.in +++ b/rc/joerc.in @@ -978,20 +978,20 @@ if,"markv",then,blkdel,nmark,else,delw,endif ^[ [ 3 ^ New Shift- -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ a rxvt -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ b -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ c -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ d -uparw,dnarw,begin_marking,pgup,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] -dnarw,uparw,begin_marking,pgdn,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 8 $ Shift-End Mark to eol +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ a rxvt +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ b +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ c +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ d +uparw,dnarw,begin_marking,pgup!,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] +dnarw,uparw,begin_marking,pgdn!,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 8 $ Shift-End Mark to eol if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 ; 2 ~ Ctrl-Del Delete block or line if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 $ dellin ^[ [ 3 ; 2 ~ Shift-Del @@ -1002,29 +1002,29 @@ yank ^[ [ 2 $ Shift-Ctrl- upslide ^[ [ 1 ; 6 A Shift-Ctrl-Up -uparw,dnarw,begin_marking,bop,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph +uparw,dnarw,begin_marking,bop!,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph dnslide ^[ [ 1 ; 6 B Shift-Ctrl-Down -dnarw,uparw,begin_marking,eop,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph -rtarw,ltarw,begin_marking,nextword,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word -ltarw,rtarw,begin_marking,prevword,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word +dnarw,uparw,begin_marking,eop!,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph +rtarw,ltarw,begin_marking,nextword!,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word +ltarw,rtarw,begin_marking,prevword!,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word Uncomment these if you want JOE to work the old way (Ctrl-cursor marks) - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 5 A Old Gnome-terminal - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ O a Rxvt + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 5 A Old Gnome-terminal + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ O a Rxvt - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 5 B Mark down - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ O b + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 5 B Mark down + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ O b - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 5 C - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ O c + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 5 C + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ O c - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 5 D - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ O d + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 5 D + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ O d Extra functions not really part of JOE user interface: diff --git a/rc/joerc.zh_TW.in b/rc/joerc.zh_TW.in index d0e6deea..3e26c50d 100644 --- a/rc/joerc.zh_TW.in +++ b/rc/joerc.zh_TW.in @@ -924,20 +924,20 @@ if,"markv",then,blkdel,nmark,else,delw,endif ^[ [ 3 ^ New Shift- -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ a rxvt -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ b -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ c -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ d -uparw,dnarw,begin_marking,pgup,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] -dnarw,uparw,begin_marking,pgdn,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 8 $ Shift-End Mark to eol +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ a rxvt +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ b +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ c +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ d +uparw,dnarw,begin_marking,pgup!,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] +dnarw,uparw,begin_marking,pgdn!,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 8 $ Shift-End Mark to eol if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 ; 2 ~ Ctrl-Del Delete block or line if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 $ dellin ^[ [ 3 ; 2 ~ Shift-Del @@ -948,29 +948,29 @@ yank ^[ [ 2 $ Shift-Ctrl- upslide ^[ [ 1 ; 6 A Shift-Ctrl-Up -uparw,dnarw,begin_marking,bop,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph +uparw,dnarw,begin_marking,bop!,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph dnslide ^[ [ 1 ; 6 B Shift-Ctrl-Down -dnarw,uparw,begin_marking,eop,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph -rtarw,ltarw,begin_marking,nextword,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word -ltarw,rtarw,begin_marking,prevword,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word +dnarw,uparw,begin_marking,eop!,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph +rtarw,ltarw,begin_marking,nextword!,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word +ltarw,rtarw,begin_marking,prevword!,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word Uncomment these if you want JOE to work the old way (Ctrl-cursor marks) - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 5 A Old Gnome-terminal - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ O a Rxvt + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 5 A Old Gnome-terminal + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ O a Rxvt - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 5 B Mark down - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ O b + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 5 B Mark down + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ O b - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 5 C - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ O c + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 5 C + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ O c - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 5 D - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ O d + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 5 D + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ O d Extra functions not really part of JOE user interface: diff --git a/rc/jstarrc.in b/rc/jstarrc.in index 0efcd1f4..e6adfc5e 100644 --- a/rc/jstarrc.in +++ b/rc/jstarrc.in @@ -840,20 +840,20 @@ if,"markv",then,blkdel,nmark,else,delw,endif ^[ [ 3 ^ New Shift- -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ a rxvt -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ b -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ c -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ d -uparw,dnarw,begin_marking,pgup,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] -dnarw,uparw,begin_marking,pgdn,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 8 $ Shift-End Mark to eol +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ a rxvt +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ b +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ c +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ d +uparw,dnarw,begin_marking,pgup!,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] +dnarw,uparw,begin_marking,pgdn!,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 8 $ Shift-End Mark to eol if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 ; 2 ~ Ctrl-Del Delete block or line if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 $ dellin ^[ [ 3 ; 2 ~ Shift-Del @@ -864,29 +864,29 @@ yank ^[ [ 2 $ Shift-Ctrl- upslide ^[ [ 1 ; 6 A Shift-Ctrl-Up -uparw,dnarw,begin_marking,bop,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph +uparw,dnarw,begin_marking,bop!,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph dnslide ^[ [ 1 ; 6 B Shift-Ctrl-Down -dnarw,uparw,begin_marking,eop,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph -rtarw,ltarw,begin_marking,nextword,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word -ltarw,rtarw,begin_marking,prevword,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word +dnarw,uparw,begin_marking,eop!,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph +rtarw,ltarw,begin_marking,nextword!,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word +ltarw,rtarw,begin_marking,prevword!,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word Uncomment these if you want JOE to work the old way (Ctrl-cursor marks) - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 5 A Old Gnome-terminal - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ O a Rxvt + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 5 A Old Gnome-terminal + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ O a Rxvt - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 5 B Mark down - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ O b + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 5 B Mark down + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ O b - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 5 C - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ O c + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 5 C + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ O c - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 5 D - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ O d + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 5 D + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ O d paste ^[ ] 5 2 ; Base64 paste (obsolete) diff --git a/rc/rjoerc.in b/rc/rjoerc.in index 07b50a3a..d44b3da7 100644 --- a/rc/rjoerc.in +++ b/rc/rjoerc.in @@ -807,20 +807,20 @@ if,"markv",then,blkdel,nmark,else,delw,endif ^[ [ 3 ^ New Shift- -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line -uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ a rxvt -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line -dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ b -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right -rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ c -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left -ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ d -uparw,dnarw,begin_marking,pgup,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] -dnarw,uparw,begin_marking,pgdn,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol -ltarw,rtarw,begin_marking,bol,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol -rtarw,ltarw,begin_marking,eol,toggle_marking ^[ [ 8 $ Shift-End Mark to eol +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 2 A Shift-Up Mark up line +uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ a rxvt +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 2 B Shift-Down Mark down line +dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ b +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 2 C Shift-Right Mark right +rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ c +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 2 D Shift-Left Mark left +ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ d +uparw,dnarw,begin_marking,pgup!,toggle_marking ^[ [ 5 ; 2 ~ Shift-PgUp Mark up page [Usually scrolls back] +dnarw,uparw,begin_marking,pgdn!,toggle_marking ^[ [ 6 ; 2 ~ Shift-PgDn Mark down page [Usually scrolls forward] +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 1 ; 2 H Shift-Home Mark to bol +ltarw,rtarw,begin_marking,bol!,toggle_marking ^[ [ 7 $ Shift-Home Mark to bol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 1 ; 2 F Shift-End Mark to eol +rtarw,ltarw,begin_marking,eol!,toggle_marking ^[ [ 8 $ Shift-End Mark to eol if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 ; 2 ~ Ctrl-Del Delete block or line if,"markv",then,blkdel,nmark,else,dellin,endif ^[ [ 3 $ dellin ^[ [ 3 ; 2 ~ Shift-Del @@ -831,29 +831,29 @@ yank ^[ [ 2 $ Shift-Ctrl- upslide ^[ [ 1 ; 6 A Shift-Ctrl-Up -uparw,dnarw,begin_marking,bop,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph +uparw,dnarw,begin_marking,bop!,toggle_marking ^[ [ 1 ; 6 A Mark up paragraph dnslide ^[ [ 1 ; 6 B Shift-Ctrl-Down -dnarw,uparw,begin_marking,eop,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph -rtarw,ltarw,begin_marking,nextword,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word -ltarw,rtarw,begin_marking,prevword,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word +dnarw,uparw,begin_marking,eop!,toggle_marking ^[ [ 1 ; 6 B Mark down paragraph +rtarw,ltarw,begin_marking,nextword!,toggle_marking ^[ [ 1 ; 6 C Shift-Ctrl-Right Mark right word +ltarw,rtarw,begin_marking,prevword!,toggle_marking ^[ [ 1 ; 6 D Shift-Ctrl-Left Mark left word Uncomment these if you want JOE to work the old way (Ctrl-cursor marks) - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ [ 5 A Old Gnome-terminal - uparw,dnarw,begin_marking,uparw,toggle_marking ^[ O a Rxvt + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 1 ; 5 A Ctrl-Up Mark up line + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ [ 5 A Old Gnome-terminal + uparw,dnarw,begin_marking,uparw!,toggle_marking ^[ O a Rxvt - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ [ 5 B Mark down - dnarw,uparw,begin_marking,dnarw,toggle_marking ^[ O b + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 1 ; 5 B Ctrl-Down Mark down line + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ [ 5 B Mark down + dnarw,uparw,begin_marking,dnarw!,toggle_marking ^[ O b - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ [ 5 C - rtarw,ltarw,begin_marking,rtarw,toggle_marking ^[ O c + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 1 ; 5 C Ctrl-Right Mark right + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ [ 5 C + rtarw,ltarw,begin_marking,rtarw!,toggle_marking ^[ O c - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ [ 5 D - ltarw,rtarw,begin_marking,ltarw,toggle_marking ^[ O d + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 1 ; 5 D Ctrl-Left Mark left + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ [ 5 D + ltarw,rtarw,begin_marking,ltarw!,toggle_marking ^[ O d paste ^[ ] 5 2 ; Base64 paste (obsolete) From 07dc8d5ca50409e45271388f922235d9246935a9 Mon Sep 17 00:00:00 2001 From: Joe Allen Date: Mon, 20 Apr 2026 15:32:42 -0400 Subject: [PATCH 16/21] Update NEWS and copyright date --- NEWS.md | 4 ++++ joe/main.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index dd9d8bf5..4483eb71 100644 --- a/NEWS.md +++ b/NEWS.md @@ -39,6 +39,10 @@ * Fix issue where block filtering does not work if JOE is reading from stdin pipe + * Fix asymmetric ^X / ^Z + + * Fix selection glitches during Ctrl-Shift-Right / -Left + ### JOE 4.7 * Enhancements diff --git a/joe/main.c b/joe/main.c index 6c215a80..8df8174d 100644 --- a/joe/main.c +++ b/joe/main.c @@ -742,7 +742,7 @@ int main(int argc, char **real_argv, const char * const *envv) xmsg = stagen(NULL, (BW *)(lastw(maint)->object), joe_gettext(xmsg), ' '); msgnw(((BASE *)lastw(maint)->object)->parent, xmsg); } else { - joe_snprintf_3(msgbuf,JOE_MSGBUFSIZE,joe_gettext(_("\\i** Joe's Own Editor v%s ** (%s) ** Copyright %s 2015 **\\i")),VERSION,locale_map->name,(locale_map->type ? "©" : "(C)")); + joe_snprintf_3(msgbuf,JOE_MSGBUFSIZE,joe_gettext(_("\\i** Joe's Own Editor v%s ** (%s) ** Copyright %s 1992 - 2026 **\\i")),VERSION,locale_map->name,(locale_map->type ? "©" : "(C)")); msgnw(((BASE *)lastw(maint)->object)->parent, msgbuf); } From 98fda77c0f06c07a1f98df48a2462bc357162ec9 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Tue, 21 Apr 2026 00:49:32 +0100 Subject: [PATCH 17/21] Fix parsing of compiler messages and handle absolute pathnames (#95) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix directory name detection in `make` output GNU make doesn't use backticks in its “Entering directory” text (at least, not these days) and, even with that fixed, the text is localised; different locales can and do use different quotation marks around the directory name. So let's check for the pairs found in relevant lines in the GNU make .po files. As this code seems already hard-wired to check for text output by make and there's little point in checking for localised text (without accessing make's compiled translation files), may as well explicitly check for make, allowing for aliases such as "gmake" and "kmk_gmake". * Compiler messages: don't prepend absolute pathnames with the current directory. * Fix missing/broken cases in makefile directory parsing. * Option to ignore files outside ~/ when parsing compile errors. --- joe/options.c | 1 + joe/uerror.c | 99 +++++++++++++++++++++++++++++++++++++++++---------- joe/uerror.h | 2 ++ rc/joerc.in | 4 +++ 4 files changed, 87 insertions(+), 19 deletions(-) diff --git a/joe/options.c b/joe/options.c index 7e6b644a..4a8def91 100644 --- a/joe/options.c +++ b/joe/options.c @@ -337,6 +337,7 @@ struct glopts { {"menu_explorer", GLO_OPT_BOOL, { &menu_explorer }, NULL, _("Menu explorer mode"), _("Simple completion mode"), _("Menu explorer mode"), 0, 0, 0 }, {"menu_above", GLO_OPT_BOOL, { &menu_above }, NULL, _("Menu above prompt"), _("Menu below prompt"), _("Menu above/below mode"), 0, 0, 0 }, {"notagsmenu", GLO_OPT_BOOL, { ¬agsmenu }, NULL, _("Tags menu disabled"), _("Tags menu enabled"), _("Tags menu mode"), 0, 0, 0 }, + {"parserr_homeonly", GLO_OPT_BOOL, { &parserr_homeonly }, NULL, 0, 0, _("Error logs: home dir only"), 0, 0, 0 }, {"search_prompting", GLO_OPT_BOOL, { &pico }, NULL, _("Search prompting on"), _("Search prompting off"), _("Search prompting mode"), 0, 0, 0 }, {"menu_jump", GLO_OPT_BOOL, { &menu_jump }, NULL, _("Jump into menu is on"), _("Jump into menu is off"), _("Jump into menu mode"), 0, 0, 0 }, {"autoswap", GLO_OPT_BOOL, { &autoswap }, NULL, _("Autoswap ^KB and ^KK"), _("Autoswap off "), _("Autoswap mode "), 0, 0, 0 }, diff --git a/joe/uerror.c b/joe/uerror.c index 7e37576b..4d0e6da3 100644 --- a/joe/uerror.c +++ b/joe/uerror.c @@ -23,6 +23,8 @@ ERROR *errptr = &errors; /* Current error row */ B *errbuf = NULL; /* Buffer with error messages */ +bool parserr_homeonly = true; /* compiler errors: ignore file paths outside home directory */ + /* Function which allows stepping through all error buffers, for multi-file search and replace. Give it a buffer. It finds next buffer in error list. Look at 'berror' for error information. */ @@ -145,19 +147,73 @@ static int freeall(void) return count; } -/* Parse "make[1]: Entering directory '/home/..../foo'" message. */ +/* Parse "make[1]: Entering directory '/home/..../foo'" message. + * Allow for possible aliases, e.g. gmake, kmk_gmake. + */ -static void parsedir(const char *s, char **rtn_dir) +static void parsedir(struct charmap *map, const char *s, char **rtn_dir) { - const char *u, *v; - u = zstr(s, "Entering directory `"); - if (u) { - u += zlen("Entering directory `"); - for (v = u; *v && *v != '\''; ++v); - if (*v == '\'') { + const char *u, *v, *vv; /* -funsigned-char */ + + u = zstr(s, "make["); + if (!u) return; + /* Possible aliases of make, so check the preceding text */ + for (v = s; v < u; ++v) { + if ((*v & 0xDF) < 'A') + return; + if ((*v & 0xDF) > 'Z' && *v != '_') + return; + } + + if (!zncmp(u, "make[", 5)) { + char quote[2][4] = {}; + + u = strchr(s, '[') + 1; /* < the [ which got matched above */ + while (*u >= '0' && *u <= '9') + ++u; + if (u == s + 5 || u[0] != ']' || u[1] != ':') + return; + /* looks like "make[1]" */ + + while (*u && !quote[0][0]) { + /* List of quotation marks: + * $ grep -h 'Entering directory' $(find make-dfsg-4.4.1 -name \*.po) -A1|sed -e '/^msgstr/! d; s/^[^"]*"//; s/"[^"]*$//; s@[[:alnum:][:space:] %:\\[\]]*@@g'|sort -u|sed -e ':t N; s/\n/ /; t t' + * "" '' `' «» “” ”” „“ „” 「」 + * Unicode code point numbers for each pair: + * 0022 0022, 0027 0027, 0060 0027, 00AB 00BB, 201C 201D, 201D 201D, 201E 201C, 201E 201D, 300C 300D + */ + int c = fwrd_c(map, &u, NULL); + switch (c) { + /* ASCII */ + case 0x0022: quote[0][0] = '"'; break; + case 0x0027: quote[0][0] = '\''; break; + case 0x0060: quote[1][0] = '`'; quote[0][0] = '\''; break; + /* Latin-(various), possibly encoded as UTF-8 */ + case 0x00AB: if (map->type) utf8_encode(quote[0], 0xBB); else quote[0][0] = (char)0xBB; break; + /* UTF-8 */ + case 0x201C: utf8_encode(quote[0], 0x201D); break; + case 0x201D: utf8_encode(quote[0], 0x201D); break; + case 0x201E: utf8_encode(quote[1], 0x201C); + utf8_encode(quote[0], 0x201D); break; + case 0x300C: utf8_encode(quote[0], 0x300D); break; + } + } + if (!quote[0][0]) + return; /* no recognised quotation mark found */ + + /* find the corresponding closing quotation mark (the last one!) */ + v = u - 1; + do { + vv = zstr(v + 1, quote[0]); + if (!vv && quote[1][0]) vv = zstr(v + 1, quote[1]); + if (vv) v = vv; + } while (vv); + + /* hopefully, we now have a non-empty string */ + if (v > u + 1) { char *t = *rtn_dir; t = vstrunc(t, 0); - t = vsncpy(sv(t), u, v - u); + t = vsncpy(sv(t), (char *)u, v - u); if (sLEN(t) && t[sLEN(t)-1] != '/') t = vsadd(t, '/'); *rtn_dir = t; @@ -282,6 +338,7 @@ static int parseit(struct charmap *map,const char *s, off_t row, void (*parseline)(struct charmap *map, const char *s, char **rtn_name, off_t *rtn_line), char *current_dir) { char *name = NULL; + const char *home = parserr_homeonly ? getenv("HOME") : NULL; off_t line = -1; ERROR *err; @@ -291,16 +348,20 @@ static int parseit(struct charmap *map,const char *s, off_t row, if (line != -1) { char *t; /* We have an error */ - err = (ERROR *) alitem(&errnodes, SIZEOF(ERROR)); - err->file = name; - if (current_dir) { - err->file = vsncpy(NULL, 0, sv(current_dir)); - err->file = vsncpy(sv(err->file), sv(name)); - err->file = canonical(err->file, CANFLAG_NORESTART); + if (current_dir && *name != '/') { + t = vsncpy(NULL, 0, sv(current_dir)); + t = vsncpy(sv(t), sv(name)); + t = canonical(t, CANFLAG_NORESTART); vsrm(name); } else { - err->file = name; + t = name; } + if (home && zncmp(t, sz(home))) { + vsrm(name); + return 0; + } + err = (ERROR *) alitem(&errnodes, SIZEOF(ERROR)); + err->file = t; err->org = err->line = line; err->src = row; err->msg = vsncpy(NULL, 0, sc("\\i")); @@ -340,7 +401,7 @@ static off_t parserr(B *b) s = brvs(q, p->byte - q->byte); if (s) { kill_ansi(s); - parsedir(s, &curdir); + parsedir(q->b->o.charmap, s, &curdir); nerrs += parseit(q->b->o.charmap, s, q->line, (q->b->parseone ? q->b->parseone : parseone), (curdir ? curdir : q->b->current_dir)); vsrm(s); } @@ -366,7 +427,7 @@ static off_t parserr(B *b) s = brvs(q, p->byte - q->byte); if (s) { kill_ansi(s); - parsedir(s, &curdir); + parsedir(q->b->o.charmap, s, &curdir); nerrs += parseit(q->b->o.charmap, s, q->line, (q->b->parseone ? q->b->parseone : parseone), (curdir ? curdir : q->b->current_dir)); vsrm(s); } @@ -553,7 +614,7 @@ int ujump(W *w, int k) s = brvs(q, p->byte - q->byte); if (s) { kill_ansi(s); - parsedir(s, &curdir); + parsedir(bw->b->o.charmap, s, &curdir); vsrm(s); } if (NO_MORE_DATA == pgetc(p)) diff --git a/joe/uerror.h b/joe/uerror.h index 488d7468..7090a483 100644 --- a/joe/uerror.h +++ b/joe/uerror.h @@ -6,6 +6,8 @@ * This file is part of JOE (Joe's Own Editor) */ +extern bool parserr_homeonly; + int unxterr(W *w, int k); int uprverr(W *w, int k); int parserrb(B *b); diff --git a/rc/joerc.in b/rc/joerc.in index ec1bbe7e..1ae11644 100644 --- a/rc/joerc.in +++ b/rc/joerc.in @@ -142,6 +142,10 @@ -notagsmenu Disable tags file search menu +-parserr_homeonly + In compiler error logs, ignore files (system header files + etc.) which are outside the user's home directory. + -icase Search is case insensitive by default. -wrap Search wraps From db733e340341d34e14d03df75e979cc78f2034e3 Mon Sep 17 00:00:00 2001 From: Joe Allen Date: Mon, 20 Apr 2026 20:42:03 -0400 Subject: [PATCH 18/21] Some fixes for 98fda77c0f06c07a1f98df48a2462bc357162ec9 --- joe/uerror.c | 6 +++--- joe/uerror.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/joe/uerror.c b/joe/uerror.c index 4d0e6da3..ce88790b 100644 --- a/joe/uerror.c +++ b/joe/uerror.c @@ -23,7 +23,7 @@ ERROR *errptr = &errors; /* Current error row */ B *errbuf = NULL; /* Buffer with error messages */ -bool parserr_homeonly = true; /* compiler errors: ignore file paths outside home directory */ +int parserr_homeonly = 1; /* compiler errors: ignore file paths outside home directory */ /* Function which allows stepping through all error buffers, for multi-file search and replace. Give it a buffer. It finds next @@ -356,8 +356,8 @@ static int parseit(struct charmap *map,const char *s, off_t row, } else { t = name; } - if (home && zncmp(t, sz(home))) { - vsrm(name); + if (home && t[0] == '/' && zncmp(t, sz(home))) { + vsrm(t); return 0; } err = (ERROR *) alitem(&errnodes, SIZEOF(ERROR)); diff --git a/joe/uerror.h b/joe/uerror.h index 7090a483..b70ae3da 100644 --- a/joe/uerror.h +++ b/joe/uerror.h @@ -6,7 +6,7 @@ * This file is part of JOE (Joe's Own Editor) */ -extern bool parserr_homeonly; +extern int parserr_homeonly; int unxterr(W *w, int k); int uprverr(W *w, int k); From d52b474a44b2062cf246cbc9430ca269f1bff58f Mon Sep 17 00:00:00 2001 From: Joe Allen Date: Mon, 20 Apr 2026 20:47:10 -0400 Subject: [PATCH 19/21] Update NEWS. --- NEWS.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/NEWS.md b/NEWS.md index 4483eb71..5b2e8414 100644 --- a/NEWS.md +++ b/NEWS.md @@ -18,6 +18,10 @@ * Save block filter prompt history in state file. + * Add parserr_homeonly option: compiler error parser will ignore + errors from files outside of user's home directory- suppresses + references to system include files. + * Bugs fixed * Fix tags file security vulnerability: Someone could share a tags @@ -43,6 +47,9 @@ * Fix selection glitches during Ctrl-Shift-Right / -Left + * Fix compiler error parser: it was not handling "new" (as of 9 + years ago) delimiters from make + ### JOE 4.7 * Enhancements From 719da5b9ea407a23f232e64a81f99a7f2bd2df30 Mon Sep 17 00:00:00 2001 From: Joe Allen Date: Wed, 6 May 2026 09:33:31 -0400 Subject: [PATCH 20/21] Fix assign to stdin issue --- joe/main.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/joe/main.c b/joe/main.c index 8df8174d..8df81212 100644 --- a/joe/main.c +++ b/joe/main.c @@ -755,7 +755,10 @@ int main(int argc, char **real_argv, const char * const *envv) /* Close stdin, so that if user kills the copying the program feeding stdin sees a SIGPIPE */ /* It won't if there are any extra file descriptors open */ fclose(stdin); - stdin = fopen("/dev/tty", "rb"); + if (!freopen("/dev/tty", "rb", stdin)) + { + /* This should not fail */ + } } } From 869f30b44059643dd3a8974bbf6c248fa1439046 Mon Sep 17 00:00:00 2001 From: jhallen Date: Wed, 6 May 2026 10:09:19 -0400 Subject: [PATCH 21/21] Fix issue where aspell prevents restoration from alternate screen when exiting JOE (#118) --- joe/ublock.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/joe/ublock.c b/joe/ublock.c index 2e59144a..cbd62fb1 100644 --- a/joe/ublock.c +++ b/joe/ublock.c @@ -1170,7 +1170,11 @@ static int dofilt(W *w, char *s, void *object, int *notify) msgnw(bw->parent, joe_gettext(_("Couldn't create pipe"))); return -1; } - npartial(bw->parent->t->t); + /* npartial is less jarring... */ + /* npartial(bw->parent->t->t); */ + /* But we must use nescape if we are using the ti te sequences, otherwise + JOE doesn't return from alternate screen if aspell is used */ + nescape(bw->parent->t->t); ttclsn(); #ifdef HAVE_FORK if (!fork()) { @@ -1275,6 +1279,8 @@ static int dofilt(W *w, char *s, void *object, int *notify) } vsrm(s); ttopnn(); + /* Use nreturn because we now use nescape */ + nreturn(bw->parent->t->t); if (filtflg) unmark(bw->parent, 0); bw->cursor->xcol = piscol(bw->cursor);