Skip to content

Instantly share code, notes, and snippets.

@mortonfox
Created June 21, 2016 17:55
Show Gist options
  • Select an option

  • Save mortonfox/d27d5777c04373feea75c549f93fa2bd to your computer and use it in GitHub Desktop.

Select an option

Save mortonfox/d27d5777c04373feea75c549f93fa2bd to your computer and use it in GitHub Desktop.
" ============================================================================
" File: iterm_menu_item.vim
" Description: plugin for NERD Tree that opens selected path in iTerm.
" Maintainer: Po Shan Cheah <morton@mortonfox.com>
" Last Change: August 21, 2013
" ============================================================================
if exists("g:loaded_nerdtree_iterm_menu")
finish
endif
let g:loaded_nerdtree_iterm_menu = 1
" Add menu item to NERD Tree to open selected dir in iTerm.
if has("gui_mac") || has("gui_macvim")
call NERDTreeAddMenuItem({'text': 'open shell in (i)term', 'shortcut': 'i', 'callback': 'NERDTreeOpenIterm'})
endif
" There is a lot of boilerplate AppleScript here but it does the following:
" - activates iTerm
" - opens a terminal if necessary
" - opens a new session
" - runs a cd command in the new session
" The first argument to osascript will be the cd path.
let s:iterm_script = "on run argv\n"
let s:iterm_script .= " tell application \"iTerm\"\n"
let s:iterm_script .= " set isRunning to (it is running)\n"
let s:iterm_script .= " set myterm to (current terminal)\n"
let s:iterm_script .= " try\n"
let s:iterm_script .= " set tmp to myterm\n"
let s:iterm_script .= " on error\n"
let s:iterm_script .= " set myterm to (make new terminal)\n"
let s:iterm_script .= " end try\n"
let s:iterm_script .= " tell myterm\n"
let s:iterm_script .= " if not isRunning then\n"
let s:iterm_script .= " activate\n"
let s:iterm_script .= " end if\n"
let s:iterm_script .= " set newSession to (launch session \"Default\")\n"
let s:iterm_script .= " tell the last session\n"
let s:iterm_script .= " write text \"clear\"\n"
let s:iterm_script .= " write text \"cd \\\"\" & item 1 of argv & \"\\\"\"\n"
let s:iterm_script .= " end tell\n"
let s:iterm_script .= " if not isRunning then\n"
let s:iterm_script .= " terminate the first session\n"
let s:iterm_script .= " end if\n"
let s:iterm_script .= " end tell\n"
let s:iterm_script .= " end tell\n"
let s:iterm_script .= "end run\n"
" This script is for iTerm 2 2.9 beta and 3.x.
let s:iterm_script_v3 = ''
let s:iterm_script_v3 .= 'on run argv'."\n"
let s:iterm_script_v3 .= ' tell application "iTerm"'."\n"
let s:iterm_script_v3 .= ' set gottab to false'."\n"
let s:iterm_script_v3 .= ' '."\n"
let s:iterm_script_v3 .= ' -- If iTerm is not running, start it.'."\n"
let s:iterm_script_v3 .= ' if it is not running then'."\n"
let s:iterm_script_v3 .= ' activate'."\n"
let s:iterm_script_v3 .= ' set gottab to true'."\n"
let s:iterm_script_v3 .= ' end if'."\n"
let s:iterm_script_v3 .= ' '."\n"
let s:iterm_script_v3 .= ' tell the current window'."\n"
let s:iterm_script_v3 .= ' try'."\n"
let s:iterm_script_v3 .= ' set tmp to (current tab)'."\n"
let s:iterm_script_v3 .= ' on error'."\n"
let s:iterm_script_v3 .= ' -- Handle the case where iTerm is running but has no windows open.'."\n"
let s:iterm_script_v3 .= ' set curwindow to (create window with profile "Default")'."\n"
let s:iterm_script_v3 .= ' set gottab to true'."\n"
let s:iterm_script_v3 .= ' end try'."\n"
let s:iterm_script_v3 .= ' end tell'."\n"
let s:iterm_script_v3 .= ' '."\n"
let s:iterm_script_v3 .= ' -- Create a tab if we have not already done so by running iTerm or creating a window.'."\n"
let s:iterm_script_v3 .= ' if not gottab then'."\n"
let s:iterm_script_v3 .= ' tell the current window'."\n"
let s:iterm_script_v3 .= ' create tab with profile "Default"'."\n"
let s:iterm_script_v3 .= ' end tell'."\n"
let s:iterm_script_v3 .= ' end if'."\n"
let s:iterm_script_v3 .= ' '."\n"
let s:iterm_script_v3 .= ' -- Finally, we can run the commands.'."\n"
let s:iterm_script_v3 .= ' activate'."\n"
let s:iterm_script_v3 .= ' tell the current window'."\n"
let s:iterm_script_v3 .= ' tell the current tab'."\n"
let s:iterm_script_v3 .= ' tell the current session'."\n"
let s:iterm_script_v3 .= ' write text "clear"'."\n"
let s:iterm_script_v3 .= ' write text "cd \"" & item 1 of argv & "\""'."\n"
let s:iterm_script_v3 .= ' end tell'."\n"
let s:iterm_script_v3 .= ' end tell'."\n"
let s:iterm_script_v3 .= ' end tell'."\n"
let s:iterm_script_v3 .= ' end tell'."\n"
let s:iterm_script_v3 .= 'end run'."\n"
function! NERDTreeOpenIterm()
let curDirNode = g:NERDTreeDirNode.GetSelected()
let path = curDirNode.path.str()
let iterm_version = get(g:, 'nerdtree_iterm_iterm_version', 3)
let output = system('osascript - "'.path.'"', iterm_version >= 3 ? s:iterm_script_v3 : s:iterm_script)
if v:shell_error != 0
redraw
echohl ErrorMsg
echomsg 'Error opening iTerm shell: '.output
echohl None
endif
endfunction
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment