Planter
FYI, this project is listed as "retired." It may no longer function or I may just not be updating it anymore.
Planter takes in simple, indented text files to define the structure of the directory tree it’s going to create. You pass it something like:
css
img
js
libs
mylibs
And it creates:
./css
./img
./js
./js/libs
./js/mylibs
There are three ways to call plant
:
- Pipe indented (tabs or 2 spaces) text to the script
- e.g. `cat “mytemplate” | plant
- Create template.tpl files in ~/.planter and call them by their base name
- e.g. Create a text file in ~/.planter/site.tpl
plant site
- Call plant without input and it will open your $EDITOR to create the tree on the fly
You can nest directories as deeply as you like. You can pass the indented list to it on STDIN (piping from another command), or run plant
alone and it will open up your default editor and let you define the list on the fly. You can also use templates…
Templates
Create ~/.planter/
and add text files named “[template].tpl”, where “[template]” is the short name you’ll call it with. Say I have “~/.planter/client.tpl”, I can just run plant client
and it will read that template in and create the directory structure in whatever directory I’m in when I run it.
If there are non-template files in ~/.planter
, you can reference them in templates and a copy of the file will be created at that point in the directory tree. For example, if you had an index.html, a style.css and a jquery.js file in your template folder, you could make a web.tpl
template like this:
public
index.html
js
jquery.js
css
style.css
images
Variables
You can also use a very basic template variable system to add variable content. In your template, use %%X%%
where X is an integer. The number corresponds to the arguments passed on the command line after the template name, so %%1%%
is replaced with the first argument:
In the template:
client-%%1%%
expenses
contracts
On the command line:
plant client "Deborah Winger"
Creates:
./client-Deborah Winger
./client-Deborah Winger/expenses
./client-Deborah Winger/contracts
You can assign default values to variables to make them optional when planting a structure from a template:
client-%%1|generic%%
If you want to specify variables for just some positions, use “-“ or “.” for arguments in the command to force the default for that position.
Tagging
Set tags on created folder and copied items items by adding @TAGs at the end of the line in the template. To make a variable placeholder function as a tag, put the @ between the % and the replacement number at the beginning (e.g. %%@2%%
or %%@1|default%%
). Unless the –no-tagify option is used, variables identified as tags will have spaces removed and be lowercased. Tags set on a folder or file will replace existing tags. Running a “plant” after the folder already exists will not overwrite any folders, but will update/replace tags.
The @ symbol is removed by default. To add a character prefix to ALL tags, use “–tag-prefix @” on the command line. Otherwise, just include any symbols or characters needed on a one-off basis in the arguments passed to a template, or include them in the template.
// test.tpl
// tag "folder name" with "foldertag" and "@foldertype"
folder name @foldertag @@foldertype
Add comments in templates with “//”. This can be anywhere in a line, anything after it will be ingored.
Post-processing scripts
Entirely optionally, the template can end with a ruby script. Separate the script from the template with “—”. It will be executed after the folders are created, and any variable placeholders in it will be replaced with command line arguments, just like in the template. You can use this to perform additional operations, notifications or further customize Planter’s functionality. To execute scripts in other languages, use Ruby’s system call:
system "python /path/to/script.py"
# or
%x{python "path/to/script.py"}
No hashbang is necessary in the script.
For a list of command line options, use plant -h
.
Example template
// use `//` for comments
// Create a tab-indented list of nested folders.
// %%1%% will be replaced with the first command line argument
// Adding a pipe (%%1|%%) makes it optional
// Adding a string after the pipe (%%1|default%%) uses that as default
// if there's nothing passed for that placeholder
// Use @ at the start of a variable to indicate that it's a tag (%%@1%%)
//
// The following creates a root folder named with the first argument
// and tagged with an "@tag" of the same name, with a directory
// structure within it.
// If no argument is passed after the template
// the folder will be called "app" and receive no tag.
// $ plant -ct website "My Client"
// The -c and -t options turn on color and converts
// "My Client" to myclient in the tag
%%1|app%% %%@@1|%% // if no argument is passed in the first position, call it "app" with no tags
index.html // copied from ~/.planter/index.html
js // jquery library will be added here
css
style.css // copied from ~/.planter/style.css
images
---
# Anything following the --- break (optional) will be evaluated
# as a script, use caution
# No hashbang
# Comments in the script portion use # and are ignored
# Use `puts` for status messages
puts "Getting the latest version of jQuery 1"
# Call external utilities and scripts in other languages
# with %x or system:
# %x{python script.py}
# system "python script.py"
# Fetch a copy of the latest jQuery into the js folder
%x{curl -o "%%1|app%%/js/jquery.min.js" https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js &> /dev/null }
Download
Planter v2.1.4
Instantly create nested directory structures from indented text with tags and post-processing scripts
Published 01/15/14.
Updated 01/15/14. Changelog
An older version of Planter is also available for LaunchBar (included in the second Download). See the announcement post for details.
Planter for LaunchBar/CLI v1.3
Download Planter for LaunchBar/CLI v1.3
Instantly create nested directory structures from indented text
Published 05/05/13.
Updated 05/05/13. Changelog
Speaking of Planter…