zsh-users
 help / color / mirror / code / Atom feed
From: "Nikolai Weibull" <now@bitwi.se>
To: "Bart Schaefer" <schaefer@brasslantern.com>
Cc: "Zsh Users" <zsh-users@sunsite.dk>
Subject: Re: Problem with motion commands defined using match-word-by-style used with vi-delete
Date: Sat, 22 Apr 2006 23:38:48 +0200	[thread overview]
Message-ID: <dbfc82860604221438i51d3a8e0tc06b0b5c90d40cb6@mail.gmail.com> (raw)
In-Reply-To: <060422113544.ZM9246@torch.brasslantern.com>

On 4/22/06, Bart Schaefer <schaefer@brasslantern.com> wrote:
> On Apr 22,  1:04pm, Nikolai Weibull wrote:
> } > } Until then I'm going to use my own vi-delete
> } >
> } > Creating a vi-delete-match function seems like the next best thing.
> }
> } That's what I meant (I think) :-).
>
> Yes, I was agreeing with you.

Ah, :-).

> On further checking, however, the value of $WIDGETFUNC within the widget
> called by vi-delete appears to be ".internal" which means that although
> it's possible to determine *when* one of these functions has been called
> from vi-delete, it's not possible to determine under which name it was
> called.  So a custom vi-delete replacement appears to be required, and
> perhaps we should consider adding one to the distribution.  The same is
> going to be true of vi-change and any other widget that combines with a
> motion widget in this way.

I've begun writing one, but it won't work.  What I do is roughly the following:

vi-delete-match () {
  integer begin end

  local motion
  integer count=0
  read -k 1 motion
  while [[ $motion == [[:digit:]] ]]; do
    (( count = count * 10 + motion ))
    read -k 1 motion
  done
  (( count = (count == 0) ? 1 : count ))
  case $motion in
    (*)
      local motion_command="${${:-$(bindkey -a $motion)}##* }"
      if [[ -n $motion_command ]]; then
        (( begin = CURSOR ))
        zle $motion_command -n $count
        (( end = CURSOR + 1 ))
        (( CURSOR = begin ))
        BUFFER="${BUFFER[1,begin]}${BUFFER[end,-1]}"
      fi
      ;;
  esac
}
zle -N vi-delete-match

bindkey -a "d" vi-delete-match

The convoluted handling of $motion is for future expansion with what
Vim refers to as text objects, i.e., "aw" for "a word", which selects
the current word you're in.

This, however, doesn't work.  $WIDGET is set to vi-delete-match, which
is the top-level widget, not the widget run by the zle command in

        zle $motion_command -n $count

I guess this makes sense in almost all cases, but not here.

$WIDGETFUNC is set to vi-delete-match, which is correct, given the
value of $WIDGET.

I'm positive that there's a way to do this, but I can't see it, so any
help is welcome.

I'm sure it'll break all kinds of stuff, but one solution would be to
have getvirange() set bindk to k2 once it has been read and checked.

Also, it would be great if we had a switch for bindkey that made it
print the widgets name, nothing else.

  nikolai


  reply	other threads:[~2006-04-22 21:39 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-04-21 23:10 Nikolai Weibull
2006-04-22  5:00 ` Bart Schaefer
2006-04-22 11:04   ` Nikolai Weibull
2006-04-22 18:35     ` Bart Schaefer
2006-04-22 21:38       ` Nikolai Weibull [this message]
2006-04-23  6:09         ` Bart Schaefer
     [not found]           ` <dbfc82860604230157h52f91585ncfd5a984a1a08c67@mail.gmail.com>
2006-04-23 15:53             ` Bart Schaefer
2006-04-23 16:13               ` Nikolai Weibull
2006-04-23 23:08               ` Peter Stephenson
2006-04-24 19:39                 ` Nikolai Weibull
2006-04-25  3:06                   ` Bart Schaefer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=dbfc82860604221438i51d3a8e0tc06b0b5c90d40cb6@mail.gmail.com \
    --to=now@bitwi.se \
    --cc=schaefer@brasslantern.com \
    --cc=zsh-users@sunsite.dk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).