Wie kann ich ein neues Terminal in demselben Verzeichnis wie das zuletzt verwendete Terminal über eine Windows Manager-Tastatur öffnen?


25

Ich verwende einen Fenstermanager für Kacheln und habe von gnome-terminalmit mehreren Registerkarten zu mehreren urxvtInstanzen gewechselt, die vom Fenstermanager verwaltet werden. Eine der Funktionen, die ich vermisse, ist die Möglichkeit, ein neues Terminal zu öffnen, das standardmäßig das Arbeitsverzeichnis des letzten Terminals verwendet.

Kurz gesagt: Ich brauche eine Möglichkeit, ein neues urxvt (bash) zu öffnen, das standardmäßig $ PWD des zuletzt verwendeten verwendet.

Die einzige Lösung, die mir in den Sinn kommt, ist, den aktuellen Pfad auf jedem cdmit so etwas zu speichern :

echo $PWD > ~/.last_dir

und stellen Sie den Pfad auf dem neuen Terminal folgendermaßen wieder her:

cd `cat ~/.last_dir`

Ich kann den zweiten Befehl eingeben, .bashrcaber ich weiß nicht, wie ich den ersten Befehl bei jedem Verzeichniswechsel ausführen soll :)

Jede einfachere Lösung, die nicht beinhalten screenoder tmuxNutzung ist willkommen.


Verwenden Sie die " tabbed" Perl-Erweiterung von urxvt?
Rozcietrzewiacz

Keine Tabs, ich verwende neue Terminals, die von WM
Luca

Antworten:


9

Ich sehe drei Lösungen mit .last_dir. Sie können die echo $PWD > ~/.last_direntweder platzieren:

  1. In einer speziellen Funktion wäre das ein Wrapper für cd:

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

    Legen Sie dies in Ihr ~/.bashrcund verwenden Sie dann cd_jedes Mal anstelle von cd, wenn Sie möchten, dass Ihr neues Arbeitsverzeichnis gespeichert wird.

  2. In Ihrem $PROMPT_COMMAND( nicht empfohlen ):

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

    Sie können dies direkt vom Terminal aus testen oder in das Terminal stellen ~/.bashrc. Diese Lösung löst jedoch jedes Mal, wenn die Eingabeaufforderung angezeigt wird, einen Datenträgerschreibvorgang aus, der möglicherweise Probleme verursacht. Auf der anderen Seite wird .last_dirdas aktuelle Verzeichnis angezeigt, unabhängig davon, wie Sie dorthin gelangt sind.

  3. In einem benutzerdefinierten Perl-Erweiterungsskript für rxvt. Ich habe selbst noch nie eines erstellt, aber im Internet finden Sie einige Beispiele.


PROMPT_COMMAND das habe ich gesucht. Ich werde diese Lösung ausprobieren, in der Hoffnung, dass sie die Leistung nicht beeinträchtigt.
Luca

Nun, ehrlich gesagt ist es eine ziemlich grobe Art und Weise. Persönlich mag ich Michaels Lösung am besten :)
rozcietrzewiacz

1
Ich mag die Perl-Erweiterung, wenn sie außerhalb des Terminals funktionieren soll. Es scheint sauberer zu sein, als etwas in PROMPT_COMMANDeine der am meisten missbrauchten Umgebungsvariablen aller Zeiten zu hacken
Michael Mrozek

Es scheint, dass $ PWD nur das erste Mal ausgewertet wird
Luca

@neon Aaah ... Entschuldigung. Das Problem liegt darin, wie PROMPT_COMMAND zitiert wird. (Oder besser gesagt, wie $PWDwurde nicht zitiert.) Lassen Sie mich das beheben ... Dort. Das sollte es tun.
Rozcietrzewiacz

13

Ich verwende derzeit diese Version der Lösung 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

in meinem .zshrc


Ich verwende auch die Lösung Nr. 1 und füge hinzu, dass trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXITich immer bei mir zu Hause anfangen möchte, außer wenn ich einen neuen Tab
öffne

Dies funktioniert nicht, wenn die auto_cdFunktion von zsh verwendet wird. Es stellt sich heraus, dass wir einen von zsh bereitgestellten
jonleighton

12

Das ist eigentlich ziemlich trivial; Wenn Sie urxvtin Ihrem vorhandenen urxvtFenster ausgeführt werden, befindet sich das neue Fenster im selben Verzeichnis. Ich habe dupmich urxvt &aus diesem Grund darauf geeinigt . Wenn Sie möchten, dass es an einen Hotkey gebunden wird, können Sie den bindBefehl bash verwenden . Zum Beispiel, um es zu binden an F1:

$ bind '"\e[11~": "urxvt &\n"'

Danke für den Tipp. Ich wusste, dass untergeordnete Terminalprozesse den Status beibehalten, aber ich wusste nicht, dass Sie in bash einen Schlüssel an einen Befehl binden können. Ich möchte dies von WM aus tun, um ein Fokussieren des Terminals zu vermeiden.
Luca

Ich mag es. Keine Schreibvorgänge auf der Festplatte und die einzige Ausführung findet statt, wenn Sie das neue Terminal öffnen möchten.
Rozcietrzewiacz

Das einzige, was ich ändern würde, ist zu verwenden, ( urxvt & ) &>/dev/nullanstatt nur Hintergrund.
Rozcietrzewiacz

Diese Lösung ist großartig und flexibler, aber ich verwende nicht gerne zwei Bindungen, eine zum Starten des Terminals und eine zum Verzweigen einer neuen.
Luca


4

Natürlich ist es ein funktionierender Ansatz, cddas Verhalten zu ändern , aber ich möchte eine einfachere Lösung zeigen. In der man bash (1) habe ich festgestellt, dass eine interaktive , ~/.bash_logoutwenn sie existiert. Anstatt also den Pfad bei jedem Aufruf cdzu speichern, kann der letzte Pfad beim Beenden gespeichert werden.

Meine ~/.bash_logoutist sehr einfach:

echo $PWD >~/.lastdir

Und irgendwo in meiner habe .bashrcich diese Zeile platziert:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)

1
Beachte .bash_logoutnur login shells, dass das nur beim Beenden läuft , das ist nicht immer der Fall.
Henfiber

1
Alternativ können Sie den letzten Pfad speichern, wenn Sie das bashtrap "echo $PWD > ~/.lastdir" EXIT"
Programm beenden

@henfiber Danke für deine Kommentare! Ich denke in diesem Fall ist die Shell eine Login-Shell, so dass sich diese korrekt verhält. Auf der anderen Seite ist der trapAnsatz auch schön, ich mag es!
TrueY

2

Sehr oft verwende ich mehrere Terminalfenster gleichzeitig, in denen sich jeweils mehrere Registerkarten befinden. Beispiel: Ein Fenster für Registerkarten für die Quellcodeentwicklung, ein Fenster für Latexdateien, ein Fenster für die Ausführung und Skripterstellung von R usw. In einem Fenster soll ein neues Terminal mit Registerkarten in das Verzeichnis wechseln, das zuletzt in diesem bestimmten Fenster verwendet wird (Das hat früher funktioniert, aber mit der neuen Gnom-Version irgendwie nicht). Die folgende schmutzige Lösung funktioniert gut für mich. Ich habe dies in .bashrc gestellt.

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

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}

Das ist perfekt ... wohoo! Vielen Dank. Ich weiß nicht viel über das Hacken von Bash, aber Mann, ich liebe es schon ...
apil.tamang
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.