Comment puis-je ouvrir un nouveau terminal dans le même répertoire que le dernier utilisé depuis un raccourci clavier du gestionnaire de fenêtres?

25

J'utilise un gestionnaire de fenêtres en mosaïque et je suis passé de gnome-terminalplusieurs onglets à plusieurs urxvtinstances gérées par le gestionnaire de fenêtres. L'une des fonctionnalités qui me manque est la possibilité d'ouvrir un nouveau terminal qui revient par défaut au répertoire de travail du dernier.

En bref: j'ai besoin d'un moyen d'ouvrir un nouvel urxvt (bash) qui par défaut est $ PWD du dernier utilisé.

La seule solution qui me vient à l'esprit est d'enregistrer le chemin actuel sur chacun cdavec quelque chose comme ceci:

echo $PWD > ~/.last_dir

et restaurez le chemin sur le nouveau terminal de cette façon:

cd `cat ~/.last_dir`

Je peux trouver la deuxième commande .bashrcmais je ne sais pas comment exécuter la première à chaque changement de répertoire :)

Toute solution plus simple qui n'implique screenni tmuxutilisation n'est pas la bienvenue.

Luca
la source
Utilisez-vous l' tabbedextension " " perl de urxvt?
rozcietrzewiacz
Pas d'onglets, j'utilise de nouveaux terminaux gérés par WM
Luca

Réponses:

9

Je vois trois solutions utiliser .last_dir. Vous pouvez placer echo $PWD > ~/.last_dirsoit:

  1. Dans une fonction spéciale qui serait un wrapper pour cd:

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

    Placez-le dans votre ~/.bashrc, puis utilisez cd_au lieu de cd chaque fois que vous souhaitez stocker votre nouveau répertoire de travail.

  2. Dans votre $PROMPT_COMMAND( non recommandé ):

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

    Vous pouvez le tester directement depuis le terminal ou le placer dans ~/.bashrc. Cette solution, cependant, déclenche une écriture sur le disque chaque fois que l'invite apparaît, ce qui pourrait causer des problèmes - mais d'un autre côté, .last_dircontiendrait le répertoire actuel, peu importe comment vous y êtes arrivé.

  3. Dans un script d'extension perl personnalisé pour rxvt. Je n'en ai jamais créé moi-même, mais vous pouvez trouver pas mal d'exemples sur le web.

rozcietrzewiacz
la source
PROMPT_COMMAND c'est ce que je cherchais. Je vais essayer cette solution en espérant qu'elle n'affecte pas les performances.
Luca
Eh bien, franchement, c'est une façon plutôt grossière. Personnellement, j'aime mieux la solution de Michael :)
rozcietrzewiacz
1
J'aime la manière d'extension perl, si elle doit fonctionner en dehors du terminal; il semble plus propre que de pirater quelque chose PROMPT_COMMAND, l'une des variables d'environnement les plus maltraitées de tous les temps
Michael Mrozek
Il semble que $ PWD ne soit évalué que la première fois
Luca
@neon Aaah ... Désolé. Le problème vient de la façon dont PROMPT_COMMAND est cité. (Ou plutôt, comment $PWDn'a pas été cité.) Permettez-moi de corriger cela ... Là. Cela devrait faire l'affaire.
rozcietrzewiacz
13

J'utilise actuellement cette version de la solution n ° 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

à l'intérieur de mon .zshrc

Luca
la source
trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXIT
J'utilise
Cela ne fonctionne pas si vous utilisez la auto_cdfonctionnalité de zsh. Il s'avère que nous pouvons utiliser un crochet fourni par zsh: gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton
12

C'est en fait assez banal; si vous exécutez à urxvtpartir de votre urxvtfenêtre existante , la nouvelle fenêtre sera dans le même répertoire. J'ai pris un dupalias urxvt &pour cette raison. Si vous voulez qu'il soit lié à un raccourci clavier, vous pouvez utiliser la bindcommande de bash . Par exemple, pour le lier à F1:

$ bind '"\e[11~": "urxvt &\n"'
Michael Mrozek
la source
Merci pour le conseil. Je savais que les processus fils terminaux maintenaient l'état mais je ne savais pas que vous pouvez lier une clé à une commande dans bash. Je voudrais le faire à partir de WM pour éviter de concentrer le terminal.
Luca
J'aime ça. Aucune écriture sur le disque et la seule exécution a lieu lorsque vous êtes sur le point d'ouvrir le nouveau terminal.
rozcietrzewiacz
La seule chose que je changerais est d'utiliser ( urxvt & ) &>/dev/nullau lieu de simplement un arrière-plan.
rozcietrzewiacz
Cette solution est excellente et plus flexible, mais je n'aime pas utiliser 2 liaisons, une pour lancer le terminal et une pour en créer une nouvelle.
Luca
4

Ajoutez simplement . /etc/profile.d/vte.shvotre ~/.bashrcpour obtenir la même fonctionnalité

villa david
la source
Ce travail, cependant, pourquoi déranger -1 cela?
Abdillah
Cela fonctionne, et il semble que ce soit en fait la solution préférée sur launchpad / de gnome-terminal devs: bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1132700
Ajax
4

Bien sûr, c'est une approche de travail pour modifier cdle comportement de, mais je voudrais montrer une solution plus simple. Dans le man bash (1), j'ai trouvé que si un interactif se il s'exécute ~/.bash_logouts'il existe. Ainsi, au lieu de stocker le chemin à chaque appel du cddernier chemin, vous pouvez l'enregistrer à la sortie.

Mon ~/.bash_logoutest très simple:

echo $PWD >~/.lastdir

Et quelque part dans mon .bashrcj'ai placé cette ligne:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)
TrueY
la source
1
Notez simplement que cela .bash_logoutne fonctionne qu'à la login shellssortie, ce n'est pas toujours le cas.
henfiber
1
Alternativement, enregistrez le dernier chemin à la bashsortie avec: trap "echo $PWD > ~/.lastdir" EXIT"
henfiber
@henfiber Merci pour vos commentaires! Je pense que dans ce cas, le shell est un shell de connexion, donc cela se comportera correctement. Par contre l' trapapproche est aussi sympa, j'aime bien!
TrueY
2

Très souvent, j'utilise plusieurs fenêtres de terminal à la fois, chacune avec plusieurs onglets. Par exemple: une fenêtre pour les onglets de développement de code source, une fenêtre pour les fichiers latex, une fenêtre pour l'exécution et le scriptage R, etc. (Cela fonctionnait dans le passé, mais avec la nouvelle version de gnome, ce n'est pas le cas). La solution sale suivante fonctionne bien pour moi. J'ai mis cela en .bashrc.

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

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}
BartT
la source
C'est parfait ... wohoo! Merci. Je ne sais pas grand chose sur le piratage de bash, mais mec, je l'aime déjà ...
apil.tamang