Wie erstelle ich ein neues Fenster im aktuellen Verzeichnis in tmux?

208

Es ist möglich, ein new-windowmit dem Arbeitsverzeichnis zu öffnen , in dem ich mich gerade befinde . Ich verwende zsh , wenn es darauf ankommt.

Shrikant Sharat
quelle

Antworten:

139

Ab tmux 1.9 die default-pathwurde Option entfernt, so dass Sie die verwenden müssen -cOption mit new-window, und split-window(zB durch die rebinding c, "und %Bindungen enthalten
-c '#{pane_current_path}'). Weitere Informationen finden Sie in den anderen Antworten auf diese Frage.


Eine relevante Funktion landete Anfang Februar 2012 im tmux SVN-Trunk. In tmux- Builds, die diesen Code enthalten, wird durch das Aufrufen von tmux-Tastenzuordnungennew-window ein neues Fenster mit demselben aktuellen Arbeitsverzeichnis wie die aktiven Prozesse des aktuellen Bereichs erstellt (solange die default-pathSitzung aktiv ist) Option ist leer (Standardeinstellung). Gleiches gilt für den Bereich, der vom split-windowBefehl erstellt wird, wenn er über eine Bindung aufgerufen wird.

Dies verwendet speziellen plattformspezifischen Code, sodass derzeit nur bestimmte Betriebssysteme unterstützt werden: Darwin (OS X), FreeBSD, Linux, OpenBSD und Solaris.

Dies sollte in der nächsten Version von tmux (1.7?) Verfügbar sein .


Mit tmux 1.4 benutze ich normalerweise nur

tmux neww

in einer Shell, die bereits das gewünschte aktuelle Arbeitsverzeichnis hat.

Wenn ich jedoch damit rechne, viele Fenster mit demselben aktuellen Arbeitsverzeichnis erstellen zu müssen (oder sie mit der üblichen <Präfix> c-Schlüsselbindung starten zu können ), setze ich die default-pathSitzungsoption über

tmux set-option default-path "$PWD"

in einer Shell, die bereits das gewünschte aktuelle Arbeitsverzeichnis hat (obwohl Sie dies natürlich von jedem Verzeichnis aus tun und stattdessen nur den Wert angeben könnten).

Wenn default-pathein nicht leerer Wert festgelegt ist, wird sein Wert verwendet, anstatt das aktuelle Arbeitsverzeichnis von Befehlszeilenaufrufen von zu "erben" tmux neww.

Die tmux- FAQ enthält einen Eintrag mit dem Titel "Wie kann ich ein neues Fenster im selben Verzeichnis wie das aktuelle Fenster öffnen?", Der einen anderen Ansatz beschreibt. es ist allerdings ein bisschen verworren.

Chris Johnsen
quelle
6
Gibt es eine Möglichkeit, die ich zuordnen kann <prefix>c, um das Arbeitsverzeichnis der zugrunde liegenden Shell-Instanz (falls vorhanden) zu lesen und das default-pathvor der Ausführung festzulegen new-window. Oder ist das zu viel verlangt von tmux :)
Shrikant Sharat
Ist es überhaupt möglich, das Arbeitsverzeichnis der zugrunde liegenden Shell zu lesen? Ich würde töten, um es in meiner Statusleiste anzuzeigen.
Shrikant Sharat
2
Es gibt keine tragbare Möglichkeit, den cwd eines anderen Prozesses zu extrahieren (obwohl dies auf einigen Plattformen (z. B. /proc/PID/cwdunter Linux) möglich ist). Es gibt eine mögliche Teillösung in einem Eintrag der tmux- FAQ (die Shell zeichnet ihre cwd auf, wenn sie eine Eingabeaufforderung druckt, und bindet dann einen Schlüssel, der eine neue Shell im aufgezeichneten Verzeichnis startet).
Chris Johnsen
ok, das liegt meines wissens nicht im bereich und fühlt sich nicht sehr zuverlässig an. Etwas sagt mir, dass es mir ohne all das besser gehen könnte. Trotzdem danke.
Shrikant Sharat
1
@paradroid: Alles, was über eine Bindung ausgeführt wird, verwendet (standardmäßig) den cwd des tmux- Servers oder den Wert der default-pathSitzungsoption (sofern festgelegt). Die tmux-FAQ enthält einen Eintrag, der eine Möglichkeit beschreibt, einen Schlüssel zu binden, der ein neues Fenster startet, wobei der Befehl der Shell im aktuellen Fenster ausgeführt wird („Wie kann ich ein neues Fenster im selben Verzeichnis wie das aktuelle Fenster öffnen?“). , aber die Methode ist ziemlich kompliziert. Das gleiche könnte wahrscheinlich für split-windowund new-session(anstelle von neww) gemacht werden.
Chris Johnsen
268

