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

Re: psychiatric help




On 2026-04-05 22:03, Bart Schaefer wrote:
If you've got "compinit" in your .zshrc, you've been near hundreds of
widgets.  "Widget" is just the zsh name for a function that is
executed by ZLE.
Yeah, I know they're all around, I mean actually getting inside one of them.  OK, a function executed by ZLE.
zle-line-finish is a "special" widget that ZLE runs automatically just
after accept-line (the widget normally bound to Enter/Return).  By
default it's not defined at all, so you have to create it.
Ah!  Like preexec() -- IF it exists it will be executed.  Yes?
zle -N zle-line-finish _tt
Like that.
Not to split hairs, but does that append _tt or cause _tt to be absorbed into zle-line-finish? As you say, the latter doesn't exist, so this creates it but with the contents of _tt?  But zle-line-finish can't be found even after the above is executed.
The important bit is that you should NOT call "eval" of anything, and
that the assignment to BUFFER contains the command line you want to
run.  So if you want to keep using _execute, you would likely replace
the "eval" by the assignment of BUFFER=.
Yup, that's the goal.
https://www.zsh.org/mla/ although I believe searching is still broken
so you need to know an article number or pore over the indexes.
Tx.  Yes, I remember.  I lost track of the site cuz it was hard to search anyway.

Ok, I'm starting to understand:

function ttt ()
{
BUFF=${(z)BUFFER} # I just need access, I don't need it actually on the CL.
export BUFF
}
zle -N zle-line-finish ttt

... added to the top of 'l()'

alias l='noglob _l'
function _l ()
{
echo "\nMy name is $BUFF[1]
and my unexpanded tail is: ${BUFF[2,-1]}"

#...
#... and where the monster is created:

#OLD
string=\
"ls --time-style='+[%y-%m-%d--%H:%M]' --group-directories-first\
 -A$cclassify$upsidedown$wwidth$dirnames$sortby$recursive\
$ls_color $ccase\
$filespec 2> /dev/null\  # filespec kept from expansion by using noglob.
$filetype\
$ssed_string\
 | egrep -v '^total'"

#NEW
string=\
"ls --time-style='+[%y-%m-%d--%H:%M]' --group-directories-first\
 -A$cclassify$upsidedown$wwidth$dirnames$sortby$recursive\
$ls_color $ccase
${BUFF[2,-1]}.2> /dev/null\   # Unexpanded filespec anyway, thus no need for noglob.
$filetype\
$ssed_string\
 | egrep -v '^total'"

run:

5 /aWorking/Zsh/Source/Wk 1 % l ,v test\ ?

My name is l
and my unexpanded tail is:  ,v test\ ?

 0 [26-04-04--09:00] test a
 0 [26-04-04--09:03] test b

... bingo.  Except :( ...

5 /aWorking/Zsh/Source/Wk 1 % l ,v test\ ?; echo howdy; echo pard

My name is l
and my unexpanded tail is:  ,v test\ ? ; echo howdy ; echo pard

 0 [26-04-04--09:00] test a
 0 [26-04-04--09:03] test b
howdy
pard

... when I first threw myself at this issue, the simple idea was to just retrieve the command line from history:

$  history -rn -1

... but the line in history and the above $BUFF method have the exactly same problem, namely when there's more than one command on the line.  The real goal here is to get the unexpanded tail of each command separately.  But perhaps zsh expands the whole line in one go rather than first break the line into separate commands, and then do the expansion?

Anyway one could break the line into separate commands easily enough and then take each command and break it into command and tail ... but if there's two (say) echo's, or the same function is called twice, which is which?  Obviously zsh does all this work internally, but how to get that breakdown?

Or is this worth the bother?  My original issue, tiny as it was, is repaired.  True, I'd like to cut out the 'noglob's and the 'eval', but this is already way more work than I have any right to ask of you.  And yet I still feel that this should be done anyway -- basic stuff.  Tho of course, nobody else seems to think it's important so ...

Unless ... each command sequentially bit off its own chunk of $BUFF, up to the semicolon, leaving the next command unambiguously looking at the next: 'command' 'tail' 'semicolon'.  Should be easy?













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