2009-10-19 11 views
20

He estado buscando en Google por un tiempo buscando una manera simple de hacer esto, y no puedo encontrar uno.Abrir una nueva pestaña de terminal en OSX (Snow Leopard) con la ruta de directorio de Windows de terminal de apertura

Tengo un entorno de terminal personalizado configurado (zsh) con varios alias y funciones para facilitar las cosas. Una cosa que sigo encontrando es que rápidamente APPLE-t crearé una nueva pestaña y luego escribiré un comando relativo a la ruta de la ventana de la terminal en la que acabo de ingresar. Esto invariablemente falla porque la ruta de la nueva pestaña es ~/en lugar de lo que solo estaba usando! ¿Alguna idea para una secuencia de comandos para establecer la ruta del directorio de las nuevas pestañas de terminal a la ruta del directorio de la pestaña de apertura?

Cualquier ayuda más apreciada.

Ian

+1

Solución: cambie a http://konsole.kde.org/, lo que sí es compatible con la preservación de CWD en nuevas pestañas/ventanas. :) – ephemient

+1

Me pregunto si hay alguna solución de AppleScript para esto. –

Respuesta

4

OK, así como es mi manera estoy respondiendo a mi propia pregunta de nuevo (bueno, al menos está acercando a responder de todos modos)

he encontrado un script menos detallado que el de arriba (cortesía de Dan Benjamin) que parece hacer el truco, aunque ambos scripts emiten un error similar antes de completar con éxito. He tratado con eso agregando claro al final del guión, por lo que no es un gran problema.

Digo que casi he resuelto mi problema porque mi objetivo era encontrar una forma de lograrlo con el comando Apple-t key que se ha grabado en mi memoria muscular como atajo de una nueva pestaña en cualquier cosa, gracias a innumerables horas en varios navegadores web. Lo mejor que puedo lograr con un script como el de Dan es t-return, que no es la mayor diferencia, pero lo suficientemente grande como para que me irrite un poco cada vez que ejecuto dicho comando. Lo sé, debería dejarlo ir ... Pero no puedo, que es probablemente la forma en que me metí en este lío en primer lugar, jugando sin fin con las computadoras. I paréntesis, aquí es el script que estoy usando:

#!/bin/sh 

# Make a new OS X Terminal tab with the current working directory. 

