Como criar uma nova janela no diretório atual no tmux?

209

É possível abrir um new-windowcom seu diretório de trabalho definido como aquele em que estou atualmente. Estou usando o zsh , se isso importa.

Shrikant Sharat
fonte

Respostas:

140

A partir de tmux 1,9 a default-pathopção foi removida, então você precisa usar a -copção com new-windowe split-window(por exemplo, religação a c, "e %ligações para incluir
-c '#{pane_current_path}'). Veja algumas das outras respostas a esta pergunta para obter detalhes.


Um recurso relevante chegou ao tronco SVN do tmux no início de fevereiro de 2012. Nas compilações do tmux que incluem esse código, as ligações de teclas do tmux que invocam new-windowcriarão uma nova janela com o mesmo diretório de trabalho atual que os processos ativos do painel atual (desde que a default-pathsessão opção está vazia; por padrão). O mesmo vale para o painel criado pelo split-windowcomando quando ele é chamado por meio de uma ligação.

Ele usa código especial específico da plataforma; portanto, apenas alguns sistemas operacionais são suportados no momento: Darwin (OS X), FreeBSD, Linux, OpenBSD e Solaris.

Isso deve estar disponível na próxima versão do tmux (1.7?).


Com o tmux 1.4, eu costumo usar

tmux neww

em um shell que já tenha o diretório de trabalho atual desejado.

No entanto, se eu antecipar a necessidade de criar muitas janelas com o mesmo diretório de trabalho atual (ou desejar poder iniciá-las com a cligação de teclas <prefix> usual ), defino a default-pathopção de sessão por meio de

tmux set-option default-path "$PWD"

em um shell que já tenha o diretório de trabalho atual desejado (embora você possa obviamente fazê-lo em qualquer diretório e apenas especificar o valor).

Se default-pathfor definido como um valor não vazio, seu valor será usado em vez de "herdar" o diretório de trabalho atual das invocações da linha de comando de tmux neww.

O FAQ do tmux possui uma entrada intitulada “Como posso abrir uma nova janela no mesmo diretório da janela atual?” Que descreve outra abordagem; é um pouco complicado, no entanto.

Chris Johnsen
fonte
6
Existe uma maneira que eu possa mapear <prefix>cpara ler o diretório de trabalho da instância do shell subjacente (se houver) e definir o default-pathantes da execução new-window. Ou isso é pedir demais de tmux :)
Shrikant Sharat
Em outra nota, é possível ler o diretório de trabalho do shell subjacente? Eu mataria para tê-lo exibido na minha barra de status.
Shrikant Sharat
2
Não existe uma maneira portátil de extrair o código de outro processo (embora isso seja possível em algumas plataformas (por exemplo, /proc/PID/cwdno Linux)). Existe uma solução parcial possível em uma entrada da FAQ do tmux (ele faz com que o shell registre seu cwd quando imprime um prompt, depois vincula uma chave que inicia um novo shell no diretório gravado).
precisa
ok, isso está um pouco fora do escopo para o meu conhecimento e não parece muito confiável. Algo me diz que posso estar melhor sem tudo isso .. obrigada mesmo assim.
Shrikant Sharat
1
@paradroid: tudo o que for feito por meio de uma ligação (por padrão) usará o cwd do servidor tmux ou o valor da default-pathopção da sessão (se isso estiver definido). O FAQ do tmux possui uma entrada que descreve uma maneira de vincular uma chave que inicia uma nova janela com o cwd do shell em execução na janela atual (“Como posso abrir uma nova janela no mesmo diretório da janela atual?”) , mas o método é bastante complicado. Provavelmente o mesmo poderia ser feito para split-windowe new-session(em vez de neww).
precisa
268

A página de manual Tmux atual (1.9a) lista um -c start-directoryparâmetro opcional para alguns comandos, incluindo new-windowe split-window. Ele também contém a variável de formato pane_current_path, que se refere ao Current path if available.

Ao combiná-los, podemos abrir uma nova janela com o diretório de trabalho atual usando
new-window -c "#{pane_current_path}"
A cotação é necessária caso o caminho atual contenha espaços.

Se você deseja dividir o painel atual verticalmente, use
split-window -c "#{pane_current_path}"
ou, para uma divisão horizontal
split-window -h -c "#{pane_current_path}"

Para fazer com que as ligações de teclas abram novas divisões e janelas com o diretório de trabalho atual por padrão, adicione o seguinte ao seu .tmux.conf. A "citação ao redor é dizer ao Tmux que ele não deve iniciar uma string, mas vincular a "chave.

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
fonte
1
Isso não funciona no tmux 1.9? Não consigo fazer a coisa esperada.
Erik Garrison
1
vincular-chave -r Digite nova janela -c "# {pane_current_path}", trabalha para tmux 2.1
Marslo
5
Funciona no tmux 2.3 no OSX. Não se esqueça de parar / eliminar todas as sessões existentes para ver essas ligações aplicadas.
jmgarnier
1
@jmgarnier ou adicione novamente o perfil: prefix- :e digitesource ~/.tmux.conf
ijoseph 5/17
8
@jmgarnier ou apenas tmux source-file .tmux.conf.
phil294
37

Sim, use new-window -c "#{pane_current_path}". Você pode adicionar o seguinte ao seu ~/.tmux.confpara torná-lo persistente (assumindo as combinações de teclas padrão):

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

A default-pathconfiguração do caminho foi removida do código upstream e o autor tmux recomendado nessa mensagem de confirmação usando um -c "#{pane_current_path}"ou -c "$PWDnos comandos new-windowe split-window.

Eu também respondi nesta pergunta duplicada .

mmoya
fonte
10

Nas versões recentes do tmux (v1.8, mas talvez também na v1.7):

tmux new-window -c "$PWD"
mislav
fonte
Isso parece funcionar também com janela dividida, por exemplo:tmux split-window -v -c "$PWD"
user7089 5/05
3
$PWDparece não funcionar para mim no tmux 1.9a. Eu tive que usar pane_current_pathcomo sugerido acima.
jordelver
3

As outras respostas não funcionam para mim quando tento colocá-las como ligações (especificamente tmux split-window -c). Mas eu criei minha própria solução que venho usando há mais de um ano que funciona tanto para nova janela quanto para divisões:

~/.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, pelo menos, com $ (tmux -V) 1.8. Veja linhas comentadas aqui para uma versão que funciona para tmuxes mais antigos que não têm o comando show-environment.

Erik Westrup
fonte
0

O tmux fez isso na versão 1.8, mas na 1.9 esse recurso foi removido a favor do uso do -csinalizador.

Isso pode ser resolvido, mas é obrigatório, new-windowmas caso você queira executar outra coisa, fica muito prolixo: em vez de digitar, neww man tmuxvocê precisará digitar o neww -c "#{pane_current_path}" man tmuxque provavelmente não deseja fazer.

Existe um mod do tmux (eu sou o autor) para adicionar uma linguagem de script adequada ao tmux para permitir o uso de aliases, vinculando vários comandos no 'mode', variáveis, loops, etc. : novas janelas e painéis são abertos no diretório atual.

Pode ser construído a partir de fontes aqui: http://ershov.github.io/tmux/

Yuriy Ershov
fonte