From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23351 invoked by alias); 24 Nov 2015 10:42:52 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 20980 Received: (qmail 7980 invoked from network); 24 Nov 2015 10:42:51 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.0 X-IBM-Helo: d06dlp03.portsmouth.uk.ibm.com X-IBM-MailFrom: vogt@linux.vnet.ibm.com X-IBM-RcptTo: zsh-users@zsh.org Date: Tue, 24 Nov 2015 11:32:39 +0100 From: Dominik Vogt To: Zsh Users Subject: Help with directory switching functions Message-ID: <20151124103239.GA31057@linux.vnet.ibm.com> Reply-To: vogt@linux.vnet.ibm.com Mail-Followup-To: Zsh Users MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15112410-0037-0000-0000-000004B9340B I'm trying to write a function that alternately switches between two directories. With "+-" I can repeatedly switch between the current directory and the last one where I did anything (type any command except switching directories). There are still a few rough edges that might be improved. The function makes use of the chpwd and precmd functions. chpwd writes down the $HISTCMD of the last command that switched directories, and precmd uses that information to mark the current directory as one yuop might want to switch back later. When such a directory is left, chpwd finally stores its path in a variable that is then used by "-+". -- snip -- function _swapdir_chpwd () { local _PWD_A local _OLDPWD_A _CHPWD_N="$[HISTCMD + 1]" _PWD_A=$(readlink -f "$PWD") test x"$_PWD_A" = x"$_RECORDED_DIR_A"; then _RECORDED_DIR="$PWD" fi _OLDPWD_A=$(readlink -f "$OLDPWD") if test "$_IS_CWD_INTERESTING" = 1 -a ! x"$_PWD_A" = x"$_OLDPWD_A"; then # really leaving an interesting dir -> record it _RECORDED_DIR="$OLDPWD" _RECORDED_DIR_A="$_OLDPWD_A" _IS_CWD_INTERESTING="0" fi } function chpwd () { _swapdir_chpwd } function _swapdir_precmd () { test ! "$HISTCMD" = "$_CHPWD_N" && _IS_CWD_INTERESTING="1" } function precmd () { _swapdir_precmd } function _swapdir () { _IS_CWD_INTERESTING=1 cd "$_RECORDED_DIR" _IS_CWD_INTERESTING=1 } alias -- +-=_swapdir -- snip -- Problems: 1. Command lines with multiple command cannot be handled properly because precmd is just called once for the line, not for each command. $ cd ~; ls; cd .. 2. Depending on $HISTCMD is a bit hacky. What I'd really want to do is to look at the command being executed and decide individually which commands are "interesting" enough to warrant recording the current directory. 3. I'd prefer a shell builtin instead of "readlink". Any suggestions for improvement are welcome. Ciao Dominik ^_^ ^_^ -- Dominik Vogt IBM Germany