¿Cómo crear una nueva ventana en el directorio actual en tmux?

209

Es posible abrir un archivo new-windowcon su directorio de trabajo configurado en el que estoy actualmente. Estoy usando zsh , si es importante.

Shrikant Sharat
fuente

Respuestas:

140

A partir de tmux 1.9 el default-pathfue retirado opción, por lo que es necesario utilizar la -copción con new-windowy split-window(por ejemplo, mediante la revinculación c, "y %fijaciones para incluir
-c '#{pane_current_path}'). Vea algunas de las otras respuestas a esta pregunta para más detalles.


Una característica relevante aterrizó en el tronco de SVN de tmux a principios de febrero de 2012. En las compilaciones de tmux que incluyen este código, los enlaces de teclas de tmux que invocan new-windowcrearán una nueva ventana con el mismo directorio de trabajo actual que los procesos activos del panel actual (siempre que la default-pathsesión la opción está vacía; está por defecto). Lo mismo es cierto para el panel creado por el split-windowcomando cuando se invoca a través de un enlace.

Esto utiliza un código especial específico de la plataforma, por lo que solo ciertos sistemas operativos son compatibles en este momento: Darwin (OS X), FreeBSD, Linux, OpenBSD y Solaris.

Esto debería estar disponible en la próxima versión de tmux (1.7?).


Con tmux 1.4, generalmente solo uso

tmux neww

en un shell que ya tiene el directorio de trabajo actual deseado.

Sin embargo, si preveo la necesidad de crear muchas ventanas con el mismo directorio de trabajo actual (o si quiero poder iniciarlas con el cenlace de teclas <prefix> habitual ), entonces configuro la default-pathopción de sesión a través de

tmux set-option default-path "$PWD"

en un shell que ya tiene el directorio de trabajo actual deseado (aunque obviamente podría hacerlo desde cualquier directorio y simplemente especificar el valor).

Si default-pathse establece en un valor no vacío, su valor se utilizará en lugar de "heredar" el directorio de trabajo actual de las invocaciones de línea de comandos de tmux neww.

Las preguntas frecuentes de tmux tienen una entrada titulada “¿Cómo puedo abrir una nueva ventana en el mismo directorio que la ventana actual?” Que describe otro enfoque; Sin embargo, es un poco complicado.

Chris Johnsen
fuente
66
¿Hay alguna manera que pueda asignar <prefix>cpara leer el directorio de trabajo de la instancia de shell subyacente (si existe) y configurar el default-pathantes de ejecutar new-window? ¿O es demasiado pedirle a tmux :)
Shrikant Sharat
En otra nota, ¿es posible incluso leer el directorio de trabajo del shell subyacente? Mataría por mostrarlo en mi barra de estado.
Shrikant Sharat
2
No hay una forma portátil de extraer el cwd de otro proceso (aunque es posible en algunas plataformas (por ejemplo, /proc/PID/cwden Linux)). Hay una posible solución parcial en una entrada de las preguntas frecuentes de tmux (tiene el shell registra su cwd cuando imprime una solicitud, luego vincula una clave que inicia un nuevo shell en el directorio grabado).
Chris Johnsen
ok, esto está un poco fuera de alcance para mi conocimiento y no se siente muy confiable. Algo me dice que podría estar mejor sin todo esto ... gracias de todos modos.
Shrikant Sharat
1
@paradroid: todo lo que se haga a través de un enlace utilizará (por defecto) el cwd del servidor tmux o el valor de la default-pathopción de sesión (si está configurada). Las preguntas frecuentes de tmux tienen una entrada que describe una forma de vincular una clave que inicia una nueva ventana con el cwd del shell ejecutándose en la ventana actual ("¿Cómo puedo abrir una nueva ventana en el mismo directorio que la ventana actual?") , pero el método es bastante complicado. Probablemente se podría hacer lo mismo por split-windowy new-session(en lugar de neww).
Chris Johnsen
268

La página de manual actual de Tmux (1.9a) enumera un -c start-directoryparámetro opcional para algunos comandos, incluidos new-windowy split-window. También contiene la variable de formato pane_current_path, que se refiere a Current path if available.

Combinando estos, podemos abrir una nueva ventana con el directorio de trabajo actual usando
new-window -c "#{pane_current_path}"
La cita es necesaria en caso de que la ruta actual contenga espacios.

Si desea dividir el panel actual verticalmente, use
split-window -c "#{pane_current_path}"
o, para una división horizontal
split-window -h -c "#{pane_current_path}"

Para que las combinaciones de teclas abran nuevas divisiones y ventanas con el directorio de trabajo actual de forma predeterminada, agregue lo siguiente a su .tmux.conf. La "cita entre comillas es decirle a Tmux que no debe comenzar una cadena, sino vincular la "clave.

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
fuente
1
¿Esto no funciona en tmux 1.9? No puedo lograr que haga lo esperado.
Erik Garrison
1
bind-key -r Enter new-window -c "# {pane_current_path}", funciona para tmux 2.1
Marslo
55
Funciona en tmux 2.3 en OSX. No olvide detener / eliminar todas las sesiones existentes para ver estos enlaces aplicados.
jmgarnier
1
@jmgarnier o vuelva a buscar el perfil: prefix- :, luego escribasource ~/.tmux.conf
ijoseph el
8
@jmgarnier o simplemente tmux source-file .tmux.conf.
phil294
37

Si, uso new-window -c "#{pane_current_path}". Puede agregar lo siguiente a su ~/.tmux.confpara que sea persistente (asumiendo las combinaciones de teclas predeterminadas):

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

los default-path configuración de la ruta se eliminó del código ascendente y el autor de tmux lo recomendó en ese mensaje de confirmación utilizando -c "#{pane_current_path}"o -c "$PWDen los comandos new-windowy split-window.

También respondí en esto pregunta duplicada .

mmoya
fuente
10

Con versiones recientes de tmux (v1.8, pero quizás también en v1.7):

tmux new-window -c "$PWD"
mislav
fuente
Esto parece funcionar también con la ventana dividida, por ejemplotmux split-window -v -c "$PWD"
user7089
3
$PWDno parece funcionar para mí en tmux 1.9a. Tuve que usar pane_current_pathcomo se sugirió anteriormente.
jordelver
3

Las otras respuestas no funcionan para mí cuando trato de ponerlas como enlaces (específicamente tmux split-window -c). Pero he creado mi propia solución que he estado usando durante más de un año que funciona tanto para ventanas nuevas como para divisiones:

~/.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"

Funciona, al menos, con $ (tmux -V) 1.8. Vea las líneas no comentadas aquí para obtener una versión que funcione para tmuxes anteriores que no tienen el comando show-environment.

Erik Westrup
fuente
0

tmux hizo eso en la versión 1.8 pero en 1.9 esta característica fue eliminada a favor de usar -c flag.

Esto se puede resolver pero volver a vincular, new-windowpero en caso de que desee ejecutar otra cosa, se vuelve demasiado prolijo: en lugar de escribir neww man tmux, tendrá que escribirneww -c "#{pane_current_path}" man tmux lo que probablemente no quiera hacer.

Hay un mod de tmux (soy el autor) para agregar un lenguaje de scripting adecuado a tmux para permitir el uso de alias, vincular múltiples comandos en 'modo', variables, bucles, etc. Y también, trae de vuelta ese comportamiento : se abren ventanas y paneles nuevos en el directorio actual.

Se puede construir a partir de fuentes aquí: http://ershov.github.io/tmux/

Yuriy Ershov
fuente