if [ $# -ne 1 ]; then 
    PATHDIR=`pwd` 
else 
    PATHDIR=$1 
fi 

/usr/bin/osascript <<EOF 
activate application "Terminal" 
tell application "System Events" 
    keystroke "t" using {command down} 
end tell 
tell application "Terminal" 
    repeat with win in windows 
     try 
      if get frontmost of win is true then 
       do script "cd $PATHDIR; clear" in (selected tab of win) 
      end if 
     end try 
    end repeat 
end tell 
EOF 
clear 

Para completar aquí es el error que obtiene escupió en la ventana solicitando si trailing clara se omite el:

2009-10-20 01:30:38.714 osascript[20862:903] Error loading /Library/ScriptingAdditions/Adobe Unit Types.osax/Contents/MacOS/Adobe Unit Types: dlopen(/Library/ScriptingAdditions/Adobe Unit Types.osax/Contents/MacOS/Adobe Unit Types, 262): no suitable image found. Did find: 
    /Library/ScriptingAdditions/Adobe Unit Types.osax/Contents/MacOS/Adobe Unit Types: no matching architecture in universal wrapper 
osascript: OpenScripting.framework - scripting addition "/Library/ScriptingAdditions/Adobe Unit Types.osax" declares no loadable handlers. 
tab 2 of window id 13942 
+0

Esto falla para mí en Snow Leopard (10.6.8): línea 25: 1371 Error de segmentación/usr/bin/osascript –

+0

@JohnKeyes & i0n, si desea una solución menos detallada que funcione en Snow Leopard, debe dar [Gavin's] (http://stackoverflow.com/a/7911097/768510) responde una mirada. –

+0

@ThomasNadin Gracias por señalarme eso. –

1

En mi respuesta here, que proporciona una función y un alias:

function cd() { command cd "[email protected]"; echo "$PWD" > /tmp/CWD; } 
export cd 

alias cdp='cd $(cat /tmp/CWD)' 

usted debería ser capaz de poner una declaración (posiblemente condicional) al final de su ~/.bashrc o ~/.zshrc a ejecuta ese alias.

+0

No es perfecto, sin embargo. Supongamos que tiene dos pestañas abiertas, su último 'cd' se hizo en la pestaña 1, pero actualmente está trabajando en la pestaña 2. Ahora genera una nueva pestaña: va al CWD de la pestaña 1, no al CWD de la pestaña 2. – ephemient

+0

Esto rompe el comando de cd en mi terminal. No estoy seguro por qué, pero pensé que sería mejor mencionarlo para beneficio de los demás. Todo vuelve a la normalidad una vez eliminado. ¡Gracias por tu esfuerzo! – i0n

+0

@ephemient: La variable '$ PROMPT_COMMAND' se puede establecer en' 'echo' $ PWD ">/tmp/CWD'' por lo que se escribe cada vez que se emite un mensaje. @ i0n: ¿Qué significa exactamente "breaks"? ¿Mensaje de error? Comportamiento específico? –

4

Puede obtener lo que desea modificando el script BASH encontrado en http://www.entropy.ch/blog/Mac+OS+X/2008/06/27/Terminal-Tricks-“term”-revisited-with-tabs. Aquí está el guión, tomado del sitio de Marc Linyage www.entropy.ch/blog.

#!/bin/sh 
# 
# Open a new Mac OS X terminal window or tab in the current or another 
# directory and optionally run a command in the new window or tab. 
# 
# - Without any arguments, the new terminal window opens in 
# the current directory, i.e. the executed command is "cd $PWD". 
# - If the first argument is a directory, the new terminal will "cd" into 
# that directory before executing the remaining arguments as command. 
# - The optional "-t" flag executes the command in a new tab 
# instead of a new window. 
# - The optional "-x" flag closes the new window or tab 
# after the executed command finishes. 
# - The optional "-p" flag takes an argument of the form x,y (e.g. 40,50) and 
# positions the terminal window to the indicated location on the screen 
# - The optional "-s" flag takes an argument of the form w,h (e.g. 800,400) and 
# resizes the terminal window to the indicated width and height in pixels. 
# 
# Written by Marc Liyanage <http://www.entropy.ch> 
# 
# Version 2.1 
# 

set -e 

while getopts xtp:s: OPTION; do 
    [ $OPTION = "x" ] && { EXIT='; exit'; } 
    [ $OPTION = "t" ] && { TAB=1; } 
    [ $OPTION = "p" ] && { POSITION="set position of window 1 to {$OPTARG}"; } 
    [ $OPTION = "s" ] && { SIZE="set size of window 1 to {$OPTARG}"; } 
done 

for (($OPTIND; $OPTIND-1; OPTIND=$OPTIND-1)); do shift; done 

if [[ -d "$1" ]]; then WD=$(cd "$1"; pwd); shift; else WD=$PWD; fi 


COMMAND="cd '$WD' && echo -n \$'\\\\ec';" 
for i in "[email protected]"; do 
COMMAND="$COMMAND '$i'" 
done 

if [ $TAB ]; then 

osascript 2>/dev/null <<EOF 
tell application "System Events" 
    tell process "Terminal" to keystroke "t" using command down 
end 
tell application "Terminal" 
    activate 
    do script with command "$COMMAND $EXIT" in window 1 
    $POSITION 
    $SIZE 
end tell 
EOF 

else 

osascript <<EOF 
tell application "Terminal" 
    activate 
    do script with command "$COMMAND $EXIT" 
    $POSITION 
    $SIZE 
end tell 
EOF 

fi 
+1

Huh. Me pregunto para qué sirve ese tonto 'for ((...))' loop; 'shift $ OPTIND' sería mucho mejor. Además, 'COMMAND = ...' debería ser más como 'COMMAND =" cd $ (printf '% q' "$ WD") ... "' por seguridad. Ah, bueno, parece razonablemente inteligente independientemente. – ephemient

6

Otra solución sin scripting es iTerm2, que tiene esta función incorporada. Tiene incluso más funciones que también lo hacen útil.

+1

iTerm2 es tan exitoso. No sé lo que haría sin eso. El modo de pantalla completa y la división de pantalla también es una característica imprescindible. No puedo creer los aros de manzanas que las personas están dispuestas a saltar cuando iTerm2 hace que esto (¡y muchas otras cosas esenciales) sea tan fácil! – isaacs

+0

¿Cómo se logra esto con iTerm2? – mycargus

+2

@mycargus Pruebe esto: iTerm2 -> Preferencias -> Perfiles -> General -> Reutilizar el directorio principal de la sesión anterior – xer0x

55

Tengo un par de scripts que utilizo:

DUP (Nueva ventana con el directorio de trabajo):

#!/bin/sh 
pwd=`pwd` 
osascript -e "tell application \"Terminal\" to do script \"cd $pwd; clear\"" > /dev/null 

y TUP (Nueva pestaña con el mismo directorio de trabajo):

#!/bin/sh 

pwd=`pwd` 
osascript -e "tell application \"Terminal\"" \ 
    -e "tell application \"System Events\" to keystroke \"t\" using {command down}" \ 
    -e "do script \"cd $pwd; clear\" in front window" \ 
    -e "end tell" 
    > /dev/null 
+1

Estos son geniales, realmente no hay suficientes +1 para esta respuesta. Gracias Gavin, simplemente genial. –

+0

¡Agradable! Ahora estoy usando iTerm, pero probé esto en Terminal y funcionan de maravilla. –

+3

Impresionante, lo modifiqué levemente para tomar una discusión. Lo uso para arrancar el entorno de mis proyectos web ahora: https://gist.github.com/2492064 –

Cuestiones relacionadas