Jak mogę otworzyć nowy terminal w tym samym katalogu, który był ostatnio używany, ze skrótu klawiszowego menedżera okien?

25

Używam menedżera okien kafelkowych i przełączyłem się gnome-terminalz wieloma kartami na wiele urxvtinstancji zarządzanych przez menedżera okien. Jedną z funkcji, których mi brakuje, jest możliwość otwarcia nowego terminalu, który domyślnie pracuje w katalogu roboczym ostatniego.

W skrócie: Potrzebuję sposobu, aby otworzyć nowy urxvt (bash), który domyślnie ma wartość $ PWD ostatnio używanego.

Jedyne rozwiązanie, jakie przychodzi mi na myśl, to zapisanie bieżącej ścieżki na każdym cdz takich elementów:

echo $PWD > ~/.last_dir

i przywróć ścieżkę na nowym terminalu w ten sposób:

cd `cat ~/.last_dir`

Mogę podać drugie polecenie, .bashrcale nie wiem, jak wykonać pierwsze przy każdej zmianie katalogu :)

Wszelkie prostsze rozwiązania, które nie wymagają screenani nie są tmuxużyteczne, są mile widziane.

Luca
źródło
Czy używasz tabbedrozszerzenia perla „ ” dla urxvt?
rozcietrzewiacz
Brak zakładek, korzystam z nowych terminali zarządzanych przez WM
Luca,

Odpowiedzi:

9

Widzę trzy rozwiązania .last_dir. Możesz umieścić echo $PWD > ~/.last_dir:

  1. W specjalnej funkcji, która byłaby opakowaniem dla cd:

    function cd_
    {
      [[ -d "$@" ]] || return 1
      echo "$@" > ~/.last_dir
      cd "$@"
    }

    Umieść to w swoim, ~/.bashrca następnie używaj cd_zamiast cd za każdym razem, gdy chcesz zapisać nowy katalog roboczy.

  2. W twoim $PROMPT_COMMAND( niezalecane ):

    PROMPT_COMMAND="$PROMPT_COMMAND; pwd > ~/.last_dir"

    Możesz to przetestować bezpośrednio z terminala lub umieścić w ~/.bashrc. To rozwiązanie jednak powoduje zapis dysku za każdym razem, gdy pojawia się monit, co może powodować problemy - ale z drugiej strony .last_dirzawierałby bieżący katalog, bez względu na to, jak się tam dostałeś.

  3. W niestandardowym skrypcie rozszerzenia perla dla rxvt. Sam nigdy go nie stworzyłem, ale możesz znaleźć sporo przykładów w Internecie.

rozcietrzewiacz
źródło
PROMPT_COMMAND tego właśnie szukałem. Spróbuję tego rozwiązania, mając nadzieję, że nie wpłynie to na wydajność.
Luca
Szczerze mówiąc, jest to dość prymitywny sposób. Osobiście najbardziej podoba mi się rozwiązanie Michaela :)
rozcietrzewiacz
1
Podoba mi się sposób rozszerzenia perla, jeśli musi działać poza terminalem; wydaje się czystsze niż włamanie się do PROMPT_COMMANDjednej z najbardziej nadużywanych zmiennych środowiskowych wszechczasów
Michael Mrozek
Wygląda na to, że PWD $ jest oceniane dopiero po raz pierwszy
Luca
@neon Aaah ... Przepraszam. Problem polega na tym, jak cytowany jest PROMPT_COMMAND. (A raczej, jak $PWDto nie było cytowane.) Pozwól mi to naprawić ... Tam. To powinno to zrobić.
rozcietrzewiacz
13

Obecnie używam tej wersji rozwiązania nr 1

# save path on cd
function cd {
    builtin cd $@
    pwd > ~/.last_dir
}

# restore last saved path
if [ -f ~/.last_dir ]
    then cd `cat ~/.last_dir`
fi

w moim .zshrc

