Eu gostaria de configurar algo em um shell para me proporcionar uma experiência semelhante a IDE usando apenas o shell (sem X). O mais próximo que cheguei foi usar o tmux, com o vim em um painel e a linha de comando no outro. Dessa forma, a partir do vim, posso .w !bash
executar uma linha.
Mas isso não é satisfatório para mim porque o ambiente não persiste entre comandos executados separadamente.
Se eu correr:
var1=FOO
e então
echo $var1
cada um usando .w !bash
, FOO
não será ecoado.
O que eu realmente quero fazer é passar por um arquivo de texto em um painel e usar um atalho para enviar uma linha para o terminal no outro painel, como parte dessa sessão de terminal. Qual é a combinação certa de ferramentas para conseguir isso? Entendo que o emacs pode ser configurado para fazer algo assim com seu próprio emulador de terminal, mas gostaria de uma solução que funcionasse com as ferramentas padrão (como em um instalador).
Editar: tmux select-copy-paste não é tão ruim, mas ainda é um pouco estranho.
Responder1
Uma solução de protótipo com prova sh
de conceito rápida e suja.vim
tmux
Você .w !bash
executa bash
e envia a linha atual para seu stdin. Vamos substituir bash
por um script que injeta uma linha de seu stdin em um painel diferente no tmux
.
Este é o script básico:
#!/bin/sh
pane="$(tmux list-panes -F '#{pane_active} #D' | awk '$1==0 {print $2;exit}')"
IFS= read -r line
tmux send-keys -l -t "$pane" "$line"
tmux send-keys -t "$pane" 'C-j'
O procedimento, breve explicação:
- Identifique um painel que não está ativo.
- Leia uma linha do stdin.
- Envie a linha para o painel como se tivesse sido digitada.
- Envie Enterpara o painel.
Salve-o como trun
, torne-o executável e acessível via $PATH
. Agora, se você tiver dois painéis tmux
e executar trun
um deles, digitar uma linha e clicar em Enter, a linha será injetada no outro painel.
Em vim
vez de .w !bash
invocar .w !trun
, deve funcionar. Vincule isso a uma chave para facilitar o acesso.
Notas:
- O script não verifica se existem exatamente dois painéis.
- O script não se importa com o que é executado no painel de destino; apenas envia chaves.