From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28593 invoked from network); 28 Feb 2009 11:47:16 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.2.5 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 28 Feb 2009 11:47:16 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 66170 invoked from network); 28 Feb 2009 11:47:11 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 28 Feb 2009 11:47:11 -0000 Received: (qmail 10463 invoked by alias); 28 Feb 2009 11:47:05 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 26629 Received: (qmail 10450 invoked from network); 28 Feb 2009 11:47:04 -0000 Received: from bifrost.dotsrc.org (130.225.254.106) by sunsite.dk with SMTP; 28 Feb 2009 11:47:04 -0000 Received: from sievert.tabularazor.org (sievert.tabularazor.org [78.47.31.242]) by bifrost.dotsrc.org (Postfix) with ESMTP id 811308058F83 for ; Sat, 28 Feb 2009 12:46:57 +0100 (CET) Received: by sievert.tabularazor.org (Postfix, from userid 2350) id 564A71151C25; Sat, 28 Feb 2009 12:57:30 +0100 (CET) Date: Sat, 28 Feb 2009 12:57:30 +0100 From: derf@sievert.tabularazor.org To: zsh-workers@sunsite.dk Subject: [contrib] fish-like directory in prompt Message-ID: <20090228115730.GA60598@sievert.tabularazor.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="azLHFNyN32YCQGCU" Content-Disposition: inline User-Agent: Mutt/1.5.16 (2007-06-09) X-Virus-Scanned: ClamAV 0.92.1/9056/Sat Feb 28 06:10:15 2009 on bifrost X-Virus-Status: Clean --azLHFNyN32YCQGCU Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi there, I recently stumbled upon the "friendly interactive shell" (fish). While I don't really like it, I was quite amazed by the way it displayes the current directory in the prompt. Basically, it only displays the tail of the path as full directory, and truncates every directory name before it to its first character. Example: /usr/share/zsh/functions/Completion -> /u/s/z/f/Completion Apparently this feature was not available in zsh, so I wrote the attached function for it. As an addition to fish-like behaviour, it can also produce "tab-safe" paths, so if you take the path, paste it into a shell and press tab, it will safely expand to your current working directory. The function can be configured both via commandline arguments and zstyle. Personally, I put its output into a psvar and use it in the prompt instead of the current directory, but with the prompt_expansion option it could also be used directly in the prompt. Comments and suggestions are welcome. --azLHFNyN32YCQGCU Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=rtab ## vim:ft=zsh ## reverse tabbing, useful in the prompt ## Copyright (C) 2008 by Daniel Friesel ## License: WTFPL ## CAVEAT: directory-names containing two or more consecutive spaces ## are not yet supported setopt localoptions setopt rc_quotes null_glob typeset -i lastfull=0 typeset -i short=0 typeset -i tilde=0 typeset -i named=0 if zstyle -t ':prompt:rtab' fish; then lastfull=1 short=1 tilde=1 fi if zstyle -t ':prompt:rtab' nameddirs; then tilde=1 named=1 fi zstyle -t ':prompt:rtab' last && lastfull=1 zstyle -t ':prompt:rtab' short && short=1 zstyle -t ':prompt:rtab' tilde && tilde=1 while [[ $1 == -* ]]; do case $1 in -f|--fish) lastfull=1 short=1 tilde=1 ;; -h|--help) print 'Usage: rtab [-f -l -s -t] [directory]' print ' -f, --fish fish-simulation, like -l -s -t' print ' -l, --last Print the last directory''s full name' print ' -s, --short Truncate directory names to the first character' print ' -t, --tilde Substitute ~ for the home directory' print ' -T, --nameddirs Substitute named directories as well' print 'The long options can also be set via zstyle, like' print ' zstyle :prompt:rtab fish yes' return 0 ;; -l|--last) lastfull=1 ;; -s|--short) short=1 ;; -t|--tilde) tilde=1 ;; -T|--nameddirs) tilde=1 named=1 ;; esac shift done typeset -a tree expn typeset result part dir=${1-$PWD} typeset -i i [[ -d $dir ]] || return 0 if (( named )) { for part in ${(k)nameddirs}; { [[ $dir == ${nameddirs[$part]}(/*|) ]] && dir=${dir/${nameddirs[$part]}/\~$part} } } (( tilde )) && dir=${dir/$HOME/\~} tree=(${(s:/:)dir}) ( unfunction chpwd 2> /dev/null if [[ $tree[1] == \~* ]] { cd ${~tree[1]} result=$tree[1] shift tree } else { cd / } for dir in $tree; { if (( lastfull && $#tree == 1 )) { result+="/$tree" break } expn=(a b) part='' i=0 until [[ (( ${#expn} == 1 )) || $dir = $expn || $i -gt 99 ]] do (( i++ )) part+=$dir[$i] expn=($(echo ${part}*(/))) (( short )) && break done result+="/$part" cd $dir shift tree } echo ${result:-/} ) --azLHFNyN32YCQGCU--