Luca
źródło
Używam # 1 rozwiązanie zbyt i dodać trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXITchcę rozpocząć zawsze w moim domu, z wyjątkiem kiedy otworzyć nową kartę
rkmax
To nie działa, jeśli używasz auto_cdfunkcji zsh. Okazuje się, że możemy użyć haka, który zapewnia zsh: gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton
12

To jest właściwie dość trywialne; jeśli uruchomisz urxvtz istniejącego urxvtokna, nowe okno będzie znajdować się w tym samym katalogu. Z tego powodu dupaliasowałem do urxvt &. Jeśli chcesz powiązać go ze skrótem, możesz użyć bindpolecenia bash . Na przykład, aby powiązać go z F1:

$ bind '"\e[11~": "urxvt &\n"'
Michał Mrożek
źródło
Dzięki za wskazówkę. Wiedziałem, że terminalowe procesy potomne utrzymują ten stan, ale nie wiedziałem, że możesz powiązać klucz z poleceniem w bash. Chciałbym to zrobić z WM, aby uniknąć skupiania się na terminalu.
Luca
Lubię to. Brak zapisu na dysku, a jedyne wykonanie ma miejsce, gdy masz zamiar otworzyć nowy terminal.
rozcietrzewiacz
Jedyne, co chciałbym zmienić, to używać ( urxvt & ) &>/dev/nullzamiast tła.
rozcietrzewiacz
To rozwiązanie jest świetne i bardziej elastyczne, ale nie lubię używać 2 powiązań, jednego do uruchomienia terminala, a drugiego do rozwidlenia nowego.
Luca
4

Wystarczy dodać . /etc/profile.d/vte.shswoją, ~/.bashrcaby uzyskać tę samą funkcję

David Villa
źródło
Ta praca jednak po co męczyć -1 to?
Abdillah
To działa i wygląda na to, że tak naprawdę jest preferowanym rozwiązaniem na launchpad / gnome-terminal devs
Ajax
4

Oczywiście jest to działające podejście do modyfikacji cd zachowania, ale chciałbym pokazać prostsze rozwiązanie. W man bash (1) odkryłem, że jeśli interaktywne zakończy się, uruchomi się, ~/.bash_logoutjeśli istnieje. Zamiast zapisywać ścieżkę przy każdym wywołaniu cdostatniej ścieżki, można ją zapisać przy wyjściu.

Mój ~/.bash_logoutjest bardzo prosty:

echo $PWD >~/.lastdir

I gdzieś w moim .bashrc linii umieściłem tę linię:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)
Prawda
źródło
1
Pamiętaj, że .bash_logoutdziała tylko przy login shellswyjściu, nie zawsze tak jest.
henfiber
1
Ewentualnie zapisz ostatnią ścieżkę po bashwyjściu z: trap "echo $PWD > ~/.lastdir" EXIT"
henfiber
@henfiber Dziękujemy za komentarze! Myślę, że w tym przypadku powłoka jest powłoką logowania, więc będzie się ona poprawnie zachowywać. Z drugiej strony trappodejście jest również fajne, podoba mi się!
TrueY
2

Bardzo często korzystam z wielu okien terminali jednocześnie, z których każde zawiera wiele kart. Na przykład: jedno okno dla kart rozwoju kodu źródłowego, jedno okno dla plików lateksowych, jedno okno do wykonywania R i skryptów itp. W jednym oknie chcę, aby nowy terminal z kartami zmienił się na katalog używany ostatnio w tym konkretnym oknie (kiedyś działało to w przeszłości, ale w nowej wersji gnome jakoś nie działa). Poniższe brudne rozwiązanie działa dla mnie dobrze. Umieściłem to w .bashrc.

dirfilename="/tmp/.lastdir-$WINDOWID"
[ -r "$dirfilename" ] &&  {
    savdir=`cat $dirfilename`
    cd "$savdir"
}

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}
BartT
źródło
To jest idealne ... wohoo! Dzięki. Nie wiem dużo o hakowaniu bashów, ale człowieku już to uwielbiam ...
apil.tamang