zsh-users
 help / color / mirror / code / Atom feed
* Nice in-word incremental history word searcher
@ 2016-01-20 20:14 Sebastian Gniazdowski
  2016-01-21  5:32 ` Bart Schaefer
  0 siblings, 1 reply; 4+ messages in thread
From: Sebastian Gniazdowski @ 2016-01-20 20:14 UTC (permalink / raw)
  To: Zsh Users

Hello,
files `zew-process-buffer' and `zew-history-complete-word' here (or
use the whole project):

https://github.com/psprint/zsh-editing-workbench

Incrementally completes any word from history. Can do in-word search
when invoked with cursor in middle of word, or, after starting, if
user positions cursor in a middle of a word and does space - backspace
(to point the tool to that location in word):

https://asciinema.org/a/3qp58ufve1d64jgiu18vv0c4u

Best regards,
Sebastian Gniazdowski


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Nice in-word incremental history word searcher
  2016-01-20 20:14 Nice in-word incremental history word searcher Sebastian Gniazdowski
@ 2016-01-21  5:32 ` Bart Schaefer
  2016-01-21  7:03   ` Bart Schaefer
  2016-01-21  9:11   ` Sebastian Gniazdowski
  0 siblings, 2 replies; 4+ messages in thread
From: Bart Schaefer @ 2016-01-21  5:32 UTC (permalink / raw)
  To: Zsh Users

On Jan 20,  9:14pm, Sebastian Gniazdowski wrote:
} Subject: Nice in-word incremental history word searcher
}
} files `zew-process-buffer' and `zew-history-complete-word' here (or
} use the whole project):

So I glanced through zew-process-buffer and have a few questions/remarks.

    --- 8< --- snip --- 8< ---
19  local buf="$1"
20  local cursor="$CURSOR"
21  [ -n "$2" ] && cursor="$2"
22
23  ZEW_PB_WORDS=( "${(Z+n+)BUFFER}" )
    --- 8< --- snip --- 8< ---

You could replace lines 20 and 21 with

    local cursor="${2:-$CURSOR}"

Shouldn't line 23 say

    ZEW_PB_WORDS=( "${(Z+n+)buf}" )

??  And therefore why is line 19 not

    local buf="${1:-$BUFFER}"

??  Do you really intend to take words from the ZLE buffer and then use
them to analyze the string passed as "$1"?

This on line 72:

  [[ "$ZEW_PB_SELECTED_WORD" -eq "-1" && "$char_count" -gt "$cursor" ]]

Could be this:

  (( ZEW_PB_SELECTED_WORD == -1 && char_count > cursor ))

Similarly on line 77.

On line 81, this:

    char_count=char_count+"$#buf"

