Otwórz nową kartę w tym samym katalogu

41

Powiedz, że jesteś w folderze / very / cool / and / deeply / nested /. I chcesz otworzyć nową kartę terminala w tym samym folderze.

Jak byś to zrobił?

Używam Mac OS i Zsh.

Nerian
źródło

Odpowiedzi:

62

Użyj Oh-My-Zsh i dodaj wtyczkę „osx” w swoim ~ / .zshrc, np .:

plugins=(osx)

Jeśli używasz aplikacji terminalowej OSX, musisz również dodać terminalappwtyczkę: kredyt

plugins=(osx terminalapp)

Jeśli korzystasz z iTerm, musisz ustawić opcję konfiguracji ( pamiętaj, że nie potrzebujesz wtyczek zsh, aby to działało ): kredyt

Preferencje> Profile> Domyślne> Ogólne> Katalog roboczy> Użyj ponownie opcji katalogu poprzedniej sesji

Aktualizacja panelu Preferencje iTerm2 w celu ponownego wykorzystania katalogu poprzedniej sesji.

To wszystko, co musisz zrobić!

Pieter
źródło
1
czy to działa również w iTerm?
ahmy
1
@ahmy wygląda tak, jak powinno: github.com/robbyrussell/oh-my-zsh/blob/master/plugins/osx/…
philfreo
2
Działa to dla mnie, chyba że uruchamiam proces w konsoli. Jeśli mam proces, powiedzmy railsuruchomiony, i próbuję otworzyć nowe okno za pomocą polecenia n, kończę z powrotem w moim katalogu domowym.
YWCA Witam
@YWCAHello, czy znalazłeś rozwiązanie tego problemu?
Michał Miszczyszyn
@ Miszy Wróciłem do waniliowej Bash: /
YWCA Witam
23

Inną opcją dostępną teraz w systemie Mac OS X Lion jest korzystanie z wbudowanej funkcji. Wykorzystuje „sekwencje specjalne”, aby znaleźć bieżący katalog. Dla mnie to działa, jeśli użyję tych poleceń w moim .zshrc:

precmd () {print -Pn "\e]2; %~/ \a"}
preexec () {print -Pn "\e]2; %~/ \a"}

możliwe jest również użycie PS1(dla Bash, z tej wiki ):

export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "

gdzie \e]2;jest sekwencja ucieczki do drukowania rzeczy na pasku tytułowym. To wydaje się , że jest coraz Terminal.app swoje informacje stamtąd.

Więcej informacji:

Tim
źródło
myślę też, że oh-my-zsh ma to domyślnie. Używam tego od około tygodnia i działa prawie od razu po wyjęciu z pudełka.
Tim
Począwszy od systemu Mac OS X Lion 10.7, terminal wyświetli katalog roboczy za pomocą ikony „proxy” na pasku tytułu, ma opcje tworzenia nowych terminali w tym samym katalogu i obsługuje wznawianie terminali. Dla wygody Terminal sprawdzi zawartość tytułów okna / karty, aby sprawdzić, czy zawierają one prawidłową nazwę ścieżki. Jednak /etc/bashrczobaczysz, że obsługuje on także nowy kod ucieczki do informowania terminalu o katalogu roboczym za pomocą file:adresu URL, który może obsłużyć wszystkie prawidłowe nazwy ścieżek za pomocą kodowania procentowego (tytuły okna / karty mogą zawierać tylko podzbiór znaków ASCII ).
Chris Page
2
Sekwencja zmiany znaczenia przy ustawianiu katalogu roboczego jest tym samym kodem podstawowym, co przy ustawianiu tytułów - System operacyjny Command (OSC) - z kodem 7 zamiast 0-2:\e]7;file://hostname/percent-encoded-pathname\a
Chris Page
3
Dlaczego warto korzystać z precmd i preexec? Dlaczego nie tylko chpwd () {print -Pn "\e]2; %~/ \a"}?
Nick
1
Rozumiem, jak to aktualizuje pasek tytułowy, ale nie rozumiem, w jaki sposób powoduje to otwarcie nowej karty w tym samym katalogu, co poprzednia karta.
mareoraft,
3

Jest to bardzo prosta wersja, której użyłem w bash, a także działa w zsh. Zapisuje bieżący folder w pliku po każdym poleceniu (nie szkodzi zbytnio IMO) i otwiera nowy terminal w zapisanym bieżącym folderze.

dodaj następujące .zshrc

