DragonFly On-Line Manual Pages

Search: Section:  


apparix(1)			USER COMMANDS			    apparix(1)

  NAME
      apparix -	augmenting cd with bookmarks

  SYNOPSIS
      Apparix  allows you to bookmark directories and later jump to them using
      the mark.	 By default apparix acts as a replacement for cd  and  can  be
      used  in the same	manner,	including the special behaviour	for cd without
      argument and cd -.  It is	possible to directly jump to subdirectories of
      a	bookmarked directory.  The contributed bash  completion	 code  facili-
      tates  completion	both on	bookmarks and directories, but can be adjusted
      to accomodate other preferences.

      This manual page suffers from an excess in verbosity  due	 to  the  many
      examples,	 explanations  of the bells and	whistles, and comparisons with
      other approaches to bookmarking. The fundamental	idea  is  simply  that
      typing  a	string of your own choosing takes you to the directory associ-
      ated with	it.  Apparix does little more than maintaining a list of  keys
      and  values.   It	 obtains directory names and listings, associates path
      names (values) with bookmarks (keys), and	has some facilities for	manip-
      ulating keys and values. The functions involving apparix	(bm,  to,  and
      portal)  provide	the user interface.  Other functions, als (apparix ls)
      and  ae  (apparix	 edit)	are  discussed	on  the	 main	apparix	  page
      http://micans.org/apparix.

  GETTING STARTED
      Install	apparix.   This	 should	 be  as	 easy  as  ./configure	--pre-
      fix=$HOME/local && make &&  make	install,  or  perhaps  a  pre-packaged
      apparix  is  available for your system.  Then get	hold of	the to,	bm and
      portal shell handles. These are either aliases or	functions depending on
      your shell. Currently csh-style shells and bash are supported.  Get  the
      ones  you	 need  preferably from http://micans.org/apparix/#shell. For a
      more limited set of commands either visit	the FILES  section,  or	 issue
      apparix  --shell-examples.  Activate  them  by  simply pasting them in a
      shell or adding them to the appropriate resource file, e.g. $HOME/.cshrc
      or $HOME/.bashrc (do not forget to source	the resource file).  The  han-
      dles  to,	 bm  and  portal can of	course be changed to any name desired.
      With these preliminaries,	the following is a  mock-up  shell  navigation
      session.

	 > pwd
	 /home/eez/cvs/xyz/tfa/faq/zut/bar/foo
	 > ls
	 src/ doc/ CVS/	bin/
	 > bm xkr	# bookmark as xkr (funny name though)
	 > bm		# bookmark as foo (trailing component is default)
      (later)
	 > to xkr	# cd to	/home/eez/cvs/xyz/tfa/faq/zut/bar/foo
      (alternatively)
	 > to xkr src	# cd to	/home/eez/cvs/xyz/tfa/faq/zut/bar/foo/src
      (alternatively)
	 > to foo	# cd to	/home/eez/cvs/xyz/tfa/faq/zut/bar/foo

      (later)
	 > ls
	 aap pyu/ qua tim/ zut/
	 > pwd
	 /home/eez/another/branch/deep/down/under
	 > portal	# bookmark as portal, imports tim zut pyu bookmarks
	 added flock of	3 in portal /home/eez/another/branch/deep/down/under

      (later)
	 > to zut	# cd to	/home/eez/another/branch/deep/down/under/zut

      (later)
	 > apparix   # show all	bookmarks
	 --- portals
	 e		/home/eez/another/branch/deep/down/under
	 --- expansions
	 j pyu		/home/eez/another/branch/deep/down/under/pyu
	 j tim		/home/eez/another/branch/deep/down/under/tim
	 j zut		/home/eez/another/branch/deep/down/under/zut
	 --- bookmarks
	 j xkr		/home/eez/cvs/xyz/tfa/faq/zut/bar/foo
	 j foo		/home/eez/cvs/xyz/tfa/faq/zut/bar/foo

      In  the  last  example apparix simply shows all its bookmarks. The first
      batch shows portals. The second batch shows secondary bookmarks expanded
      from portals. The	third batch shows all regular bookmarks.

      In the default definitions of to it falls	back to	regular	 cd  behaviour
      in  case	a  mark	 is  not found.	This is	done by	instructing apparix to
      check whether the	mark exists as the name	of a directory.	It is possible
      to do this either	before or after	bookmark lookup, or  not  at  all.  By
      default  the  bash completion code takes into account both bookmarks and
      directories.

      Apparix also allows subdirectory specification of	bookmarked  locations.
      If  this	is combined with the bash completion code it yields a powerful
      way of navigating	container directories, i.e. directories	that contain a
      large number of subdirectories. Refer to the subdirectory	 specification
      section.

      Further options
      [--add-mark  (add	 jump  bookmark)] [--add-portal	(add portal bookmark)]
      [-sm <mark> (squash repeated marks)] [-sd	<mark> (squash repeated	desti-
      nations)]	[-lm <mark> (list bookmarks with this mark)] [-ld <mark> (list
      destinations with	mark indirection)] [-favour <list> (duplicate  resolu-
      tion policy)] [-pick <num> (immediate duplicate resolution)] [-purge pat
      (delete  bookmarks)] [-purge-mark	(pat)] [-d (dump resource file to STD-
      OUT)] [-l	(list available	jumps)]	[-u <num>  (remove  last  <num>	 addi-
      tions)]  [--rehash (re-expand portal bookmarks)] [--bu (create backup of
      resource file)] [-bu <fname> (create backup  in  <fname>)]  [--cwd  (use
      getcwd(3), not pwd(1))] [--shell-examples	(output	example	macros)]

  DESCRIPTION
      Apparix  combines	 the  properties  of the cdargs	utility	and the	CDPATH
      shell mechanism for fast navigation through  the	file  system.  It  can
      additionally  act	as the regular cd command. It is especially useful for
      visiting and documenting both often- and rarely-used locations.  Apparix
      enables  you to attach marks to locations	and jump to those locations by
      loading the mark.	Marking, unmarking and jumping are  simple  operations
      that  are	performed in the shell.	All actions take effect	immediately in
      all shells running. By setting up	convenient  aliases  for  marking  and
      jumping the file system can be navigated in a fast and intuitive manner.
      The  FILES  section  lists aliases for csh-type shells and functions for
      bash, including the setup	to equip the to	function with argument comple-
      tion in bash.

      This section contains some examples of the most common uses of  apparix.
      OPTIONS  contains	 a  list  of additional	options	available for listing,
      pruning, and squashing bookmarks.

      NOTES features a brief discussion	of  the	 advantages  of	 apparix  over
      other  approaches	 such as setting up aliases for	often visited directo-
      ries, using  symlinks,  CDPATH,  or  a  combination  of  these.  HISTORY
      explains the difference between cdargs and apparix.  The sections	dupli-
      cate resolution, subdirectory specification, tab completion, copying and
      moving files, listing bookmarks, and replacing cd	further	below are also
      recommended reading.

      Apparix works in a manner	similar	to cdargs. One usually invokes apparix
      by  using	pre-defined aliases. Here they will be called bm for bookmark,
      portal for a CDPATH-style	bookmark and to	for initiating	an  apparition
      (aka  jump).  These aliases are found below in the FILES section and can
      also be obtained by issuing

      apparix --shell-examples

      Suppose your user	name is	eez and	your home directory is /home/eez.  You
      often visit a  directory	called	/home/eez/cvs/xyz/tfa/faq/zut/bar/foo.
      This is how to create and	use a bookmark for foo

      /home/eez/cvs/xyz/tfa/faq/zut/bar/foo> bm	foo
      added: foo -> /home/eez/cvs/xyz/tfa/faq/zut/bar/foo
      /home/eez/cvs/xyz/tfa/faq/zut/bar/foo> cd
      /home/eez> to foo
      /home/eez/cvs/xyz/tfa/faq/zut/bar/foo>

      If  one  bookmarks  a directory by its trailing component	as happened in
      this case, it is not necessary to	specify	the mark. By  default  apparix
      will use the trailing component as the mark. So

      /home/eez/cvs/xyz/tfa/faq/zut/bar/foo> bm
      added: foo -> /home/eez/cvs/xyz/tfa/faq/zut/bar/foo

      gives the	same result.

      Another  scenario	 is where you have some	directory that contains	a lar-
      gish number of subdirectories, all of which you would like to have book-
      marked.  If the  subdirectories  have  distinctive  names	 this  can  be
      achieved	in one fell swoop by marking the parent	directory as a portal.
      This is similar to adding	the parent directory to	the CDPATH environment
      variable,	except that apparix bookmarks are not part of  the  cd	names-
      pace. It is argued in NOTES that this is a good thing.  Consider this:

      /home/cvs/bagger/boemel/mcl/mcl/src> ls
      alien/	   CVS/		impala/	     Makefile.am  README       shmcx/
      attic/	   giraffe/	lib/	     Makefile.in  shcl/	       shmx/
      contrib/	   gmon.out	Makefile     mcl/	  shmcl/       taurus/

      Some  of	the  subdirectories have not-so-distinct names such as contrib
      and attic, but they happen to be the directories least  visited.	 Issu-
      ing:

      /home/cvs/bagger/boemel/mcl/mcl/src> portal
      [apparix]	expanded 1 portal to 12	destinations

      yields  all of the subdirectories	as destinations	bookmarked by the last
      component	of their path name.  Incidentally, directory names such	as CVS
      can be explicitly	excluded from expansion	 by  setting  the  environment
      variable APPARIXEXCLUDE appropriately - refer to section ENVIRONMENT.

      Bookmarks	 resulting  from  portal  expansion  are  kept	in  a separate
      resource file (see FILES). Portal	expansions can be recreated by issuing

      apparix --rehash

      This is useful to	reflect	a change in  the  directory  naming  structure
      underneath a portal.

  duplicate resolution
      Apparix  allows  identical  bookmarks  to	 point to different locations.
      When asked to visit such a bookmark it will by default present a list of
      options.

      The -favour <list> option	can be used to automate	resolution. <list>  is
      a	 sequence of single characters,	described further below.  The order in
      which they are given denote the order  in	 which	resolution  rules  are
      applied. This option is typically	used in	the definition of the to func-
      tion/alias or in the bash	completion code.

      The  -pick <num>	option	is  used  to resolve to	a particular directory
      directly.	This is	useful when you	already	know where you want to go, and
      typically	used for the now bookmark in conjunction with the bash	whence
      function.	 Use whence now	to see an indexed list of now bookmarks. It is
      possible to go to	the desired directory by entering the bookmark	index.
      It is possible to	bypass the selection step by specifying	whence now N.

      Duplicates  are allowed because it can be	useful to overwrite a bookmark
      with a new location. The old bookmark is kept as a matter	of policy. Use
      -sm to explicitly	squash duplicates.

      l	level; prefer paths with fewer components.

      L	reverse	of the above.

      o	bookmark order;	prefer older entries.  Entries	appearing  earlier  in
	the  file  are	considered  older, but the actual date of creating the
	bookmark is not	stored.	 Refer to editing bookmarks for	more  informa-
	tion.

      O	reverse	of the above.

      r	regular	first; prefer regular bookmarks	over portal expansion.

      R	reverse	of the above.

      If  there	 are  still  ties  after the specified rules have been applied
      apparix will simply take the first matching option. This behaviour  can-
      not  be further specified	as the program uses a non-stable ordering rou-
      tine.

      It is an absolute	prerequisite that -favour is used in the bash  comple-
      tion  code.  Otherwise  completion will fail (for	a duplicated bookmark)
      while apparix is waiting for input. Refer	to the tab completion descrip-
      tion below.

  subdirectory specification
      When jumping (apparating)	you can	 specify  an  additional  subdirectory
      after the	bookmark. Apparix will append the subdirectory to the destina-
      tion.

      This is useful for projects with directory nodes corresponding with ver-
      sions. Assume you	have a directory structure such	as this:

	 /x/y/z/OpusMagnum/v1/
	 /x/y/z/OpusMagnum/v2/
	 /x/y/z/OpusMagnum/v3/

      It  is  probably	easiest	to simply bookmark the OpusMagnum directory in
      some way (say with bookmark om). You can then issue 'to om v2'  to  jump
      to  OpusMagnum/v2.  This is more flexible	and maintainable than creating
      bookmarks	om1, om2, om3.	One could add OpusMagnum as a portal, but with
      generic names such as v1 this is not a very extendible approach.

      See also the tab completion description below - it is possible  to  tab-
      complete on subdirectories of the	apparix	jump directory.

  tab completion
      The  bash	 tab completion	code does two things. First, it	is possible to
      tab-complete on apparix bookmarks	themselves, showing a listing  of  all
      available	bookmarks (or iterating	through	them in	cyclic mode, depending
      on  your bash settings). Second, once a bookmark has been	given tab com-
      pletion will list	or iterate over	all the	subdirectories of  the	direc-
      tory  associated with that bookmark. Specifying a	string after the book-
      mark will	limit tab-completion to	directories matching the shell-pattern
      in string.  Very useful.

      Be careful to not	remove the -favour list	option from the	 bash  comple-
      tion code. It is necessary to resolve duplicate bookmarks.

  editing bookmarks
      Apparix appends new bookmarks to the end of the .apparixrc file. Nothing
      stops  you from editing the file,	and this is in fact recommended	if for
      example you need to get rid of a bookmark	and neither of -purge, -purge-
      mark, -sd, -sm fulfills your needs. It was an easy design	choice not  to
      equip apparix with editor	capabilities.

  copying and moving files
      It  is  straightforward  to  copy	 or  move  files to locations known by
      apparix. Examples:

      BASH and variants
	 cp FOO	$(apparix zoem)
	 mv BAR	$(apparix zoem doc)
	 mv BAR	$(apparix zoem doc)/test

      CSH and variants
	 cp FOO	`apparix zoem`
	 mv BAR	`apparix zoem doc`/test

  listing bookmarks
      Simply issuing apparix gives you a list of bookmarks grouped into	 three
      categories,  portals,  expansions,  and  bookmarks. Use the -d option to
      dump the resource	file to	STDOUT exactly as it is. This  can  be	useful
      when  you	intend to use the -u num option	to remove bookmarks or portals
      that were	most recently added.

      Use -l to	list all available  jumps  without  their  destinations.   The
      jumps  are  grouped  into	 expansions resulting from portals and regular
      bookmarks.

  replacing cd
      With the supplied	definition(s) of to, apparix will  first  see  whether
      the  mark	is the name of a directory, accessible from the	current	direc-
      tory.  A directory is accessible if it would be a	valid argument to  cd,
      so  it  need not necessarily be a	subdirectory of	the current directory.
      If the mark is not an accessible directory, apparix will then try	to  do
      a	 lookup	 of  the  mark	in  the	 bookmark files. This behaviour	can be
      inverted to do the lookup	first and the  current	directory  thereafter.
      Both  modes  can	be used	to make	to a drop-in replacement for cd. Addi-
      tionally and again similar to cd,	'to -' will take you to	 the  previous
      directory,  and  specifying  to  without arguments will take you to your
      home directory.

      The bash completion code acts accordingly, and should transparently com-
      plete on both marks and directories.

  OPTIONS
      For bookmarking and jumping apparix is best invoked by using the aliases
      (tcsh-variants) or functions (sh/bash) listed in FILES.  Apparix	has  a
      few  options  that  are useful for pruning, squashing and	rehasing book-
      marks. These are best issued by invoking apparix directly.

      If you are interested in marks or	destinations matching a	 certain  pat-
      tern,  simply  issue  apparix without arguments and pipe it through your
      program of choice.

      Unary options (those without arguments) usually start with  two  hyphens
      except  for standardized options such as -h.  Options that take an argu-
      ment can be converted  to	 a  unary  key=value  notation,	 e.g.  -purge-
      mark foo is equivalent to	--purge-mark=foo.

      When invoked without arguments apparix will simply dump its bookmarks.

      --add-mark (add jump bookmark)
	This  options expects trailing [mark [destination]] argument(s).  Both
	arguments are optional.	If a single argument is	 given	it  is	inter-
	preted	as  a bookmark name to be mapped to the	current	directory.  If
	two arguments are given	the last  argument  is	taken  as  the	target
	directory.  If	no  argument  is given apparix will enlist the current
	directory as a target bookmarked by  the  trailing  component  of  the
	directory path.

      --add-portal (add	portal bookmark)
	This  option  enlists a	directory as a portal and adds all subdirecto-
	ries as	bookmarks. The name of the bookmark is simply the name of  the
	subdirectory.  By  default the current directory is added as a portal.
	An optional trailing argument will override this behaviour and instead
	be interpreted as the portal location.

      --try-current-first (try current directory before	lookup)
	This option is useful in the definition	 of  the  to  wrapper.	Before
	attempting  any	lookup of the mark, apparix tests whether the supplied
	mark exists as a subdirectory in the current directory.	 If  it	 does,
	the mark is simply expanded to itself.

      --try-current-last (try current directory	if lookup fails)
	This  option  is useful	in the definition of the to wrapper. If	lookup
	of the mark fails, apparix tests whether the supplied mark exists as a
	subdirectory in	the current directory. If it does, the mark is	simply
	expanded to itself.

      --notify-current (notify if current directory is used)
	This  option is	useful in the definition of the	bf wrapper in conjunc-
	tion with either --try-current-first or	 --try-current-last.   If  the
	mark  is  found	 as  a	subdirectory in	the current directory, apparix
	notifies the user of this fact (on the diagnostic stream).

      -sm <mar>	(squash	repeated marks)
	Apparix	will squash bookmarks with mark	<mark>.	 This is useful	when a
	mark points to a versioned project, and	the project is	updated	 to  a
	new version and	a new directory.

	Apparix	 will  by  default keep	the last one occurring in the resource
	file (corresponding with -favour O). This option respects the  -favour
	option	if  given.  Duplicating	an already existing mark can be	useful
	when it	identifies  a  project	for  which  the	 underlying  directory
	changes	 every	once  in  a while (e.g.	the project is downloaded from
	external sources and  comes  with  version  information).  It  is  not
	strictly  necessary to squash bookmarks	since to functions/macros that
	are equipped with the -favour option will generally resolve  duplicate
	matches.

      -sd <mark> (squash repeated destinations)
	All  other  bookmarks with the same destination	as <mark> are removed.
	This is	useful when a given destination	has  acquired  multiple	 book-
	marks and you decide to	settle on a favourite.

      -lm <mark> (list bookmarks with this mark)
	It  lists  all	bookmarks <mark> (noting that it may point to multiple
	locations).

      -ld <mark> (list repeated	destinations)
	This lists all bookmarks <mark>	(noting	that it	may point to  multiple
	locations)  and	 additionally lists all	other bookmarks	that share the
	destination with any of	the first bookmarks. This allows one  to  pre-
	dict the effect	of issuing apparix -sd <mark>.

      -purge pat (delete bookmarks)
	This  deletes  bookmarks  where	 destination matches pat.  All deleted
	bookmarks are printed to STDOUT. Thus if you regret deleting  a	 book-
	mark  it  is  easy  to	add  it	 back. Portal specifications are never
	affected.

      -purge-mark (pat)
	This deletes bookmarks where mark matches pat.	Portal	specifications
	are never affected.

      -d (dump resource	file to	STDOUT)
	Dump resource file to STDOUT.

      -l (list available jumps)
	List available jumps paragraph-style. Portal specifications themselves
	are excluded, and regular jumps	and jumps resulting from portal	expan-
	sions are listed under different headers.

      -u <num> (remove last <num> additions)
	Remove	last  <num> additions. Portal specifications and regular jumps
	are treated alike.

      --rehash (re-expand portal bookmarks)
	Apparix	will reread the	resource file and reexpand  portal  locations.
	Useful	if  directories	have been added, renamed, or removed. Refer to
	section	ENVIRONMENT for	 the  effect  that  the	 environment  variable
	APPARIXEXCLUDE has on portal expansion.

      -favour <list> (set duplicate resolution policy)
      -pick <num> (immediate duplicate resolution)
	These options have a section to	themselves. Refer to duplicate resolu-
	tion.

      --cwd (use getcwd(3), not	pwd(1))
	By  default aparix uses	the program pwd(1) rather than the system call
	getcwd(3). On some systems it was found	that  the  latter  results  in
	paths  that  contain machine-specific mount components.	 Appparix will
	use getcwd(3) when --cwd is used.

      --shell-examples (output example macros)
	This outputs example macros. They are also listed in the FILES section
	though.

      --bu (create backup of the resource file)
	This creates the backup	file in	.apparixrc.bu.

      -bu fname	(create	backup of the resource file)
	This creates the backup	file in	fname. Use -d or -bu - to dump to STD-
	OUT.

      -h (show synopsis)
      --apropos	(show synopsis)
	print synopsis of all options

  ENVIRONMENT
      APPARIXEXCLUDE
	This variable specifies	exclusion behaviour when portals are  expanded
	with the --rehash option.  It has the following	syntax:

	   <[:,][<string>]>+

	That  is,  a  list  of	names  with each name preceded by a colon or a
	comma.	A colon	indicates that <string>	triggers exclusion  of	direc-
	tory  names for	which the trailing component is	identical to <string>.
	A comma	indicates that <string>	triggers exclusion of directory	 names
	for  which  the	 trailing  component contains <string> as a substring.
	Consider:

	   export APPARIXEXCLUDE=:CVS:lib,tmp	     # A - example
	   export APPARIXEXCLUDE=,		     # B - curiosity

	The first excludes directory names CVS and lib and any directory  name
	having	tmp  as	a substring.  The second example will effectively dis-
	able portals, as it speficies the empty	string which is	a substring of
	all strings.

      APPARIXTAG
	This variable, if set, is incorporated into the	names of  the  apparix
	resource  files.  By  default these are	.apparixrc and .apparixexpand.
	When APPARIXTAG	is  set	 to  <tag>  they  become  .<tag>apparixrc  and
	.<tag>apparixexpand.  This can be used e.g. to maintain	different sets
	of bookmarks on	different host machines.

      APPARIXLOG
	This  variable,	if set,	is interpreted as the name of a	log file.  The
	log file keeps track of	all newly added	bookmarks and portals  without
	ever  deleting anything, in the	same format as the .apparixrc file. If
	this variable is not set nothing is tracked.

      APPARIXPURGE
	This changes the way apparix dumps purged  bookmarks  to  STDOUT.   By
	default	 they are dumped as command lines that will reimport the book-
	marks if issued	(i.e. cut and pasted).	By setting this	variable to  1
	purged bookmarks are dumped in the format used in the .apparixrc file.

  FILES
      You  should use aliases or functions to make apparix really useful.  Get
      them from	apparix	by giving it the --shell-examples option, or from fur-
      ther below.  Note	the fragment that provides to argument	completion  in
      bash.

      $HOME/.apparixrc
	This is	the primary resource file. There is usually no need to edit it
	by  hand.  Sometimes  it  can  be  useful to edit by hand to remove an
	unwanted bookmark; refer to editing bookmarks.

      $HOME/.apparixrc.bu
	Apparix	creates	a back-up file whenever	it is asked to remove  entries
	from it. Refer to editing bookmarks for	options	inducing removal.  You
	can  explicitly	 require  a  backup  to	 be  made by either of --bu or
	-bu fname.

      $HOME/.apparixexpand
	This contains bookmarks	that are expanded from portals.	 A  portal  is
	simply	some  directory.  The names of all subdirectories are taken as
	bookmarks that point to	those subdirectories.  This file can be	recre-
	ated by	issuing

	apparix	--rehash

      $HOME/.bashrc
      $HOME/.tcshrc
      $HOME/.cshrc
	Add the	code you need to the appropriate rc file. The macros and func-
	tions below point cd(1)	in the right direction.

      BASH-style functions
      ---
      function to () {
	if test	"$2"; then
	  cd "$(apparix	--try-current-first -favour rOl	"$1" "$2" || echo .)"
	elif test "$1";	then
	  if test "$1" == '-'; then
	    cd -
	  else
	    cd "$(apparix --try-current-first -favour rOl "$1" || echo .)"
	  fi
	else
	  cd $HOME
	fi
      }
      function bm () {
	if test	"$2"; then
	  apparix --add-mark "$1" "$2";
	elif test "$1";	then
	  apparix --add-mark "$1";
	else
	  apparix --add-mark;
	fi
      }
      function portal () {
	if test	"$1"; then
	  apparix --add-portal "$1";
	else
	  apparix --add-portal;
	fi
      }
      #	function to generate list of completions from .apparixrc
      function _apparix_aliases	()
      {	cur=$2
	dir=$3
	COMPREPLY=()
	nullglobsa=$(shopt -p nullglob)
	shopt -s nullglob
	if let $(($COMP_CWORD == 1)); then
	  # now	cur=<apparix mark> (completing on this)	and dir='to'
	  # Below will not complete on subdirectories. swap if so desired.
	  # COMPREPLY=(	$( cat $HOME/.apparix{rc,expand} | grep	"j,.*$cur.*," |	cut -f2	-d, ) )
	  COMPREPLY=( $( (cat $HOME/.apparix{rc,expand}	| grep "\<j," |	cut -f2	-d, ; ls -1p | grep '/$' | tr -d /) | grep "\<$cur.*" )	)
	else
	  # now	dir=<apparix mark> and cur=<subdirectory-of-mark> (completing on this)
	  dir=`apparix --try-current-first -favour rOl $dir 2>/dev/null` || return 0
	  eval_compreply="COMPREPLY=( $(
	    cd "$dir"
	    \ls	-d $cur* | while read r
	    do
	      [[ -d "$r" ]] &&
	      [[ $r == *$cur* ]] &&
		echo \"${r// /\\ }\"
	    done
	  ) )"
	eval $eval_compreply
	fi
	$nullglobsa
	return 0
      }
      #	command	to register the	above to expand	when the 'to' command's	args are
      #	being expanded
      complete -F _apparix_aliases to
      ---
      CSH-style	aliases
      ---
      #	The outcommented alias does not	supplant cd, the other one does.
      #	alias to    'cd	`(apparix -favour rOl \!* || echo -n .)`'
      alias to '(test "x-" =  "x\!*") && cd - || (test "x" !=  "x\!*") && cd `(apparix --try-current-first -favour rOl \!* || echo -n .)` || cd'
      alias bm	 'apparix --add-mark \!*'
      alias portal 'apparix --add-portal \!*'
      ---

      More elaborate setups are	possible. This CSH-style alias:

      alias to '(test "x" !=  "x\!*") && cd `(apparix -favour rOl \!* || echo -n .)` ||	apparix	-l'

      lists all	available jumps	if invoked without arguments.

  NOTES
      Below follow some	comments on other approaches to	 file  system  naviga-
      tion.  HISTORY explains the difference between the venerable cdargs pro-
      gram and apparix.

      CDPATH  is  only useful in cases where a given directory has subdirecto-
      ries with	distinctive names. It does not usually scale well  when	 there
      are more than a few paths	in CDPATH.

      Some people use aliases to jump to often visited directories.  I was one
      of  them	for a period of	ten years. The fact is,	those aliases are cum-
      bersome to create	and remove and they clutter up	the  alias  namespace.
      They  can	 clash	with  executable  names	when the alias includes	the cd
      part. This sometimes prohibits one from assigning	the  logical  bookmark
      to  a given location, especially when one	has a lot of source code loca-
      tions.  They can clash with directory names when the aliases just	expand
      to the location. This again means	that sometimes a  location  cannot  be
      assigned its logical bookmark.  I	have found that	setting	cd jumps aside
      in  their	 own namespace improves	file system navigation by a large fac-
      tor.

      It is also possible to create symlinks to	often  visited	files.	Again,
      creation	and removal of these are cumbersome.  One could	of course cre-
      ate shell	functions with a similar interface to  apparix	or  cdargs  to
      handle the symlink lifecycle.  On	Linux Weekly News nix suggested	to put
      these  symlinks  in a single directory and add that directory to CDPATH.
      This is quite a neat trick and effectively creates a bookmark navigation
      system.

      Still there are problems with the	above approach.	 One problem with  the
      symlink  approach	is that	they are a bit awkward to edit.	One could make
      a	utility	to wrap	around the problem, but	in the end the directory-with-
      symlinks would functionally be the same as apparix's .apparixrc resource
      file, only more of a kludge.   Another  problem  is  that	 symlinks  are
      awkard  when traversing the file system. They confuse the	notion of par-
      ent directory and	'cd ..'	mostly does the	unexpected. Sometimes '..' has
      a	different meaning to cd	than it	has to	another	 application,  as  one
      will  trace  back	 symlinks  and	the  other will	not.  Finally, a minor
      objection	is that	I find it convenient to	have bookmarks in  a  separate
      namespace	 than  that  of	 cd(1).	Jumps are magical and it is natural to
      invoke them by a different method. This is in fact how apparix  acquired
      its  CDPATH  behaviour. I	used CDPATH to jump to a few particular	source
      directories with distinct	names that  lay	 deeply	 hidden	 in  some  CVS
      directory.  Once	I  started  using  apparix however, I would mistakenly
      issue to rather than cd to jump to those locations. My brain  classified
      both types of jump in the	same category.

      Apparix  (and  cdargs)  have another use besides jumping,	namely annota-
      tion. Whenever I end up in an esoteric part of the file system and  need
      to make a	quick note of the location, I simply bookmark it.

      On  SlashDot,  that  eternal  source of wisdom or	alternatively the geek
      wheel of suffering, Clueless Moron offered the following gems.

	 mk() {	eval ${1:-MKPWD}=\"`pwd`\"; }
	 rt() {	eval cd	\"\$${1:-MKPWD}\";pwd; }

	 # type	"mk" (as in "mark") and	"rt" (as in "return") to mark
	 # a directory and later go back to it.
	 # Or give it a	name: do "mk foo", and later on	"rt foo"

      This of course is	a per-session mechanism, but noteworthy	for  its  sim-
      plicity.	I  am not sure whether csh-style shells	could offer an equiva-
      lent.

      A	feature	shared by apparix and cdargs is	that adding a bookmark immedi-
      ately takes effect in all	shells.	 There	is  no	need  to  source  some
      resource	file,  as the applications do this everytime they are invoked.
      It is fast, do not worry.

  BUGS
      The resource file	parsing	code  thinks  that  parentheses	 are  special.
      Also  records  are  currently  separated by commas. Accordingly, apparix
      will hitch if a path name	contains a parenthesis or a comma.

  AUTHOR
      Stijn van	Dongen.

  THANKS
      Stefan Kamphausen	wrote cdargs, the inspiration for apparix.

      Sitaram Chamarty fixed up	some of	the existing bash code,	and added  the
      tab completion part (basing this on similar code in cdargs). He does not
      garantuee	 predictable or	even pretty results if there are spaces	in the
      directory	names which you	attempt	to complete. AUTHOR would like to sub-
      mit that spaces in path names are	evil, and  that	 the  completion  code
      seems  to	 work  in their	evil presence anyway. Just don't put commas in
      path names.

      The autotooled build environment was modified from a template written by
      Joost van	Baal.

      Several people suggested to enable apparix to merge accessible  directo-
      ries and marks, but Matias Piipari phrased it the	most convincingly.

  HISTORY
      Apparix  was created to optimize a scenario that cdargs does not support
      very well, namely	where the mark (called needle  in  cdargs)  is	always
      known.  As  additional features apparix supports CDPATH-style behaviour,
      derived subdirectory specification, and transparent treatment  of	 book-
      marks and	directories, all integrated with bash tab completion. In other
      respects apparix is a much simpler application. cdargs offers menu-based
      navigation  of the file system and the bookmark list, which apparix does
      not.

  apparix 1.004, 11-062		    3 Mar 2011			      apparix(1)

Search: Section: