zsh-users
 help / color / mirror / code / Atom feed
* directory alias
@ 2013-12-04  3:21 shawn wilson
  2013-12-04  4:41 ` TJ Luoma
  2013-12-04  7:06 ` Dominik Vogt
  0 siblings, 2 replies; 7+ messages in thread
From: shawn wilson @ 2013-12-04  3:21 UTC (permalink / raw)
  To: Zsh Users

not sure if this is really a 'zsh thing' but I'm looking for a way to
create aliases for a command. I don't want a bunch of symlinks in my
home directory, and I don't want a universal alias for each directory
I commonly cd into. What I want is a way to do:
cd foo
and it go to ~/some/deep/directory/tree/foo
and
cd bar
and it go to /usr/local/some/path/bar

Is there some zsh-ism (or better bash-ism that also works in zsh so
that this works on systems I maintain without zsh) to do this without
symlinks?


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: directory alias
  2013-12-04  3:21 directory alias shawn wilson
@ 2013-12-04  4:41 ` TJ Luoma
  2013-12-04  5:22   ` shawn wilson
  2013-12-04 15:25   ` Christoph (Stucki) von Stuckrad
  2013-12-04  7:06 ` Dominik Vogt
  1 sibling, 2 replies; 7+ messages in thread
From: TJ Luoma @ 2013-12-04  4:41 UTC (permalink / raw)
  To: shawn wilson; +Cc: Zsh Users

[-- Attachment #1: Type: text/plain, Size: 1293 bytes --]

I make variables for directories I use a lot

db="$HOME/Dropbox"

bin="$db/bin"

and then I can use that to either move files (mv foo $bin) or 'cd' to them
just by typing the variable "$db" and hitting enter.

But if that's what you mean by a "universal alias", then you'd have to do
something else.

You could make your own `cd` function

function cd {

if [ "$#" = "0" ]
then
# if no arg, go to $HOME
 chdir "$HOME"
else
 if [ -d "$@" ]
then
# if the arg is a valid directory, go there
 chdir "$@"
else
case "$@" in
 bar)
chdir  /usr/local/some/path/bar
;;

foo)
chdir ~/some/deep/directory/tree/foo

;;
 *)
echo "chdir: no such file or directory: $@"
 return 1
;;
esac
 fi
fi
}




On Tue, Dec 3, 2013 at 10:21 PM, shawn wilson <ag4ve.us@gmail.com> wrote:

> not sure if this is really a 'zsh thing' but I'm looking for a way to
> create aliases for a command. I don't want a bunch of symlinks in my
> home directory, and I don't want a universal alias for each directory
> I commonly cd into. What I want is a way to do:
> cd foo
> and it go to ~/some/deep/directory/tree/foo
> and
> cd bar
> and it go to /usr/local/some/path/bar
>
> Is there some zsh-ism (or better bash-ism that also works in zsh so
> that this works on systems I maintain without zsh) to do this without
> symlinks?
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: directory alias
  2013-12-04  4:41 ` TJ Luoma
@ 2013-12-04  5:22   ` shawn wilson
  2013-12-04  7:21     ` Bart Schaefer
  2013-12-04 15:25   ` Christoph (Stucki) von Stuckrad
  1 sibling, 1 reply; 7+ messages in thread
From: shawn wilson @ 2013-12-04  5:22 UTC (permalink / raw)
  To: TJ Luoma; +Cc: Zsh Users

Ah, of course. Thanks for the idea... I feel stupid.

On Tue, Dec 3, 2013 at 11:41 PM, TJ Luoma <luomat@gmail.com> wrote:
>

> function cd {
>
> if [ "$#" = "0" ]
> then
> # if no arg, go to $HOME
> chdir "$HOME"
> else
> if [ -d "$@" ]
> then
> # if the arg is a valid directory, go there
> chdir "$@"

elsif [ -n "${$@}" ] && [ -d "${$@}" ]
then
  chdir "${$@}"
else

> echo "chdir: no such file or directory: $@"
> return 1
> ;;
> esac
> fi

> }

If I could only inject variables into the function like:
local $cd::foo="/usr/local/foo"

so I could do that from the command line and wouldn't have any
namespace conflicts, that'd be perfect. But, I can live with global I
guess....

