2009-10-19 9 views
20

Przez jakiś czas szukałem w Google sposobu, aby to zrobić i nie mogę go znaleźć.Otwieranie nowej zakładki terminali w systemie OSX (Snow Leopard) z otwieraniem ścieżki katalogu Windows terminalu

Mam niestandardowe ustawienie środowiska terminala (zsh) z różnymi aliasami i funkcjami ułatwiającymi pracę. Jedną z rzeczy, na które napotykam, jest to, że szybko APPLE-t utworzę nową kartę, a następnie wpiszę polecenie w stosunku do ścieżki okna terminala, w którym byłem właśnie. To zawsze kończy się niepowodzeniem, ponieważ ścieżka nowej karty to ~/zamiast tego, czego właśnie używałem! Wszelkie pomysły na skrypt, aby ustawić ścieżkę katalogu dla nowych kart terminalu do ścieżki katalogu karty otwarcia?

Każda pomoc najbardziej ceniona.

Ian

+1

Rozwiązanie: przejdź na stronę http://konsole.kde.org/, która obsługuje zapisywanie CWD w nowych kartach/oknach. :) – ephemient

+1

Zastanawiam się, czy jest jakieś rozwiązanie AppleScript do tego. –

Odpowiedz

4

OK, tak jak to jest moja droga ja znowu odpowiadając na moje własne pytanie (dobrze przynajmniej zbliżają się do odpowiedzi na to w każdym razie)

znalazłem mniej gadatliwe skrypt do powyższego (dzięki uprzejmości Dan Benjamin), który wydaje się być skuteczny, mimo że oba skrypty wyświetlają podobny błąd przed pomyślnym ukończeniem. Zajmowałem się tym, dodając jasne na końcu skryptu, więc nie jest to duży problem.

Mówię, że prawie rozwiązałem mój własny problem, ponieważ moim celem było znalezienie sposobu, aby to osiągnąć za pomocą polecenia klawisza Apple-t, które zostało spalone w mojej pamięci mięśniowej jako skrót do nowej zakładki w czymkolwiek, dzięki niezliczonym godzinom w różnych przeglądarkach internetowych. Najlepsze, co potrafię z takim skryptem, jak Dan, to zwrot w obie strony, który nie jest największą różnicą, ale na tyle duży, że będę lekko zdenerwowany za każdym razem, gdy wydam komendę. Wiem, powinienem pozwolić mu odejść ..... Ale ja nie mogę, a to jest prawdopodobnie, jak wpadłem w ten bałagan, bez końca bawiąc się komputerami. Błądzić, tutaj jest skrypt używam:

#!/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 

Dla kompletności tutaj jest błąd, który pobiera wypluł na oknie zwracający jeśli spływu jasne jest pominięty:

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

Nie działa to w systemie Snow Leopard (10.6.8): linia 25: 1371 Błąd segmentacji/usr/bin/osascript –

+0

@JohnKeyes & i0n, jeśli chcesz mniej rozwlekłego rozwiązania, które działa w systemie Snow Leopard, powinieneś podać [Gavin's] (http://stackoverflow.com/a/7911097/768510) odpowiedz na pytanie. –

+0

@ThomasNadin Dzięki za wskazanie mi tego. –

1

W mojej odpowiedzi here, I, pod warunkiem funkcję i alias:

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

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

powinieneś móc umieścić (ewentualnie warunkowe) oświadczenie na końcu ~/.bashrc lub ~/.zshrc do wykonaj ten alias.

+0

Jednak nie do końca doskonały. Załóżmy, że masz otwarte dwie karty, twoje ostatnie "cd" zostało zrobione na karcie 1, ale aktualnie pracujesz w zakładce 2. Teraz twoja nowa karta - idzie do CWD na karcie 1, a nie do CWD karty 2. – ephemient

+0

To łamie polecenie cd w moim terminalu. Nie wiem, dlaczego, ale pomyślałem, że lepiej to wspomnę dla innych. Po usunięciu wszystko wraca do normy. Dzięki za twoje wysiłki! – i0n

+0

@ephemient: Zmienna '$ PROMPT_COMMAND' może być ustawiona na '' echo" $ PWD ">/tmp/CWD'', więc jest zapisywana za każdym razem, gdy zostanie wyświetlony monit. @ i0n: Co dokładnie oznacza "przerwy"? Komunikat o błędzie? Specyficzne zachowanie? –

4

Możesz uzyskać to, co chcesz, modyfikując skrypt BASH znaleziony pod adresem http://www.entropy.ch/blog/Mac+OS+X/2008/06/27/Terminal-Tricks-“term”-revisited-with-tabs. Oto skrypt, zaczerpnięty ze strony Marca Linyage'a: 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. Zastanawiam się, do czego służy ta głupia pętla 'for ((...))'; 'shift $ OPTIND' byłoby znacznie lepsze. Również "COMMAND = ..." powinno zdecydowanie bardziej przypominać 'COMMAND =" cd $ (printf '% q' "$ WD") ... "' dla bezpieczeństwa. Cóż, wydaje się rozsądnie sprytny, niezależnie od tego. – ephemient

6

Innym rozwiązaniem bez Skrypty to iTerm2, które mają wbudowaną tę funkcję. Ma jeszcze więcej funkcji, które sprawiają, że warto ją sprawdzić.

+1

iTerm2 jest bardzo interesujący. Nie wiem, co bym bez niego zrobił. Tryb pełnoekranowy i podział ekranu to także funkcja obowiązkowa. Nie mogę uwierzyć w obręcze jabłek, które ludzie są gotowi skakać, kiedy iTerm2 sprawia, że ​​to (i wiele innych istotnych rzeczy) jest tak proste! – isaacs

+0

Jak to osiągnąć dzięki iTerm2? – mycargus

+2

@mycargus Wypróbuj to: iTerm2 -> Preferencje -> Profile -> Ogólne -> Ponownie użyj katalogu domowego poprzedniej sesji. – xer0x

55

Mam kilka skryptów używam:

dup (nowe okno z katalogu roboczego):

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

i tup (Nowa karta z tego samego katalogu roboczego):

#!/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

To jest genialne, naprawdę nie ma wystarczającej liczby +1 dla tej odpowiedzi. Dziękuję Gavin, po prostu genialny. –

+0

Nice! Używam teraz iTerma, ale wypróbowałem je w Terminalu i działają na nich. –

+3

Awesome, I slighlty zmodyfikował go, aby wziąć argument. Używam go do ładowania środowiska moich projektów internetowych teraz: https://gist.github.com/2492064 –

Powiązane problemy