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

Re: _chflags

Akinori MUSHA wrote:
> Ah, OK, I'm getting the hang of it.  Every point you addressed above
> is correct.  Now what about the attached one? :)

That's great.

> And I have a couple of questions:
> 1. How can I prevent _values from sorting the values?

Er. Sven? -V doesn't work so you probably can't. Why do you want to? To
group flags with their no variants by any chance? In the latest zsh 4.1,
it might be better to use '(noarch arch)'{arch,noarch}'[archived flag]'
which would put arch and noarch on the same line with a shared

You can use styles to group no and non-no flags separately if that is
what you want to do. Can anyone else please enlighten me if there is a
style to affect the sort order?

> 2. How can I let zsh automatically add `R' when one chooses -[LHP]?

Again, I don't know/don't think it can be done. You would need to get it
to be added as an (auto-removable) suffix which I don't think _arguments
can handle.

> (( $+functions[__chflags] )) ||
> __chflags() {

I take it that you copied this from _kld or _bsd_pkg which is fine. I
prefer to use states with _arguments to defining separate functions
within completion functions. In the case of _chflags, neither is
actually necessary.

>   if [[ CURRENT -eq 2 || $words[CURRENT-1] = -* ]]; then

_arguments takes care of that

>        '(noarch)arch[set the archived flag (super-user only)]' \

What I've done is removed `(super-user only)' from the descriptions and
made it only complete those flags for the super-user (EUID=0). I have
also got it to only complete files which the user owns. This follows the
way that _chown works. Incidentally, symlinks are followed for this and
chown so when I commit this, I'll add `req=( -$^req )' before the _files
call in _chown. 

About these descriptons again: I'm not too sure how useful the
description `set the dump flag' is although that type of description is
quite common for zsh completions. I think the chances are that someone
using chflags can work out that `chflags opaque' sets the opaque flag
and noopaque unsets the flag. However, I wouldn't have a clue what the
significance of the opaque file flag is. To an extent I blame that man
page because it doesn't explain either. So I'd be tempted (for 4.1 only)
to change the flags to along the lines of:
'(dump nodump)'{dump,nodump}'[backup file when dump(8) is next run]'

Note that that description for the dump flag could be completely wrong.
In 4.1 this looks roughly like this when completed:

file flag
dump    nodump    --  backup file when dump(8) is next run

The aliases for the flags could then also be added. What do you reckon?

And, if you can check this updated function below please.


#compdef chflags

local flags own='-g *(-u$EUID)'

  '(noopaque)opaque[set the opaque flag]'
  '(opaque)noopaque[unset the opaque flag]'
  '(dump)nodump[set the nodump flag]'
  '(nodump)dump[unset the nodump flag]'
  '(nouappnd)uappnd[set the user append-only flag]'
  '(uappnd)nouappnd[unset the user append-only flag]'
  '(nouchg)uchg[set the user immutable flag]'
  '(uchg)nouchg[unset the user immutable flag]'

if (( ! EUID )); then
  flags=( $flags[@]
    '(noarch)arch[set the archived flag]'
    '(arch)noarch[unset the archived flag]'
    '(nosappnd)sappnd[set the system append-only flag]'
    '(sappnd)nosappnd[unset the system append-only flag]'
    '(noschg)schg[set the system immutable flag]'
    '(schg)noschg[unset the system immutable flag]'
  unset own

if [[ $OSTYPE = freebsd* ]]; then
  flags=( $flags[@]
    '(nouunlnk)uunlnk[set the user undeletable flag]'
    '(uunlnk)nouunlnk[unset the user undeletable flag]'
  (( EUID )) || flags=( $flags[@]
    '(nosunlnk)sunlnk[set the system undeletable flag]'
    '(sunlnk)nosunlnk[unset the system undeletable flag]'

_arguments -s -A "-*" \
  '(-L -P)-H[follow symlinks on the command line (specify with -R)]' \
  '(-H -P)-L[follow all symlinks (specify with -R)]' \
  '(-L -H)-P[do not follow symlinks (specify with -R)]' \
  '-R[recurse directories]' \
  ':file flag:_values -s , "file flags" $flags[@]' \
  '*:file:_files "$own"'

This message has been checked for all known viruses by the 
MessageLabs Virus Scanning Service. For further information visit

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