From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11120 invoked by alias); 16 Dec 2015 06:27:32 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 37407 Received: (qmail 8794 invoked from network); 16 Dec 2015 06:27:31 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham autolearn_force=no version=3.4.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=gkJdkMtZU6XBMjOP9lwjBD7ZwT3rZoY1wwJuKJzSvzk=; b=kV3hgLNCG+MzhzY5cA8T7IgmmesG7PT7urWvRq/WiifGMiBsaIzWiHsqQLF7m+z3tU 9Y0vyWLVpuZAL7ODNbJE3p/8QH/QkrJarWBz71miFW19TZMywZS3z+vYQytPRq70YNii gWYcHtGBuMd2RigWG/F4TJpaWQGc6Zm0Y9MmSM1GsGgGAHEbksJieWHzobQ2mJ8bYKKX v/0PqaLHHWO1Xx6VL9MzF8oYB4X+otmEw8aCtV99jHSCJFaaaH+TSGZrayy3JMoRfq9t SBzatIrKUohRzrCsaFKdfDQDPfJRXDgpWb5qT36KmgjdWfKLcJnhIztjEs1cuRGScH/P cD2Q== X-Received: by 10.194.204.232 with SMTP id lb8mr58106364wjc.112.1450245759639; Tue, 15 Dec 2015 22:02:39 -0800 (PST) From: Mikael Magnusson To: zsh-workers@zsh.org Subject: PATCH: Add zle-line-pre-redraw hook for highlighting Date: Wed, 16 Dec 2015 07:02:34 +0100 Message-Id: <1450245754-2760-1-git-send-email-mikachu@gmail.com> X-Mailer: git-send-email 2.6.1 In-Reply-To: References: I haven't received any complaints about 36650 from testers, so I'll go ahead and push this. If anyone has a better idea for the name of the hook, there should be plenty of time to bikeshed before the next release :). --- Doc/Zsh/zle.yo | 5 +++++ Src/Zle/zle_main.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo index 7047b43..9c46232 100644 --- a/Doc/Zsh/zle.yo +++ b/Doc/Zsh/zle.yo @@ -1087,6 +1087,11 @@ widget: example(zle-isearch-exit+LPAR()RPAR() { zle -M ""; } zle -N zle-isearch-exit) ) +tindex(zle-line-pre-redraw) +item(tt(zle-line-pre-redraw))( +Executed whenever the input line is about to be redrawn, providing an +opportunity to update the region_highlight array. +) tindex(zle-line-init) item(tt(zle-line-init))( Executed every time the line editor is started to read a new line diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c index 1f0c07d..7862d48 100644 --- a/Src/Zle/zle_main.c +++ b/Src/Zle/zle_main.c @@ -1025,6 +1025,31 @@ getrestchar(int inchar, char *outstr, int *outcount) /**/ #endif +static void redrawhook() +{ + Thingy initthingy; + if ((initthingy = rthingy_nocreate("zle-line-pre-redraw"))) { + int lastcmd_prev = lastcmd; + int old_incompfunc = incompfunc; + char *args[2]; + Thingy lbindk_save = lbindk, bindk_save = bindk; + refthingy(lbindk_save); + refthingy(bindk_save); + args[0] = initthingy->nam; + args[1] = NULL; + incompfunc = 0; + execzlefunc(initthingy, args, 0); + incompfunc = old_incompfunc; + unrefthingy(initthingy); + unrefthingy(lbindk); + unrefthingy(bindk); + lbindk = lbindk_save; + bindk = bindk_save; + /* we can't set ZLE_NOTCOMMAND since it's not a legit widget, so + * restore lastcmd manually so that we don't mess up the global state */ + lastcmd = lastcmd_prev; + } +} /**/ void @@ -1084,6 +1109,8 @@ zlecore(void) errflag |= ERRFLAG_ERROR; break; } + + redrawhook(); #ifdef HAVE_POLL if (baud && !(lastcmd & ZLE_MENUCMP)) { struct pollfd pfd; @@ -1113,6 +1140,7 @@ zlecore(void) zrefresh(); freeheap(); + } region_active = 0; @@ -1191,7 +1219,7 @@ zleread(char **lp, char **rp, int flags, int context, char *init, char *finish) vistartchange = -1; zleline = (ZLE_STRING_T)zalloc(((linesz = 256) + 2) * ZLE_CHAR_SIZE); *zleline = ZWC('\0'); - virangeflag = lastcmd = done = zlecs = zlell = mark = 0; + virangeflag = lastcmd = done = zlecs = zlell = mark = yankb = yanke = 0; vichgflag = 0; viinsbegin = 0; statusline = NULL; @@ -1812,6 +1840,7 @@ recursiveedit(UNUSED(char **args)) { int locerror; + redrawhook(); zrefresh(); zlecore(); -- 2.6.1