# emulate bash PROMPT_COMMAND (only for zsh)
precmd() { eval "$PROMPT_COMMAND" }
# open new terminal in same dir
PROMPT_COMMAND='pwd > "${HOME}/.cwd"'
[[ -f "${HOME}/.cwd" ]] && cd "$(< ${HOME}/.cwd)"
mjspier
źródło
Jest to fajne, ale wymaga wykonania polecenia na karcie, aby zaktualizować. W rzadkich przypadkach może to powodować nieoczekiwane zachowanie. Może istnieje inna funkcja, której możemy użyć, która jest uruchamiana, gdy przełączasz tabulatory zamiast uruchamiać polecenie?
mareoraft,
1

gdirs wydaje się sposobem na prawie to zrobić: nowa karta, a następnie gdirs, aby wybrać głęboki katalog i voila. Moim pierwszym pomysłem było udostępnienie stosu katalogów wszystkim kartom i zrobienie cd ~ 1 po nowej karcie, ale nie mogę znaleźć, jak to zrobić, ponieważ wydaje się, że każda instancja zsh zachowuje swoją własną. Udostępnianie historii odbywa się za pomocą wspólnego pliku, więc może i tutaj można to zrobić ...

Henno
źródło
0

Tak to robisz w bashu.

Ten skrypt powłoki powie (cicho, dosłownie przy użyciu Applescript) Terminal.app, aby otworzyć nową kartę, a następnie przejść do bieżącego katalogu:

#!/bin/bash
osascript -e 'tell application "Terminal"' \
-e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' \
-e "do script with command \"cd `pwd`;clear\" in selected tab of the front window" \
-e 'end tell' &> /dev/null

… Umieść powyższy skrypt powłoki w katalogu $PATH(np. / Usr / local / bin) i upewnij się, że jest wykonywalny:

$ chmod +x /usr/local/bin/nt

( źródło )

Nifle
źródło
Należy pamiętać, że od Mac OS X Lion 10.7 domyślnie Terminal uruchamia nowe karty w tym samym katalogu roboczym, co poprzednia karta. Musisz więc tylko teraz utworzyć kartę. (Jeśli używasz bash. Jeśli używasz innej powłoki, spójrz na kod w / etc / bashrc, aby dowiedzieć się, jak powiedzieć Terminalowi o bieżącym katalogu roboczym.)
Chris Page
0

Jeśli chcesz teraz otworzyć tę nową kartę, bez zmiany plików konfiguracyjnych lub instalowania nowych wtyczek, uruchom to:

pwd | pbcopy

Następnie ręcznie otwórz nową kartę Terminal (za pomocą ⌘T), a na nowej karcie:

cd "`pbpaste`"

Ostrzeżenie : spowoduje to zastąpienie zawartości schowka systemowego.


Alternatywna, dłuższa metoda, która nie zastępuje schowka:

pwd > $TMPDIR/wd

Otwórz nową kartę.

cd "$(cat $TMPDIR/wd)"
rm -f $TMPDIR/wd
Rory O'Kane
źródło
0

Zgodnie z powyższym komentarzem Pietera, po plugins=(git osx)zainstalowaniu wtyczek wystarczy wpisać tabi otworzy się nowa karta w bieżącym katalogu.

Walizka
źródło
0

Jeśli chcesz, aby katalog zmieniał się automatycznie po otwarciu nowej karty, użyj wtyczki dirpersist .

Wtyczka osx zapisuje tylko ostatni katalog, ale musisz uruchomić polecenie, tababy otworzyć nową kartę, co nie zawsze jest możliwe (jeśli, powiedzmy, uruchamiasz coś na bieżącej karcie).

garażtrois
źródło
0

Dodanie terminalapp do .zshrc nie działało dla mnie, więc szukałem wtyczki ~/.oh-my-zsh/plugins/terminalappi mówi mi:

# This file is intentionally empty.
#
# The terminalapp plugin is deprecated and may be removed in a future release.
# Its functionality has been folded in to the core lib/termsupport.zsh, which
# is loaded for all users. You can remove terminalapp from your $plugins list
# once all your systems are updated to the current version of Oh My Zsh.
Steve Root
źródło
0

Nowe karty są już otwarte w tym samym folderze (Cmd + T). W przypadku nowych okien (Cmd + N) rozwiązanie firmy Pieter ma rację:

Preferencje> Profile> Domyślne> Ogólne> Katalog roboczy> Użyj ponownie opcji katalogu poprzedniej sesji

Punnerud
źródło