浏览代码

Merge pull request #5296 from mcornella/fix-pj-plugin

Fix pj plugin
Marc Cornellà 8 年之前
父节点
当前提交
acd6a14a2f
共有 2 个文件被更改,包括 71 次插入33 次删除
  1. 45 0
      plugins/pj/README.md
  2. 26 33
      plugins/pj/pj.plugin.zsh

+ 45 - 0
plugins/pj/README.md

@@ -0,0 +1,45 @@
+# pj
+
+The `pj` plugin (short for `Project Jump`) allows you to define several
+folders where you store your projects, so that you can jump there directly
+by just using the name of the project directory.
+
+Original idea and code by Jan De Poorter ([@DefV](https://github.com/DefV))
+Source: https://gist.github.com/pjaspers/368394#gistcomment-1016
+
+## Usage
+
+1. Enable the `pj` plugin:
+
+   ```zsh
+   plugins=(... pj)
+   ```
+
+2. Set `$PROJECT_PATHS` in your ~/.zshrc:
+
+   ```zsh
+   PROJECT_PATHS=(~/src ~/work ~/"dir with spaces")
+   ```
+
+You can now use one of the following commands:
+
+##### `pj my-project`:
+
+`cd` to the directory named "my-project" found in one of the `$PROJECT_PATHS`
+directories. If there are several directories named the same, the first one
+to appear in `$PROJECT_PATHS` has preference.
+
+For example:
+```zsh
+PROJECT_PATHS=(~/code ~/work)
+$ ls ~/code    # ~/code/blog ~/code/react
+$ ls ~/work    # ~/work/blog ~/work/project
+$ pj blog      # <-- will cd to ~/code/blog
+```
+
+##### `pjo my-project`
+
+Open the project directory with your defined `$EDITOR`. This follows the same
+directory rules as the `pj` command above.
+
+Note: `pjo` is an alias of `pj open`.

+ 26 - 33
plugins/pj/pj.plugin.zsh

@@ -1,49 +1,42 @@
-#!/bin/zsh
-
-#
-# Original idea by DefV (Jan De Poorter)
-# Source: https://gist.github.com/pjaspers/368394#comment-1016
-#
-# Usage:
-#  - Set `$PROJECT_PATHS` in your ~/.zshrc
-#    e.g.: PROJECT_PATHS=(~/src ~/work)
-#  - In ZSH you now can open a project directory with the command: `pj my-project`
-#    the plugin will locate the `my-project` directory in one of the $PROJECT_PATHS
-#    Also tab completion is supported.
-#  - `pjo my-project` will open the directory in $EDITOR
-# 
-
-function pj() {
+alias pjo="pj open"
+
+pj () {
+    emulate -L zsh
+
     cmd="cd"
-    file=$1
+    project=$1
 
-    if [[ "open" == "$file" ]] then
+    if [[ "open" == "$project" ]]; then
         shift
-        file=$*
-        cmd=(${(s: :)EDITOR})
+        project=$*
+        cmd=${=EDITOR}
     else
-        file=$*
+        project=$*
+    fi
+
+    if [[ -z "$project" ]]; then
+        echo "You have to specify a project name."
+        return
     fi
 
-    for project in $PROJECT_PATHS; do
-        if [[ -d $project/$file ]] then
-            $cmd "$project/$file"
-            unset project # Unset project var
+    for basedir ($PROJECT_PATHS); do
+        if [[ -d "$basedir/$project" ]]; then
+            $cmd "$basedir/$project"
             return
         fi
     done
 
-    echo "No such project $1"
+    echo "No such project '${project}'."
 }
 
-alias pjo="pj open"
+_pj () {
+    emulate -L zsh
 
-function _pj () {
-    # might be possible to improve this using glob, without the basename trick
     typeset -a projects
-    projects=($PROJECT_PATHS/*)
-    projects=$projects:t
-    _arguments "*:file:($projects)"
-}
+    for basedir ($PROJECT_PATHS); do
+        projects+=(${basedir}/*(/N))
+    done
 
+    compadd ${projects:t}
+}
 compdef _pj pj