>
>
>
>
> On Tue, Dec 3, 2013 at 10:21 PM, shawn wilson <ag4ve.us@gmail.com> wrote:
>>
>> not sure if this is really a 'zsh thing' but I'm looking for a way to
>> create aliases for a command. I don't want a bunch of symlinks in my
>> home directory, and I don't want a universal alias for each directory
>> I commonly cd into. What I want is a way to do:
>> cd foo
>> and it go to ~/some/deep/directory/tree/foo
>> and
>> cd bar
>> and it go to /usr/local/some/path/bar
>>
>> Is there some zsh-ism (or better bash-ism that also works in zsh so
>> that this works on systems I maintain without zsh) to do this without
>> symlinks?
>
>


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: directory alias
  2013-12-04  3:21 directory alias shawn wilson
  2013-12-04  4:41 ` TJ Luoma
@ 2013-12-04  7:06 ` Dominik Vogt
  1 sibling, 0 replies; 7+ messages in thread
From: Dominik Vogt @ 2013-12-04  7:06 UTC (permalink / raw)
  To: zsh-users

On Tue, Dec 03, 2013 at 10:21:53PM -0500, shawn wilson wrote:
> What I want is a way to do:
> cd foo
> and it go to ~/some/deep/directory/tree/foo
> and
> cd bar
> and it go to /usr/local/some/path/bar
> 
> Is there some zsh-ism (or better bash-ism that also works in zsh so
> that this works on systems I maintain without zsh) to do this without
> symlinks?

Named directories.

  $ hash -d foo=~/some/deep/directory/tree/foo
  $ hash -d bar=/usr/local/some/path/bar
  cd ~foo
  cd ~bar

Personally I prefer aliases like

  alias cfoo "cd ~/some/deep/directory/tree/foo"

as I don't like to have the shortcuts for manually named dirs in
the prompt.  And actually finding these cd commands from the
history works automatically without having to define aliases or
hash table entries manually.

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt
IBM Germany


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: directory alias
  2013-12-04  5:22   ` shawn wilson
@ 2013-12-04  7:21     ` Bart Schaefer
  0 siblings, 0 replies; 7+ messages in thread
From: Bart Schaefer @ 2013-12-04  7:21 UTC (permalink / raw)
  To: Zsh Users

On Dec 3, 10:21pm, shawn wilson wrote:
> Subject: directory alias
>
> not sure if this is really a 'zsh thing' but I'm looking for a way to
> create aliases for a command. I don't want a bunch of symlinks in my
> home directory, and I don't want a universal alias for each directory
> I commonly cd into.

Er, perhaps what you want is $CDPATH?

% CDPATH=$HOME/some/deep/directory/tree:/usr/local/some/path
% cd foo

In zsh you can maintain this as an array using lower-case $cdpath, but
both bash and zsh support the colon-separated-string form as $CDPATH
and zsh automatically ties that to the array.

On Dec 4, 12:22am, shawn wilson wrote:
>
> On Tue, Dec 3, 2013 at 11:41 PM, TJ Luoma <luomat@gmail.com> wrote:
> >
> 
> > function cd {
> >
> > if [ "$#" = "0" ]
> > then
> > # if no arg, go to $HOME
> > chdir "$HOME"
> > else
> > if [ -d "$@" ]
> > then
> > # if the arg is a valid directory, go there
> > chdir "$@"
> 
> elsif [ -n "${$@}" ] && [ -d "${$@}" ]

[ -n "${@}" ] is almost always going to be true here because you've
already started with [ $# = 0 ] up at the top.  You'd have to have
intentionally done

% cd ""

to get $# != 0 and "${@}" empty.  (Also, "elsif" is perl, it's "elif"
in shell.)

} If I could only inject variables into the function like:
} local $cd::foo="/usr/local/foo"

This is exactly what the zstyle mechanism was created for, to simulate
scopes.  The completion system happens to use zstyle in a particular
manner but the mechanism is completely general; you can make up your
own style rules and use them in your own functions.  If you happen to
like the perl double-colon:

zstyle cd::foo target ~/some/deep/directory/tree/foo
zstyle cd::bar target /usr/local/some/path/bar

cd() {
  local dest
  if zstyle -s "cd::$1" target dest && [[ -d $dest ]]
  then chdir $dest
  else chdir "$@"
  fi
}

One interesting thing about zstyle is that you assign values to a
pattern and then look them up with a fixed context (like a package
scope) that is matched against the pattern in order of decreasing
specificity, so you can make a fallback case with (in this example)
the pattern "cd::*".

Another other interesting thing is that the value can be eval'd in
the context where the style is looked up, so you can refer to the
local variables of the calling function.  Combining these gives us
a nifty fail-safe for the function above:

zstyle -e 'cd::*' target 'reply=( $HOME/${1-.} )'

(The single-quoting is important.)

