zsh-workers
 help / color / mirror / code / Atom feed
From: Peter Stephenson <pws@csr.com>
To: zsh-workers@sunsite.dk
Subject: Re: expand-and-quote-alias
Date: Thu, 11 Oct 2007 09:59:24 +0100	[thread overview]
Message-ID: <20071011095924.0f3afcc0@news01> (raw)
In-Reply-To: <slrnfgqm97.734.joerg@alea.gnuu.de>

On Wed, 10 Oct 2007 22:58:41 +0000 (UTC)
Jörg Sommer <joerg@alea.gnuu.de> wrote:
> sometimes I want to not the whole alias. But expand-alias is useless,
> because the expansion still uses the alias.
> 
> % alias ls='ls --color -lA'
> 
> I want it without -A
> 
> % ls<expand-alias>
> % ls --color -lA
> 
> But this is
> 
> % ls --color -lA --color -lA
> 
> How can I do something like the following with one key, e.g. ^Xa
> 
> % ls<backward-word set-mark-command forward-word _expand-alias quote-region>
> % 'ls --color -lA'
> 
> But, mhh, this is still not what I want. I want this:
> 
> % 'ls' --color -lA

You can safely set the whole alias to something along these lines,
  alias ls='\ls --color -lA'
say (a single "\" is enough to inhibit alias expansion).

With a little more work you can make _expand_alias do that.  You probably
want to base it on the latest version from the archive since there was a
bug that it used to remove quoting (although that doesn't quite impinge on
the problem in question).  Care is needed since if the alias expansion
starts with a special character you definitely don't want to add a
backslash.

With even more effort you can split it into words, see if the first word
is the same as the original first word, and only add the backslash in that
case.  This is non-invasive enough to be worth applying to the archive.
Here's the complete result.  It's not perfect but it handles normal
cases like the present one.


#compdef -K _expand_alias complete-word \C-xa

local word expl tmp pre sel what
local -a tmpa

eval "$_comp_setup"

if [[ -n $funcstack[2] ]]; then
  if [[ "$funcstack[2]" = _prefix ]]; then
    word="$IPREFIX$PREFIX$SUFFIX"
  else
    word="$IPREFIX$PREFIX$SUFFIX$ISUFFIX"
  fi
  pre=()
else
  local curcontext="$curcontext"

  if [[ -z "$curcontext" ]]; then
    curcontext="expand-alias-word:::"
  else
    curcontext="expand-alias-word:${curcontext#*:}"
  fi

  word="$IPREFIX$PREFIX$SUFFIX$ISUFFIX"
  pre=(_main_complete - aliases)
fi

zstyle -s ":completion:${curcontext}:" regular tmp || tmp=yes
case $tmp in
always) sel=r;;
yes|1|true|on) [[ CURRENT -eq 1 ]] && sel=r;;
esac
zstyle -T ":completion:${curcontext}:" global && sel="g$sel"
zstyle -t ":completion:${curcontext}:" disabled && sel="${sel}${(U)sel}"

tmp=
[[ $sel = *r* ]] && tmp=$aliases[$word]
[[ -z $tmp && $sel = *g* ]] && tmp=$galiases[$word]
[[ -z $tmp && $sel = *R* ]] && tmp=$dis_aliases[$word]
[[ -z $tmp && $sel = *G* ]] && tmp=$dis_galiases[$word]

if [[ -n $tmp ]]; then
  # We used to remove the quoting from the value in the parameter.
  # That was probably just an oversight: an alias is always replaced
  # literally.
  tmp=${tmp%%[[:blank:]]##}
  if [[ $tmp[1] = [[:alnum:]_] ]]; then
    tmpa=(${(z)tmp})
    if [[ $tmpa[1] = $word && $tmp = $aliases[$word] ]]; then
      # This is an active regular alias and the first word in the result
      # is the same as what was on the line already.  Quote it so
      # that it doesn't get reexanded on execution.
      #
      # Strictly we also need to check if the original word matches
      # a later word in the expansion and the previous words are
      # all aliases where the expansion ends in " ", but I'm
      # too lazy.
      tmp="\\$tmp"
    fi
  fi
  $pre _wanted aliases expl alias compadd -UQ ${tmp%%[[:blank:]]##}
elif (( $#pre )) && zstyle -t ":completion:${curcontext}:" complete; then
  $pre _aliases -s "$sel" -S ''
else
  return 1
fi


-- 
Peter Stephenson <pws@csr.com>                  Software Engineer
CSR PLC, Churchill House, Cambridge Business Park, Cowley Road
Cambridge, CB4 0WZ, UK                          Tel: +44 (0)1223 692070


  reply	other threads:[~2007-10-11  9:00 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-10 22:58 expand-and-quote-alias Jörg Sommer
2007-10-11  8:59 ` Peter Stephenson [this message]
2007-10-11 13:36   ` expand-and-quote-alias Jörg Sommer

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=20071011095924.0f3afcc0@news01 \
    --to=pws@csr.com \
    --cc=zsh-workers@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).