Die aktuelle (1.9a) Tmux-Manpage enthält einen optionalen -c start-directoryParameter für einige Befehle, einschließlich new-windowund split-window. Es enthält auch die Formatvariable pane_current_path, die sich auf die bezieht Current path if available.

Durch die Kombination dieser können wir ein neues Fenster mit dem aktuellen Arbeitsverzeichnis öffnen.
new-window -c "#{pane_current_path}"
Die Anführungszeichen werden benötigt, wenn der aktuelle Pfad Leerzeichen enthält.

Wenn Sie das aktuelle Fenster vertikal teilen möchten, verwenden Sie
split-window -c "#{pane_current_path}"
oder für eine horizontale Teilung
split-window -h -c "#{pane_current_path}"

Fügen Sie Folgendes zu Ihrem Arbeitsverzeichnis hinzu, damit die Tastenkombinationen standardmäßig neue Teilfenster und Fenster mit dem aktuellen Arbeitsverzeichnis öffnen .tmux.conf. Das "mit umgebenden Anführungszeichen soll Tmux mitteilen, dass es keine Zeichenfolge beginnen soll, sondern den "Schlüssel binden soll .

bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
Simon Kohlmeyer
quelle
1
Funktioniert das nicht unter tmux 1.9? Ich kann es nicht dazu bringen, die erwartete Sache zu tun.
Erik Garrison
1
bind-key -r Enter new-window -c "# {pane_current_path}", funktioniert für tmux 2.1
Marslo
5
Funktioniert in tmux 2.3 unter OSX. Vergessen Sie nicht, alle vorhandenen Sitzungen anzuhalten / abzubrechen, damit diese Bindungen angewendet werden.
jmgarnier
1
@jmgarnier oder geben Sie das Profil erneut ein: prefix- :, und geben Sie dannsource ~/.tmux.conf
ijoseph ein.
8
@jmgarnier oder einfach tmux source-file .tmux.conf.
Blauhirn
37

Ja, benutze new-window -c "#{pane_current_path}". Sie können Folgendes zu Ihrer hinzufügen ~/.tmux.conf, um sie dauerhaft zu machen (unter Annahme der Standard-Tastenkombinationen):

bind c new-window -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"

Die default-pathPfadeinstellung wurde entfernt vom vorgelagerten Code und TMux Autor in dieser Nachricht unter Verwendung von entweder commit empfohlen -c "#{pane_current_path}"oder -c "$PWDin den new-windowund split-windowBefehlen.

Ich antwortete auch in dieser doppelten Frage .

mmoya
quelle
10

Mit neueren Versionen von tmux (v1.8, aber vielleicht auch in v1.7):

tmux new-window -c "$PWD"
Mislav
quelle
Dies scheint auch mit geteilten Fenstern zu funktionieren, zBtmux split-window -v -c "$PWD"
user7089
3
$PWDscheint in tmux 1.9a nicht zu funktionieren. Ich musste pane_current_pathwie oben vorgeschlagen verwenden.
Jordelver
3

Die anderen Antworten funktionieren bei mir nicht, wenn ich versuche, sie (speziell tmux split-window -c) als Bindungen zu verwenden . Aber ich habe mir eine eigene Lösung ausgedacht, die ich seit mehr als einem Jahr verwende und die sowohl für neue Fenster als auch für Teilungen funktioniert:

~/.bashrc:

PS1="$PS1"'$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#D" | tr -d %) "$PWD")'

~/.tmux.conf:

unbind-key c
bind-key c run-shell 'tmux new-window "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key C new-window

bind-key - run-shell 'tmux split-window -v "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"'
bind-key | run-shell 'tmux split-window -h "cd \"$(tmux show-environment $(echo "TMUXPWD_#D" | tr -d %) | sed -e "s/^.*=//")\"; exec $SHELL"

Funktioniert zumindest mit $ (tmux -V) 1.8. In den auskommentierten Zeilen finden Sie eine Version für ältere tmuxes, die nicht über den Befehl show-environment verfügen.

Erik Westrup
quelle
0

tmux hat das in Version 1.8 getan, aber in Version 1.9 wurde diese Funktion zugunsten der Verwendung von -cflag entfernt.

Dies kann gelöst, aber erneut gebunden werden, new-windowaber wenn Sie etwas anderes ausführen möchten, wird es zu wortreich: Anstatt neww man tmuxzu tippen neww -c "#{pane_current_path}" man tmux, müssen Sie das eingeben , was Sie höchstwahrscheinlich nicht tun möchten.

Es gibt einen Mod von tmux (ich bin der Autor), der tmux eine geeignete Skriptsprache hinzufügt, um die Verwendung von Aliasen, das Binden mehrerer Befehle im Modus, von Variablen, Schleifen usw. zu ermöglichen : Neue Fenster und Bereiche werden im aktuellen Verzeichnis geöffnet.

Es kann aus folgenden Quellen erstellt werden: http://ershov.github.io/tmux/

Yuriy Ershov
quelle