Isso é o que está acontecendo:
-
tmux new 'tmux source-file ~/.tmux/dev'
O comando
new
cria uma nova sessão com uma única janela que possui um único painel. O comandotmux source-file ~/.tmux/dev
é executado nesse novo painel.- Então, você tem uma nova sessão
N
(onde N é algum número), com - uma única janela
N:0
(ou o que tiverbase-index
definido como), com - um único painel
N:0.0
(ou o que você tiverbase-pane-index
definido como) - executando o comando
tmux source-file ~/.tmux/dev
.
- Então, você tem uma nova sessão
-
O comando
source-file
é processado.- Os painéis extras são adicionados.
- O painel 0 está (re) selecionado.
- O comando
send-keys
, em seguida, "tipos"vim .
+ Digite no painel 0.
Esta entrada é ignorada porque este painel está apenas executando o cliente tmux que enviou o comandosource-file
.
- O cliente tmux sai, fechando assim o painel 0.
Portanto, o bit inesperado é que o painel 0 (ou seja, N:0.0
) está executando (apenas) o comando source-file
, que ignora o comando "digitado". Esse painel nunca executa um shell interativo que possa interpretar o comando "digitado".
Existem pelo menos algumas maneiras de corrigir isso:
-
Inicie o
~/.tmux/dev
comnew-window
para que o painel 0 esteja executando o seu "comando padrão" (ou seja, provavelmente um shell interativo).Esse método tem a vantagem de não presumir que o painel atual está executando um shell interativo e também de não assumir que o painel atual é
0
(ou seja, o que acontece se você executar sua série original de comandos em um painel que é parte de uma janela já dividida?). Isso significa que você pode vincular com segurançasource-file ~/.tmux/dev
a uma chave que possa ser executada em qualquer contexto (desde que crie uma nova janela para todos os seus painéis). No shell, você pode executartmux source-file ~/.tmux/dev
(para criar uma nova janela na sessão atual) ou seutmux new 'tmux source-file ~/.tmux/dev'
original para criar uma nova sessão.Uma pequena desvantagem desse método é que quando você executa
tmux new 'tmux source-file ~/.tmux/dev'
, a janela inicial ainda executará o cliente que enviasource-file
e sai rapidamente. Isto significa que a sua "janela principal" (aquela com as divisões) será uma mais alta que a suabase-index
e uma futura nova janela será colocada antes da "janela principal". Você poderia consertar isso usando algo assim:tmux new 'tmux move-window -t 99 \; source-file ~/.tmux/dev'
Ele move a janela inicial (efêmera) para um índice alto, de modo que
new-window
em~/.tmux/dev
acabe embase-index
. -
Use (por exemplo)
tmux new 'tmux source-file ~/.tmux/dev ; zsh -l'
para que o painel acabe executando um shell interativo após o término do comandosource-file
.A parte feia disso é que você acaba “codificando” seu shell preferido nesse comando. Além disso, a entrada
send-keys
(vim .
+ Enter) é tecnicamente enviada antes do início do shell; provavelmente está tudo bem, mas nem sempre é completamente confiável.Você pode evitar "codificar" seu shell consultando tmux para o
default-command
(ou, se não estiver definido,default-shell
(ou, se não estiver definido, usando SHELL)) , mas isso pode ser mais trabalho do que você realmente quer fazer.