I've played with bash autocomplete now for a while, but couldn't find a solution for my problem. I have a project directory with subfolders like this:
- projects/ruby/project1
- projects/ruby/project2
- projects/rails/project3
- projects/html/project4
Now I want to have a command, call it cdproject
where I can cd
in any subfolder within my projects dir and subdirs. And this command should provide a autocomplete feature where I can type cdproject pr --> TAB TAB
and then get a list like ruby/project1
, ruby/project2
, rails/project3
…
My problem is how to handle the subdirs. The programm cdproject
looks like this
#!/bin/bash
cd $1
The cdproject-autocompletion.bash
looks like this
_cdproject()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts=$(ls ~/Dropbox/projects)
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
}
complete -o default -o nospace -F _o o
And inside my .bash_profile
I've sourced the cdproject-autocompletion.bash
with
source ~/cdproject-autocompletion.bash
So anyone an idea, how to achieve this? Maybe the opts
should return the subdir structure ruby/project1
but then the autocompletion should only work on the last part, the actual project name. And I have no idea how this is possible.
Best Answer
Reading deep into the question, you are looking for smoother ways to navigate the file tree from the command line.
Option 1: Use
CDPATH
E.g.,
CDPATH=".:~:~/projects/ruby:~/projects/rail:~/projects/html"
†Note: some people find it useful to include
..
inCDPATH
.Unfortunately
CDPATH
doesn't (always)‡ support autocompletion. There are ways to extend bash to do this. Google with terms "CDPATH" and "autocompletion".Admittedly this is a bit clunky. If there is a small set of parent directories you use, this isn't too bad.
You may have better success with
dirs
,pushd
, andpopd
. These take some time to get the hang of. Note thatpushd
andpopd
can take a numeric parameter.Also:
cd -
returns you to the previous directory. Repeating the command toggles between the two most recent directories.____________
† A lot of documents (including man pages) show
.
(dot; i.e., the current directory) as a component inCDPATH
. However, at least some shells seem to act as thoughCDPATH
ends with:.
, so, if you saycd foo
, you will get./foo
unless some other parent directory listed in yourCDPATH
contains afoo
. YMMV.‡ Editor's note: Cygwin seems to support
CDPATH
autocomplete out-of-the-box (running bash version "4.1.17(9)-release").