Skip to main content

cd under development packages nested folders without repeating yourself

To me Plone development environment means Fedora 12, terminator and vim. As I do lots of development in the shell there has been one annoying little thing which I'm tired of - cd:ing under development packages inner structure to where the actual code lives.


Doesn't seem much but if you repeat that many times a day you'll get tired of it. Of course you can always launch vim for the package root and open the file you wanted from there, but it's still extra effort.

Few weeks ago me and my colleague Jussi Talaskivi started to think that there has to be a script which takes you to your destination simply by parsing dotted name and using information from there to cd you to the correct place. After spending some time googling around we found none. Annoyed by this we decided to do this missing script by ourself.

Soon it turned out that this wasn't that easy task as it sounds - simple shell or python script where you just parse correct path from arguments wouldn't do the trick as they're launched in a separate process which doesn't have any effect on the working dir of your shell. Little research and try - error approach later we found working solution.

1. Create shell script (eg. pcd.sh) to somewhere on your $PATH which contains following lines:

#!/bin/sh
cd `echo -n $1/;echo $1 | sed -e 's/\./\//g'`


2. Chmod your shell script so that you can execute it.

3. Edit your .bashrc and add following alias:

alias pcd=". pcd.sh"


Now pcd command should work as expected:

$ pwd
/home/jutaojan/workspace/
$ pcd very.long.packagename
$ pwd
/home/jutaojan/workspace/very.long.packagename/very/long/packagename


Excellent!

The key element is the first dot in the alias. This makes your command to execute in the current shell session. As alias doesn't cope with arguments you'll need a script (in this case pcd.sh) for parsing to work. I know this isn't the most sophisticated piece of code and there probably are better ways to achieve the same result, but I couldn't find one.

I hope this example is useful for someone frustrated for the long nested structures we're all so familiar with.

Comments

  1. Really nice idea.

    As for the the bash alias, you can implement this with a function call in your .bashrc :

    function pcd() {
    cd `echo -n $1/;echo $1 | sed -e 's/\./\//g'`
    }

    and that accepts arguments.

    ReplyDelete
  2. Thanks Jukka for the idea and davidjb for the comment.
    I expanded it a bit to support packages with a 'src' directory inside.

    function pcd()
    {

    PACKAGENAME=$1
    cd $PACKAGENAME
    if [ -d "src" ]
    then
    cd "src"
    fi
    cd `echo $PACKAGENAME | sed -e 's/\./\//g'`
    }

    ReplyDelete
  3. Davidjb, thanks! Function call in shell is for sure the missing more sophisticated solution.

    Csenger, thank you also for the important addition! I think this script is near reaching the perfection in here :)

    ReplyDelete
  4. Btw, Command-T is a great Vim plugin for opening files in deep directory structures:

    https://wincent.com/products/command-t

    ReplyDelete
  5. Take a look at autojump, IMHO beats everything above.
    https://github.com/joelthelion/autojump

    Example session:

    > pwd
    /home/wouter

    > j panel
    > pwd
    /opt/zope/plone-coredev-4.2/src/plone.app.controlpanel/plone/app/controlpanel

    ReplyDelete

Post a Comment

Popular posts from this blog

Speed comparsions between Plone and Wordpress

Jon Stahl wrote recently a blogpost about Plone being three times faster than Dropal, Joomla and Wordpress . We had a small discussion about this in my workplace and as my colleague pointed out this wasn't a really that comprehensive test that you could state Plone being 3 times faster than it's competitors. This seemed a bit unfair test considering how fast this has been spread in tweet/blogosphere, so I decided to repeat the test with a bit more critical viewpoint. What's wrong in the original test? No one would consider opinion poll with 10 answers nowhere near trustworthy - it's all the same with requests. I didn't want to put up all the cms so I just set up second best (Wordpress 2.9.1) and compared that to my Plone development site (4.0a3). As a comparsion I did the first test with same ab command Jon used and my iMac gave following results: Wordpress: 7.13 requests / second Plone: 17.10 requests / second So far we have clear winner and Jons data hol

Usability and Plone

I've seen in here and there someone mentioning that usability of Plone is very good. Lot's of people - me included - like the fact that in Plone you don't have separate content management interface compared to some of Plones rivals. That counts for something when we're talking about good usability. Still that is only one quite small part of the whole picture. So what else is there? What do people like in Plone and where are the rough edges for end users? If general consensus is that Plone does have good usability, where is the actual proof of that? On plone.org I found one page in developer documentation mentioning following:  "Plone differentiates itself on usability. The intuitiveness of the user interface is what attracts people to Plone the most." I interpret this sentence meaning about the "one view for all" approach. What bugs me in this is that this whole sentence about good usability is about how the UI works compared to Plones competi

Problems with Plone version pinning

Since we splitted our one huge Plone site to several smaller ones we've been looking for the correct procedure to keep things running smoothly and to make updates as painless as possible. So far we haven't found the right way and every update has had some problems. Some of the problems are related to the fact that we have about 24 sites to maintain and adding a new content type to all of them means lots of work. Below are all the steps needed for update (and solutions we've founded so far). 1. Add your new product to buildout.cfg eggs and zcml list. Do this 24 times and you'll find yourself thinking there has to be better way. Luckily there is; you can extend your buildout.cfg with some general config file (eg. deployement.cfg). Most tutorials describe a way where you have those two files living side by side in filesystem and you run buildout with -c deployement.cfg option, but this doesn't remove the actual problem. We have our deployement.cfg living in diffe