-
Star
(124)
You must be signed in to star a gist -
Fork
(32)
You must be signed in to fork a gist
-
-
Save bobthecow/757788 to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| # | |
| # Open new Terminal tabs from the command line | |
| # | |
| # Author: Justin Hileman (http://justinhileman.com) | |
| # | |
| # Installation: | |
| # Add the following function to your `.bashrc` or `.bash_profile`, | |
| # or save it somewhere (e.g. `~/.tab.bash`) and source it in `.bashrc` | |
| # | |
| # Usage: | |
| # tab Opens the current directory in a new tab | |
| # tab [PATH] Open PATH in a new tab | |
| # tab [CMD] Open a new tab and execute CMD | |
| # tab [PATH] [CMD] ... You can prob'ly guess | |
| # Only for teh Mac users | |
| [ `uname -s` != "Darwin" ] && return | |
| function tab () { | |
| local cmd="" | |
| local cdto="$PWD" | |
| local args="$@" | |
| if [ -d "$1" ]; then | |
| cdto=`cd "$1"; pwd` | |
| args="${@:2}" | |
| fi | |
| if [ -n "$args" ]; then | |
| cmd="; $args" | |
| fi | |
| osascript &>/dev/null <<EOF | |
| tell application "iTerm" | |
| tell current terminal | |
| launch session "Default Session" | |
| tell the last session | |
| write text "cd \"$cdto\"$cmd" | |
| end tell | |
| end tell | |
| end tell | |
| EOF | |
| } |
| # Open new iTerm and Terminal tabs from the command line | |
| # | |
| # Author: Justin Hileman (http://justinhileman.com) | |
| # | |
| # Usage: | |
| # tab Opens the current directory in a new tab | |
| # tab [PATH] Open PATH in a new tab | |
| # tab [CMD] Open a new tab and execute CMD | |
| # tab [PATH] [CMD] ... You can prolly guess | |
| function tab -d "Open the current directory in a new tab" | |
| set -l cmd "" | |
| set -l cdto (pwd) | |
| if test (count $argv) -gt 0 | |
| pushd . >/dev/null | |
| if test -d $argv[1] | |
| cd $argv[1] | |
| set cdto (pwd) | |
| set -e argv[1] | |
| end | |
| popd >/dev/null | |
| end | |
| if test (count $argv) -gt 0 | |
| set cmd "; $argv" | |
| end | |
| switch $TERM_PROGRAM | |
| case 'iTerm.app' | |
| osascript 2>/dev/null -e " | |
| tell application \"iTerm\" | |
| tell current terminal | |
| launch session \"Default Session\" | |
| tell the last session | |
| write text \"cd \\\"$cdto\\\"$cmd\" | |
| end tell | |
| end tell | |
| end tell | |
| " | |
| case 'Apple_Terminal' | |
| osascript 2>/dev/null -e " | |
| tell application \"Terminal\" | |
| activate | |
| tell application \"System Events\" to keystroke \"t\" using command down | |
| repeat while contents of selected tab of window 1 starts with linefeed | |
| delay 0.01 | |
| end repeat | |
| do script \"cd \\\"$cdto\\\"$cmd\" in window 1 | |
| end tell | |
| " | |
| case '*' | |
| echo "Unknown terminal: $TERM_PROGRAM" >&2 | |
| end | |
| end |
Doesn't work with the nightly versions of iTerm2, forked and updated it to work: https://gist.github.com/vitalybe/021d2aecee68178f3c52
Dangerously buggy if passed a multi-argument list -- you wouldn't want to tab ls /tmp/* if you weren't 100% certain that there didn't exist a file created with touch '/tmp/$(rm -rf $HOME)' -- and also has issues with arguments with spaces and quotes. First commented the below on vitalybe's fork, but it's relevant here too:
printf -v args '%q ' "$@", if you want to generate your arguments in eval-safe form. Otherwise, you're inviting bugs -- local args="$@" flattens the original array into a string, and a string can't store array boundaries in a safe way without escaping.
To provide an example:
$ set -- "first arg" "second arg" "third arg"
$ args_flat="$@"
$ args_arr=( "$@" )
$ declare -p args_flat args_arr
declare -- args_flat="first arg second arg third arg"
declare -a args_arr='([0]="first arg" [1]="second arg" [2]="third arg")'
Now, if your goal is an eval-safe string, that would look like this:
$ printf -v args_str '%q ' "$@"
$ declare -p args_str
declare -- args_str="first\\ arg second\\ arg third\\ arg "
What this did is generate a chunk of script which, if parsed by a shell, will evaluate back to its original inputs -- with first arg, second arg, and third arg each still recognized as separate words. This is thus something you could safely append to cmd.
Dude, this is exactly what I was looking for. Thank-you!
I'm getting this, any idea?
~/dotfiles ☀️ ✖ 1 $ tab ls
58:66: syntax error: Expected end of line but found identifier. (-2741)
Looks like a newer version of osascript or iterm has caused this error. I found the updated syntax to use on iterms site which has given me this updated code. Cheers.
# needed to use exit instead of return
[ `uname -s` != "Darwin" ] && echo "Cannot run on non-macosx system." && exit
function tab () {
local cmd=""
local cdto="$PWD"
local args="$@"
if [ -d "$1" ]; then
cdto=`cd "$1"; pwd`
args="${@:2}"
fi
if [ -n "$args" ]; then
cmd="$args"
fi
osascript -i <<EOF
tell application "iTerm"
tell current window
create tab with default profile
tell the current session
write text "cd \"$cdto\"; $cmd"
end tell
end tell
end tell
EOF
}
tab "echo hello"
Thanks for the update! The code worked, but I was having trouble running the command (i.e. cmd). Made changes to my code, in case anyone else wants to use it (am using iTerm2):
function tab () {
local cdto="$PWD"
local args="$@"
if [ -d "$1" ]; then
cdto=`cd "$1"; pwd`
args="${@:2}"
fi
osascript -i <<EOF
tell application "iTerm2"
tell current window
create tab with default profile
tell the current session
write text "cd \"$cdto\" && $args"
end tell
end tell
end tell
EOF
}
Cheers!
As of at least macos Mojave, iTerm 3.2.8, if you run:
$ open -a iTerm .
It will add it as a tab to the current window.
$ open -a iTerm .
Sure, just destroy all their hard work. But, thanks!
Somehow it doesn't work so I change a bit to make sure it addresses my needs: to open a tab vertically and run the command.
#!/bin/bash
[ `uname -s` != "Darwin" ] && return
function tab () {
local cmd=""
local cdto="$PWD"
local args="$@"
if [ -d "$1" ]; then
cdto=`cd "$1"; pwd`
args="${@:2}"
fi
if [ -n "$args" ]; then
cmd="; $args"
fi
osascript &>/dev/null <<EOF
tell application "iTerm"
activate
tell current session of current window to set newTab to split vertically with same profile
tell newTab
select
write text "cd \"$cdto\"$cmd"
end tell
end tell
EOF
}
Save it to a file, source it and test it by:
tab echo 123
noob question - will this work with zsh too?
@newplasticideas there are currently bash and fish implementations. it's possible to port this to zsh as well, but if you're going to do that, i'd suggest starting with https://github.com/oh-my-fish/plugin-tab which has been updated more recently and supports a lot more terminals :)
ITerm2's Applescript is deprecated. Take a look at the Python API and this example: https://iterm2.com/python-api/tutorial/example.html
Sweet! thank you.