Tmux olvida el directorio donde se creó la sesión

8

Cuando creo varias sesiones en tmux, el directorio actual para cada nueva ventana en sesiones posteriores se establece como el directorio actual para la primera.

Por ejemplo:

-> cd /home/one && tmux new-session -n one\; new-window -n two
   # /home/one is the current directory for each window

-> cd /home/two && tmux new-session -n three\; new-window -n four #\; etc.
   # "/home/two" is the current directory for the window "three"
   # but for the window "four" and other created windows it is "/home/one"

¿Cómo puedo forzar a tmux a establecer el directorio actual para cada nueva ventana en sesiones posteriores como el directorio donde se creó la sesión?

tmux 1.6

zsh 4.3

Shamaoke
fuente

Respuestas:

21

A partir de tmux 1.9, la opción de ruta predeterminada se ha eliminado .

Puede usar lo siguiente para abrir en el directorio en el que se abrió la sesión (el 'cliente' en el nombre me indicaría que es el tmux runnin actual en su shell, pero parece cambiar las rutas al cambiar entre sesiones en el mismo cliente):

bind-key c  new-window -c "#{client_cwd}"

De lo contrario, para copiar la ruta del panel actual:

bind-key c  new-window -c "#{pane_current_path}"

También hay pane_start_path que puede resultar atractivo para algunos flujos de trabajo.

bind-key c  new-window -c "#{pane_start_path}"

Para los comandos de la ventana dividida.

bind-key % split-window -h -c "#{pane_current_path}"
bind-key '"' split-window -c "#{pane_current_path}"
David C. Bishop
fuente
1
Esta es la respuesta correcta. Específicamente la segunda opción en mi caso.
Mike Rapadas
Por otro lado, no olvide cerrar todos los terminales tmux actuales en funcionamiento, incluido el fondo, antes de cambiar el archivo de configuración; de lo contrario, tmux no cargará nuevas configuraciones.
randomness2077
@lightmanhk Debería poder simplemente: source ~ / .tmux.conf
David C. Bishop el
1
¿Alguna forma de generalizar esto para divisiones de panel? split-window -h "#{pane_current_path}"no funcionará ...
Bach
1
@Bach Prueba con una -c. split-window -h -c "#{pane_current_path}"
David C. Bishop
3

Me doy cuenta de que esta pregunta es bastante antigua, pero surgió como una de las únicas preguntas en StackExchange cuando estaba buscando la respuesta, así que así es como lo resolví para tmux 1.8.

El new-windowcomando toma una -cmarca que le permitirá especificar el directorio actual de la nueva ventana. Por defecto, es una cadena vacía, que usará el directorio de trabajo de los paneles actuales como el directorio para la nueva ventana. Pasar un -valor como para el -cindicador establecerá el directorio de la nueva ventana en el que se abrió la sesión.

Aquí hay un extracto de los documentos:

-c specifies the working directory in which the new window is created.  It may 
have an absolute path or one of the following values (or a subdirectory):

       Empty string    Current pane's directory
       ~               User's home directory
       -               Where session was started
       .               Where server was started

Si desea cambiar el comportamiento predeterminado de la <PREFIX> ccombinación de teclas para reflejar esto, esto es lo que hice en mi ~/.tmux.conf:

bind-key c   new-window -c -
nicklamuro
fuente
0

Hay bastantes respuestas aquí: /unix/12032/create-new-window-with-current-directory-in-tmux

En resumen:

de las preguntas frecuentes de tmux, una forma obtusa (pero muy general y bastante independiente de la shell):

  • ¿Cómo puedo abrir una nueva ventana en el mismo directorio que la ventana actual?

Una opción es simplemente ejecutar "TMUX = tmux" en la ventana. Sin embargo, esto solo funciona si no se está ejecutando ningún comando, por lo que puede ingresar el comando.

Una solución alternativa es informar a tmux sobre la ruta actual a través de una variable de entorno. Para hacerlo, use el siguiente comando:

[ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD

Lo que establece TMUXPWD_i (donde i es el número de la ventana actual) en la ruta del directorio actual. Este comando se puede agregar a PS1, por ejemplo:

PS1='$([ -n "$TMUX" ] && tmux setenv TMUXPWD_$(tmux display -p "#I") $PWD)\h$ '

Cuando se crea una nueva ventana, se le debe pedir al shell que cambie de directorio. Puede definir un nuevo enlace (por ejemplo, si usa GNU bash):

bind-key C-c run-shell 'tmux neww "cd $(tmux display -p "\$TMUXPWD_#I"); exec bash"'

Esta solución funcionará incluso si un comando se está ejecutando actualmente en el terminal, pero no funcionará desde una ventana que acaba de intercambiarse con otra porque TMUXPWD_i no se actualizará después de un intercambio. Sin embargo, una vez que se muestra una nueva solicitud, TMUXPWD_i se actualiza correctamente.

simplemente reemplace las llamadas al shell según sea apropiado para el suyo.

Además, las versiones aparentemente más nuevas de tmux tienen esto dirigido con un comando

tmux nueva ventana

Se afirma que las versiones anteriores funcionan así:

vocación

tmux neww

desde su shell abrirá tmux en ese directorio.

si desea poder abrir nuevas ventanas o paneles desde el directorio de trabajo actual en tmux, debería:

tmux set-option default-path "$ PWD"

morsa
fuente
Gracias por intentar ayudar, morsa . Vi esa pregunta en unix.stackexchange y leí las preguntas frecuentes. Sin embargo, estas no son las respuestas para mi pregunta.
Shamaoke
1
Mire, cuando cree una nueva sesión, el directorio actual para cada nueva ventana o panel que abra en esa sesión será el directorio donde inicie la sesión . Esto es cierto si creo una sola sesión. Sin embargo, cuando abro una nueva ventana de terminal y comienzo otra sesión en ella, el directorio de trabajo actual para cada nueva ventana será el directorio donde comienzo la primera sesión pero no la actual. Aparentemente, esto es un error en tmux 1.6 ya que cuando lo bajé a la versión 1.3 el error no apareció.
Shamaoke