Como executo um comando shell a partir do .tmux.conf

7

Como faço para executar um comando shell a partir de .tmux.conf , ou de outra forma automaticamente quando tmux é iniciado, sem ter que acertar nenhum outro comando?

Como posso criar um alias, uma função ou um script que se resume a, por exemplo

tmuxirc - > tmux + irssi

    
por Emanuel Berg 24.06.2013 / 06:18

4 respostas

8

Parece que você quer invocar externamente o tmux do seu shell, em vez de fazê-lo a partir do tmux, então .tmux.conf é o lugar errado. Você pode usar um alias de shell (coloque isso em .bashrc para reutilização):

alias tmuxirc='tmux new-session -s irc irssi'
    
por 24.06.2013 / 06:38
10

Embora não pareça ser o que você procurava, a solução para:

How do I run a shell command from .tmux.conf

é run-shell ou, na sua forma abreviada, run . Na página tmux man:

run-shell shell-command
               (alias: run)
         Execute shell-command in the background without creating a win-
         dow.  After it finishes, any output to stdout is displayed in
         copy mode.  If the command doesn't return success, the exit sta-
         tus is also displayed.

Se você precisar lançar um script silenciosamente em segundo plano sempre que iniciar o tmux , poderá usar run "command > /dev/null" .

    
por 04.07.2014 / 21:18
5

Eu faço algo semelhante com um script. Quando eu quero iniciar o tmux com minha configuração de desenvolvimento, eu o chamo. O script em si parece com o seguinte:

#!/bin/sh
tmux has-session -t development
if [ $? != 0 ]; then
    tmux new-session -s development -n editor -d
    tmux send-keys -t development 'cd /var/www/htdocs/' C-m
    tmux send-keys -t development 'vim' C-m
    tmux split-window -v -t development
    tmux split-window -v -t development
    tmux select-layout -t development main-horizontal
    tmux send-keys -t development:0.1 'cd /var/www/htdocs/' C-m
    tmux new-window -n console -t development
    tmux send-keys -t development:1 'cd /var/www/htdocs/' C-m
    tmux select-window -t development:0
fi
tmux attach -t development

O que isso me dá é uma sessão tmux com 2 janelas, a janela 1 tem uma sessão Vim no topo da tela, com dois terminais na parte inferior da tela, todos apontando para o / var / www / htdocs / directory. A janela 2 é apenas um console de tela cheia. Boa coisa sobre isso é que ele não irá recriar a sessão se ela já estiver lá, apenas será anexada a ela.

    
por 24.06.2013 / 21:33
0

Há um comando display-message em tmux , da página man:

display-message [-p] [-c target-client] [-t target-pane] [message]

(alias: display)

Display a message. If -p is given, the output is printed to stdout, otherwise it is displayed in the target-client status line. The format of message is described in the FORMATS section; information is taken from target-pane if -t is given, otherwise the active pane for the session attached to target-client.

E na seção FORMATS, há uma variável chamada session_name , ela será substituída pelo nome da sessão se você a usar no formato #{session_name} .

Tente executar tmux display-message -p '#{session_name}' quando estiver em uma sessão do tmux. Talvez você veja um número, é o id da sessão que você anexou. Execute tmux ls para verificar a lista de sessões.

No entanto, quando você iniciar um tmux por tmux new -s myproject , verá myproject como a saída, mas não um número. Porque você especificou o nome da sessão quando você inicia o tmux.

Então, minha solução é colocar um trecho de código no arquivo ~/.bashrc :

# [tmux] load scripts in ~/.tmux on creating a new pane
# load order: __before__.sh, ${session_name}.sh, __after__.sh
function tmux_load_startup_scripts_by_session_name() {  
  if [[ -n ${TMUX} ]]; then
    local env_before_script="${HOME}/.tmux/__before__.sh"
    [[ -f "${env_before_script}" ]] && { . "${env_before_script}"; }
    local env_main_script="${HOME}/.tmux/$(tmux display-message -p '#{session_name}').sh"
    [[ -f "${env_main_script}" ]] && { . "${env_main_script}"; }
    local env_after_script="${HOME}/.tmux/__after__.sh"
    [[ -f "${env_after_script}" ]] && { . "${env_after_script}"; }
  fi
}
tmux_load_startup_scripts_by_session_name  

Uso

mkdir ~/.tmux
cat "__before__.sh" > ~/.tmux/__before__.sh
cat "__after__.sh" > ~/.tmux/__after__.sh
cat "sample.sh" > ~/.tmux/sample.sh
tmux new -s sample

Você verá a saída em cada painel criado:

__before__.sh
sample.sh
__after__.sh

A vantagem desta solução é que você pode especificar scripts diferentes para projetos ou ambientes diferentes.

    
por 23.09.2016 / 04:46

Tags