Browse Source

Merge pull request #4093 from apjanke/osx-fix-tab-for-iterm

osx: fix tab() functions so the cd works in iTerm2, and status/output are better
Robby Russell 9 years ago
parent
commit
dde5540b1e
1 changed files with 45 additions and 39 deletions
  1. 45 39
      plugins/osx/osx.plugin.zsh

+ 45 - 39
plugins/osx/osx.plugin.zsh

@@ -5,29 +5,35 @@
 #       VERSION:  1.1.0
 #       VERSION:  1.1.0
 # ------------------------------------------------------------------------------
 # ------------------------------------------------------------------------------
 
 
-function tab() {
-  local command="cd \\\"$PWD\\\"; clear"
-  (( $# > 0 )) && command="${command}; $*"
-
-  the_app=$(
+function _omz_osx_get_frontmost_app() {
+  local the_app=$(
     osascript 2>/dev/null <<EOF
     osascript 2>/dev/null <<EOF
       tell application "System Events"
       tell application "System Events"
         name of first item of (every process whose frontmost is true)
         name of first item of (every process whose frontmost is true)
       end tell
       end tell
 EOF
 EOF
   )
   )
+  echo "$the_app"
+}
 
 
-  [[ "$the_app" == 'Terminal' ]] && {
-    osascript 2>/dev/null <<EOF
+function tab() {
+  # Must not have trailing semicolon, for iTerm compatibility
+  local command="cd \\\"$PWD\\\"; clear"
+  (( $# > 0 )) && command="${command}; $*"
+
+  local the_app=$(_omz_osx_get_frontmost_app)
+
+  if [[ "$the_app" == 'Terminal' ]]; then
+    # Discarding stdout to quash "tab N of window id XXX" output
+    osascript >/dev/null <<EOF
       tell application "System Events"
       tell application "System Events"
         tell process "Terminal" to keystroke "t" using command down
         tell process "Terminal" to keystroke "t" using command down
-        tell application "Terminal" to do script "${command}" in front window
       end tell
       end tell
+      tell application "Terminal" to do script "${command}" in front window
 EOF
 EOF
-  }
 
 
-  [[ "$the_app" == 'iTerm' ]] && {
-    osascript 2>/dev/null <<EOF
+  elif [[ "$the_app" == 'iTerm' ]]; then
+    osascript <<EOF
       tell application "iTerm"
       tell application "iTerm"
         set current_terminal to current terminal
         set current_terminal to current terminal
         tell current_terminal
         tell current_terminal
@@ -35,29 +41,27 @@ EOF
           set current_session to current session
           set current_session to current session
           tell current_session
           tell current_session
             write text "${command}"
             write text "${command}"
-            keystroke return
           end tell
           end tell
         end tell
         end tell
       end tell
       end tell
 EOF
 EOF
-  }
+
+  else
+    echo "tab: unsupported terminal app: $the_app"
+    false
+
+  fi
 }
 }
 
 
 function vsplit_tab() {
 function vsplit_tab() {
-  local command="cd \\\"$PWD\\\""
+  local command="cd \\\"$PWD\\\"; clear"
   (( $# > 0 )) && command="${command}; $*"
   (( $# > 0 )) && command="${command}; $*"
 
 
-  the_app=$(
-    osascript 2>/dev/null <<EOF
-      tell application "System Events"
-        name of first item of (every process whose frontmost is true)
-      end tell
-EOF
-  )
+  local the_app=$(_omz_osx_get_frontmost_app)
 
 
-  [[ "$the_app" == 'iTerm' ]] && {
-    osascript 2>/dev/null <<EOF
-      tell application "iTerm" to activate
+  if [[ "$the_app" == 'iTerm' ]]; then
+    osascript <<EOF
+      -- tell application "iTerm" to activate
 
 
       tell application "System Events"
       tell application "System Events"
         tell process "iTerm"
         tell process "iTerm"
@@ -65,26 +69,24 @@ EOF
             click
             click
           end tell
           end tell
         end tell
         end tell
-        keystroke "${command}; clear;"
-        keystroke return
+        keystroke "${command} \n"
       end tell
       end tell
 EOF
 EOF
-  }
+
+  else
+    echo "$0: unsupported terminal app: $the_app" >&2
+    false
+
+  fi
 }
 }
 
 
 function split_tab() {
 function split_tab() {
-  local command="cd \\\"$PWD\\\""
+  local command="cd \\\"$PWD\\\"; clear"
   (( $# > 0 )) && command="${command}; $*"
   (( $# > 0 )) && command="${command}; $*"
 
 
-  the_app=$(
-    osascript 2>/dev/null <<EOF
-      tell application "System Events"
-        name of first item of (every process whose frontmost is true)
-      end tell
-EOF
-  )
+  local the_app=$(_omz_osx_get_frontmost_app)
 
 
-  [[ "$the_app" == 'iTerm' ]] && {
+  if [[ "$the_app" == 'iTerm' ]]; then
     osascript 2>/dev/null <<EOF
     osascript 2>/dev/null <<EOF
       tell application "iTerm" to activate
       tell application "iTerm" to activate
 
 
@@ -94,11 +96,15 @@ EOF
             click
             click
           end tell
           end tell
         end tell
         end tell
-        keystroke "${command}; clear;"
-        keystroke return
+        keystroke "${command} \n"
       end tell
       end tell
 EOF
 EOF
-  }
+
+  else
+    echo "$0: unsupported terminal app: $the_app" >&2
+    false
+
+  fi
 }
 }
 
 
 function pfd() {
 function pfd() {