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.

Luca
quelle
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.

rozcietrzewiacz
quelle
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

Luca
quelle
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"'
Michael Mrozek
quelle
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

Fügen . /etc/profile.d/vte.shSie einfach Ihre hinzu ~/.bashrc, um die gleiche Funktion zu erhalten

David Villa
quelle
Diese Arbeit, aber warum stören -1 das?
Abdillah
Dies funktioniert und es sieht so aus, als wäre es die bevorzugte Lösung für Launchpad / von Gnome-Terminal-Entwicklern: bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1132700
Ajax
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)
TrueY
quelle
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
}
BartT
quelle
Das ist perfekt ... wohoo! Vielen Dank. Ich weiß nicht viel über das Hacken von Bash, aber Mann, ich liebe es schon ...
apil.tamang