Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[rfc + bad patch] Allow to get the current cursor command from zle, for doing a nicer run-help.



(the patch will be badly linebroken likely, but it's just for illustration).
Let's say you have the command line
git add -u; git commit - # hmm, was it -m or -M for message? *press alt-h*
Now, also assume you have the run-help-git stuff set up, but it will still
show you the manpage for git-add instead of git-commit. Since the run-help
widget does a push-line, we can't use $CURSOR to find out which is the actual
command, this is how i solved it.

function _runhelp() {
  local lookup
  if [[ "$CURSORCOMMAND" = git ]]; then
    # tiny bug here, want CURSOR+1 so you get the right result when on the
    # first letter, but then it breaks when at the end of the line which is
    # the far more common case.
    lookup=git-${${(z)BUFFER[(b:CURSOR:R)$CURSORCOMMAND,-1]}[2]}
  else
    lookup=$CURSORCOMMAND
  fi
  _runcmdhidden man $lookup
}

function _runcmdhidden() {
  "$@" >& /dev/null < /dev/null &|
}

function man () { urxvt +sb +ip -e pinfo -m "$@" &|: }

(this can of course be made to do a push-line manually and open in man in
the same terminal as usual, but I like the new window.)

diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index efa6286..ae5271a 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -48,6 +48,8 @@ static const struct gsu_scalar buffer_gsu =
 { get_buffer, set_buffer, zleunsetfn };
 static const struct gsu_scalar context_gsu =
 { get_context, nullstrsetfn, zleunsetfn };
+static const struct gsu_scalar cursor_command_gsu =
+{ getcurcmd, nullstrsetfn, zleunsetfn };
 static const struct gsu_scalar cutbuffer_gsu =
 { get_cutbuffer, set_cutbuffer, unset_cutbuffer };
 static const struct gsu_scalar keymap_gsu =
@@ -106,6 +108,7 @@ static struct zleparam {
     { "BUFFER",  PM_SCALAR,  GSU(buffer_gsu), NULL },
     { "BUFFERLINES", PM_INTEGER | PM_READONLY, GSU(bufferlines_gsu),
         NULL },
+    { "CURSORCOMMAND", PM_SCALAR | PM_READONLY,
GSU(cursor_command_gsu), NULL },
     { "CONTEXT", PM_SCALAR | PM_READONLY, GSU(context_gsu),
 	NULL },
     { "CURSOR",  PM_INTEGER, GSU(cursor_gsu),
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c
index bc01524..6c57842 100644
--- a/Src/Zle/zle_tricky.c
+++ b/Src/Zle/zle_tricky.c
@@ -2757,7 +2757,7 @@ expandhistory(UNUSED(char **args))
 static int cmdwb, cmdwe;

 /**/
-static char *
+char *
 getcurcmd(void)
 {
     int curlincmd;


-- 
Mikael Magnusson



Messages sorted by: Reverse Date, Date, Thread, Author