depends on the zsh semantics of assignment to an declared integer.  It
might be better to explicitly use math context:

    (( char_count = char_count + $#buf ))

That's it for process-buffer.  I also took a more superficial look at
zew-history-complete-word; two things to note, one minor, one more
important.

First, you used the old [ ... ] test everywhere instead of [[ ... ]].
Any particular reason?

Second, I think you've partly missed the point of custom keymaps.  I
imagine you copied the caps-lock example from the recursive-edit doc,
but there's actually a better way now (that example could be redone):

Instead of overriding self-insert et al. in the main keymap and then
restoring them, you can do the same thing as with the zhcw keymap:
Create (once) a copy of the main keymap, install your new bindings
for self-insert etc., in that copy, and then when you want to use the
new keymap, switch to it with "zle -K".

If you prefer the way you've done it, at least consider wrapping it
all in an "always" construct so you can't accidentally abort out of
it without restoring the main keymap.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Nice in-word incremental history word searcher
  2016-01-21  5:32 ` Bart Schaefer
@ 2016-01-21  7:03   ` Bart Schaefer
  2016-01-21  9:11   ` Sebastian Gniazdowski
  1 sibling, 0 replies; 4+ messages in thread
From: Bart Schaefer @ 2016-01-21  7:03 UTC (permalink / raw)
  To: Zsh Users

On Jan 20,  9:32pm, I wrote:
}
} Instead of overriding self-insert et al. in the main keymap and then
} restoring them, you can do the same thing as with the zhcw keymap:
} Create (once) a copy of the main keymap, install your new bindings
} for self-insert etc., in that copy, and then when you want to use the
} new keymap, switch to it with "zle -K".

Upon thinking about this a bit more ... this may be a better approach
but it's not necessarily an easier approach.  To do it this way you
have to find and rebind every keystroke that is linked to the widget
you intend to replace, rather than just aliasing the widget name.

That's not terribly difficult in Sebastian's function but it could
be ugly if there are a lot of such bindings to fiddle with.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Nice in-word incremental history word searcher
  2016-01-21  5:32 ` Bart Schaefer
  2016-01-21  7:03   ` Bart Schaefer
@ 2016-01-21  9:11   ` Sebastian Gniazdowski
  1 sibling, 0 replies; 4+ messages in thread
From: Sebastian Gniazdowski @ 2016-01-21  9:11 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: Zsh Users

On 21 January 2016 at 06:32, Bart Schaefer <schaefer@brasslantern.com> wrote:
>     --- 8< --- snip --- 8< ---
> 19  local buf="$1"
> 20  local cursor="$CURSOR"
> 21  [ -n "$2" ] && cursor="$2"
> 22
> 23  ZEW_PB_WORDS=( "${(Z+n+)BUFFER}" )
>     --- 8< --- snip --- 8< ---
>
> You could replace lines 20 and 21 with
>
>     local cursor="${2:-$CURSOR}"

Thanks, done that

> Shouldn't line 23 say
>
>     ZEW_PB_WORDS=( "${(Z+n+)buf}" )
>
> ??

True, corrected that, thanks

> And therefore why is line 19 not
>
>     local buf="${1:-$BUFFER}"
>
> ??

Nice idea to have $1 and $2 all optional, done that

> This on line 72:
>
>   [[ "$ZEW_PB_SELECTED_WORD" -eq "-1" && "$char_count" -gt "$cursor" ]]
>
> Could be this:
>
>   (( ZEW_PB_SELECTED_WORD == -1 && char_count > cursor ))

Recently I started to introduce (( )) to conditional expressions,
could replace this to, but comments can nicely refer to "-gt", "-ge"
so I'll leave them as they are

> On line 81, this:
>
>     char_count=char_count+"$#buf"
>
> depends on the zsh semantics of assignment to an declared integer.  It
> might be better to explicitly use math context:
>
>     (( char_count = char_count + $#buf ))
>

I like utilizing integer declaration and then the semantics, rarely
use (( )), if I do then mostly as "integer i=$(( ))" when I need to
assign a value computed with use of parenthesis – "integer i=(a-b)*c"
will return error, doing "0+..." trick doesn't help (it helps when not
declaring but using already declared integer), so I do "integer i=$((
(a-b)*c )). Also, like the *SELECTED_WORD variable, I don't declare
globals as integers, so in such case if computation is needed I use ((
)). This makes some distinctions in code, allows to quickly
differentiate between integers and normal variables / globals. It's
not what I truly planned and I still experiment, but it rather works.

> First, you used the old [ ... ] test everywhere instead of [[ ... ]].
> Any particular reason?

Rather not, I just didn't want to depart from sh too much too fast. I
might switch to [[ ]] after year of testing what pitfalls [ ] can have
(and there are rather none), but on other hand, using [[ ]] only when
it's needed helps reading the code, user can expect simplicity in [ ]
and sophistication in [[ ]]. Is there a reason to always use [[ ?

> Second, I think you've partly missed the point of custom keymaps.  I
> imagine you copied the caps-lock example from the recursive-edit doc,
> but there's actually a better way now (that example could be redone):
>
> Instead of overriding self-insert et al. in the main keymap and then
> restoring them, you can do the same thing as with the zhcw keymap:
> Create (once) a copy of the main keymap, install your new bindings
> for self-insert etc., in that copy, and then when you want to use the
> new keymap, switch to it with "zle -K".

Saw your next email, seems that I could bind backspace and delete, and
leave self-insert as it is.

Best regards,
Sebastian Gniazdowski


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-01-21  9:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-20 20:14 Nice in-word incremental history word searcher Sebastian Gniazdowski
2016-01-21  5:32 ` Bart Schaefer
2016-01-21  7:03   ` Bart Schaefer
2016-01-21  9:11   ` Sebastian Gniazdowski

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).