In this example, this means that any argument to "cd" (forming the
context "cd::$1") for which you have not defined a specific "target"
zstyle, has $HOME prefixed to it, and when $1 is empty the result
is "$HOME/." so "cd" with no argument changes to the home directory.

Of course you get nearly all of this for free with $CDPATH, so you
probably don't need to go to all that trouble, especially if you want
something that also works in bash.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: directory alias
  2013-12-04  4:41 ` TJ Luoma
  2013-12-04  5:22   ` shawn wilson
@ 2013-12-04 15:25   ` Christoph (Stucki) von Stuckrad
  2013-12-06  7:25     ` shawn wilson
  1 sibling, 1 reply; 7+ messages in thread
From: Christoph (Stucki) von Stuckrad @ 2013-12-04 15:25 UTC (permalink / raw)
  To: zsh-users

On Tue, 03 Dec 2013, TJ Luoma wrote:

> > I commonly cd into. What I want is a way to do:
> > cd foo
> > and it go to ~/some/deep/directory/tree/foo
> > and
> > cd bar
> > and it go to /usr/local/some/path/bar

IF all the dirs you "cd into" are different, simply
mention all their parents in CDPATH=/.../...1:/.../...2:...:...
and 'cd' will walk these until it finds the given dir.
If you have names more than once, left to right will win.

Stucki

-- 
Christoph von Stuckrad      * * |nickname |Mail <stucki@mi.fu-berlin.de> \
Freie Universitaet Berlin   |/_*|'stucki' |Tel(Mo.,Mi.):+49 30 838-75 459|
Mathematik & Informatik EDV |\ *|if online|  (Di,Do,Fr):+49 30 77 39 6600|
Takustr. 9 / 14195 Berlin   * * |on IRCnet|Fax(home):   +49 30 77 39 6601/


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: directory alias
  2013-12-04 15:25   ` Christoph (Stucki) von Stuckrad
@ 2013-12-06  7:25     ` shawn wilson
  0 siblings, 0 replies; 7+ messages in thread
From: shawn wilson @ 2013-12-06  7:25 UTC (permalink / raw)
  To: Zsh Users

Thank y'all for CDPATH - I didn't know about that and it's real cool.

However, after using it for a few days, I realize I want something
like command-t (vim) for the command line.

I just found two promising projects:
https://github.com/clvv/fasd
https://github.com/joelthelion/autojump

The later is probably not what I'm looking for (a wrapper around cd).
However, the former (fasd) is promising. It works with both bash and
zsh and works with other commands. It does not, however, seem to have
been maintained for the past year (and has newer issues).

I also need to look farther into zstyle. However, since I spend a good
portion of my day on boxes in accounts where I'd probably get shot (or
more like yelled at :) ) if i changed the shell to zsh, if I went that
route, I'd still want a solution for bash (sorta OT here, but a
concern none the less).

So, that's where I'm at. And again, thanks for the help.

On Wed, Dec 4, 2013 at 10:25 AM, Christoph (Stucki) von Stuckrad
<stucki@mi.fu-berlin.de> wrote:
> On Tue, 03 Dec 2013, TJ Luoma wrote:
>
>> > I commonly cd into. What I want is a way to do:
>> > cd foo
>> > and it go to ~/some/deep/directory/tree/foo
>> > and
>> > cd bar
>> > and it go to /usr/local/some/path/bar
>
> IF all the dirs you "cd into" are different, simply
> mention all their parents in CDPATH=/.../...1:/.../...2:...:...
> and 'cd' will walk these until it finds the given dir.
> If you have names more than once, left to right will win.
>
> Stucki
>
> --
> Christoph von Stuckrad      * * |nickname |Mail <stucki@mi.fu-berlin.de> \
> Freie Universitaet Berlin   |/_*|'stucki' |Tel(Mo.,Mi.):+49 30 838-75 459|
> Mathematik & Informatik EDV |\ *|if online|  (Di,Do,Fr):+49 30 77 39 6600|
> Takustr. 9 / 14195 Berlin   * * |on IRCnet|Fax(home):   +49 30 77 39 6601/


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-12-06  7:25 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-12-04  3:21 directory alias shawn wilson
2013-12-04  4:41 ` TJ Luoma
2013-12-04  5:22   ` shawn wilson
2013-12-04  7:21     ` Bart Schaefer
2013-12-04 15:25   ` Christoph (Stucki) von Stuckrad
2013-12-06  7:25     ` shawn wilson
2013-12-04  7:06 ` Dominik Vogt

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).