Browse Source

sublime: refactor plugin and fix documentation (#7715)

* convert to 2-space indentation
* standardize sublime function name (subl)
* simplify subl function definition into a single loop
* convert functions into aliases
* simplify alias creation
* search for Sublime Text command only if not found
* reorganize and clean up plugin
* fix README
* simplify cygwin path lookup
* support path lookup for msys (Windows)
* support path lookup for WSL (Windows)
* fix for spaces in sublime path alias
Marc Cornellà 5 years ago
parent
commit
fc9e427ef9
2 changed files with 118 additions and 109 deletions
  1. 25 13
      plugins/sublime/README.md
  2. 93 96
      plugins/sublime/sublime.plugin.zsh

+ 25 - 13
plugins/sublime/README.md

@@ -1,25 +1,37 @@
-## sublime
+# sublime
 
-Plugin for Sublime Text, a cross platform text and code editor, available for Linux, Mac OS X, and Windows.
+Plugin for [Sublime Text](https://www.sublimetext.com/), a cross platform text and code editor,
+available for Linux, macOS, and Windows.
 
-### Requirements
+To use the plugin, add `sublime` to the plugins array of your zshrc file:
 
- * [Sublime Text](https://www.sublimetext.com/)
+```zsh
+plugins=(... sublime)
+```
 
-### Usage
+Sublime Text has to be installed to use the plugin.
 
- * If `st` command is called without an argument, launch Sublime Text
+## Usage
 
- * If `st` is passed a directory, `cd` to it and open it in Sublime Text
+The plugin defines several aliases, such as:
 
- * If `st` is passed a file, open it in Sublime Text
+- `st`: opens Sublime Text. If passed a file or directory, Sublime Text will open it.
 
- * If `stt` command is called, it is equivalent to `st .`, opening the current folder in Sublime Text
+- `stt`: open Sublime Text on the current directory.
 
- * If `sst` command is called, it is like `sudo st`, opening the file or folder in Sublime Text. Useful for editing system protected files.
+- `sst`: if `sudo` is available, `sst` will open Sublime Text with root permissions, so that
+  you can modify any file or directory that you pass it. Useful to edit system files.
 
- * If `stp` command is called, it find a `.sublime-project` file by traversing up the directory structure. If there is no `.sublime-project` file, but if the current folder is a Git repo, opens up the root directory of the repo. If the current folder is not a Git repo, then opens up the current directory.
+There are also a few functions available:
 
- * If `stn` command is called without an argument, create a stub `.sublime-project` file in the current working directory if one does not already exist
+- `find_project` (or `stp` alias): if called, the function will search for a `.sublime-project` file
+  on the current directory or its parents, until it finds none.
 
- * If `stn` is passed a directory, create a stub `.sublime-project` file in it
+  If there is no `.sublime-project` file but the current folder is in a Git repository, it will open
+  Sublime Text on the root directory of the repository.
+
+  If there is no Git repository, it will then open Sublime Text on the current directory.
+
+- `create_project` (or `stn` alias): if called without an argument, create a stub `.sublime-project`
+  file in the current working directory, if one does not already exist. If passed a directory, create
+  a stub `.sublime-project` file in it.

+ 93 - 96
plugins/sublime/sublime.plugin.zsh

@@ -1,121 +1,118 @@
-# Sublime Text Aliases
+# Sublime Text aliases
 
-() {
+alias st=subl
+alias stt='subl .'
 
-if [[ "$OSTYPE" == linux* ]]; then
-    local _sublime_linux_paths
-    _sublime_linux_paths=(
+# Define sst only if sudo exists
+(( $+commands[sudo] )) && alias sst='sudo subl'
+
+alias stp=find_project
+alias stn=create_project
+
+
+# Search for the Sublime Text command if not found
+(( $+commands[subl] )) || {
+  declare -a _sublime_paths
+
+  if [[ "$OSTYPE" == linux* ]]; then
+    if [[ "$(uname -r)" = *Microsoft* ]]; then
+      _sublime_paths=(
+        "$(wslpath -u 'C:\Program Files\Sublime Text 3\subl.exe')"
+        "$(wslpath -u 'C:\Program Files\Sublime Text 2\subl.exe')"
+      )
+    else
+      _sublime_paths=(
         "$HOME/bin/sublime_text"
         "/opt/sublime_text/sublime_text"
         "/opt/sublime_text_3/sublime_text"
         "/usr/bin/sublime_text"
         "/usr/local/bin/sublime_text"
         "/usr/bin/subl"
-        "/opt/sublime_text_3/sublime_text"
         "/usr/bin/subl3"
+      )
+    fi
+  elif [[ "$OSTYPE" = darwin* ]]; then
+    _sublime_paths=(
+      "/usr/local/bin/subl"
+      "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
+      "/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
+      "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
+      "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
+      "$HOME/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
+      "$HOME/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
     )
-    for _sublime_path in $_sublime_linux_paths; do
-        if [[ -a $_sublime_path ]]; then
-            st_run() { $_sublime_path $@ >/dev/null 2>&1 &| }
-            st_run_sudo() {sudo $_sublime_path $@ >/dev/null 2>&1}
-            alias sst=st_run_sudo
-            alias st=st_run
-            break
-        fi
-    done
-elif  [[ "$OSTYPE" = darwin* ]]; then
-    local _sublime_darwin_paths
-    _sublime_darwin_paths=(
-        "/usr/local/bin/subl"
-        "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
-        "/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
-        "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
-        "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
-        "$HOME/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
-        "$HOME/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
+  elif [[ "$OSTYPE" = cygwin ]]; then
+    _sublime_paths=(
+      "$(cygpath "$ProgramW6432/Sublime Text 2")/subl.exe"
+      "$(cygpath "$ProgramW6432/Sublime Text 3")/subl.exe"
     )
-    for _sublime_path in $_sublime_darwin_paths; do
-        if [[ -a $_sublime_path ]]; then
-            subl () { "$_sublime_path" $* }
-            alias st=subl
-            break
-        fi
-    done
-elif [[ "$OSTYPE" = 'cygwin' ]]; then
-    local _sublime_cygwin_paths
-    _sublime_cygwin_paths=(
-        "$(cygpath $ProgramW6432/Sublime\ Text\ 2)/sublime_text.exe"
-        "$(cygpath $ProgramW6432/Sublime\ Text\ 3)/sublime_text.exe"
+  elif [[ "$OSTYPE" = msys ]]; then
+    _sublime_paths=(
+      "/c/Program Files/Sublime Text 2/subl.exe"
+      "/c/Program Files/Sublime Text 3/subl.exe"
     )
-    for _sublime_path in $_sublime_cygwin_paths; do
-        if [[ -a $_sublime_path ]]; then
-            subl () { "$_sublime_path" $* }
-            alias st=subl
-            break
-        fi
-    done
-fi
+  fi
 
-}
+  for _sublime_path in $_sublime_paths; do
+    if [[ -a $_sublime_path ]]; then
+      alias subl="'$_sublime_path'"
+      (( $+commands[sudo] )) && alias sst="sudo '$_sublime_path'"
+      break
+    fi
+  done
 
-alias stt='st .'
+  unset _sublime_paths _sublime_path
+}
 
-find_project()
-{
-    local PROJECT_ROOT="${PWD}"
-    local FINAL_DEST="."
+function find_project() {
+  local PROJECT_ROOT="${PWD}"
+  local FINAL_DEST="."
 
-    while [[ $PROJECT_ROOT != "/" && ! -d "$PROJECT_ROOT/.git" ]]; do
-        PROJECT_ROOT=$(dirname $PROJECT_ROOT)
-    done
+  while [[ $PROJECT_ROOT != "/" && ! -d "$PROJECT_ROOT/.git" ]]; do
+    PROJECT_ROOT=$(dirname $PROJECT_ROOT)
+  done
 
-    if [[ $PROJECT_ROOT != "/" ]]; then
-        local PROJECT_NAME="${PROJECT_ROOT##*/}"
+  if [[ $PROJECT_ROOT != "/" ]]; then
+    local PROJECT_NAME="${PROJECT_ROOT##*/}"
 
-        local SUBL_DIR=$PROJECT_ROOT
-        while [[ $SUBL_DIR != "/" && ! -f "$SUBL_DIR/$PROJECT_NAME.sublime-project" ]]; do
-            SUBL_DIR=$(dirname $SUBL_DIR)
-        done
+    local SUBL_DIR=$PROJECT_ROOT
+    while [[ $SUBL_DIR != "/" && ! -f "$SUBL_DIR/$PROJECT_NAME.sublime-project" ]]; do
+      SUBL_DIR=$(dirname $SUBL_DIR)
+    done
 
-        if [[ $SUBL_DIR != "/" ]]; then
-            FINAL_DEST="$SUBL_DIR/$PROJECT_NAME.sublime-project"
-        else
-            FINAL_DEST=$PROJECT_ROOT
-        fi
+    if [[ $SUBL_DIR != "/" ]]; then
+      FINAL_DEST="$SUBL_DIR/$PROJECT_NAME.sublime-project"
+    else
+      FINAL_DEST=$PROJECT_ROOT
     fi
+  fi
 
-    st $FINAL_DEST
+  subl $FINAL_DEST
 }
 
 function create_project() {
-
-    local _target=$1
-
-    if [[ "${_target}" == "" ]]; then
-        _target=$(pwd);
-    elif [[ ! -d ${_target} ]]; then
-        echo "${_target} is not a valid directory"
-        return 1
-    fi
-
-    local _sublime_project_file=$_target/$(basename $_target).sublime-project
-
-    if [[ ! -f $_sublime_project_file ]]; then
-        
-        touch $_sublime_project_file
-
-        echo -e "{"                         >> $_sublime_project_file
-        echo -e "\t\"folders\":"            >> $_sublime_project_file
-        echo -e "\t\t[{"                    >> $_sublime_project_file
-        echo -e "\t\t\t\"path\": \".\","    >> $_sublime_project_file
-        echo -e "\t\t\t\"file_exclude_patterns\": []" >> $_sublime_project_file
-        echo -e "\t\t}]"                    >> $_sublime_project_file
-        echo -e "}"                         >> $_sublime_project_file
-
-        echo -e "New Sublime Text project created:\n\t${_sublime_project_file}"
-
-    fi
+  local _target=$1
+
+  if [[ "${_target}" == "" ]]; then
+    _target=$(pwd);
+  elif [[ ! -d ${_target} ]]; then
+    echo "${_target} is not a valid directory"
+    return 1
+  fi
+
+  local _sublime_project_file=$_target/$(basename $_target).sublime-project
+
+  if [[ ! -f $_sublime_project_file ]]; then
+    touch $_sublime_project_file
+
+    echo -e "{"                         >> $_sublime_project_file
+    echo -e "\t\"folders\":"            >> $_sublime_project_file
+    echo -e "\t\t[{"                    >> $_sublime_project_file
+    echo -e "\t\t\t\"path\": \".\","    >> $_sublime_project_file
+    echo -e "\t\t\t\"file_exclude_patterns\": []" >> $_sublime_project_file
+    echo -e "\t\t}]"                    >> $_sublime_project_file
+    echo -e "}"                         >> $_sublime_project_file
+
+    echo -e "New Sublime Text project created:\n\t${_sublime_project_file}"
+  fi
 }
-
-alias stp=find_project
-alias stn=create_project