Existe uma maneira de espelhar mudanças de diretório no Terminator?

3

Estou no Ubuntu 12.04 e estou usando o Terminator como meu terminal principal. Eu gosto porque me permite manter um interpretador python e um terminal bash abertos ao mesmo tempo, da mesma forma.

O que é chato é que eu acabo me movendo entre diretórios MUITO, e então eu tenho que fazer isso duas vezes. Existe uma maneira de configurar uma configuração de terminador para fazer isso? Para ter alterações no diretório de espelhos do terminador.

Eu estou supondo que não sou o único que acha isso frustrante!

    
por Kasisnu 19.08.2014 / 18:18

1 resposta

11

Ok. Se bem entendi, você basicamente tem uma janela Terminator em uma visualização dividida, em que o único buffer é um Bash shell e o outro é um interpretador Python. Agora, sempre que você digitar um comando como cd Pictures/ no buffer Bash, você quer enviar automaticamente o comando os.chdir("Pictures/") para o buffer Python, para que ele mude os diretórios simultaneamente com o seu shell Bash. Mais ou menos nessa imagem:

... onde o comando os.chdir no buffer Python deve ser inserido automaticamente quando você digita um comando cd no buffer Bash. Certo? Se sim, aqui vai um ...

Solução

Etapa 1: atribua os dois buffers ao mesmo grupo

O Terminator suporta grupos de janelas. Vamos atribuir esses dois buffers ao mesmo grupo, para depois usar o recurso de comandos de broadcast do Terminator para as janelas do mesmo grupo. Neste exemplo, vou designar os dois buffers para um grupo chamado Tau (o nome real não importa, mas certifique-se de que seja o mesmo para os dois buffers).

Etapa 2: defina atalhos de teclado para ativar e desativar a transmissão em grupo

Por padrão, o Terminator não possui atalhos de teclado para estes, mas nós precisamos deles agora, então vamos defini-los através do menu Preferences do Terminator. Eu usei Ctrl + Inserir para ativar a transmissão de grupo, e Ctrl + Excluir para desligá-lo. Você pode escolher qualquer outro atalho de teclado que quiser, mas terá que adaptar o Passo 3 apropriadamente.

Agora, você pode pressionar Ctrl + Inserir , e o que quer que você digite no buffer irá aparecer no outro buffer. Ao digitar Ctrl + Excluir , você desativa esse comportamento novamente.

Se o interpretador Python entendeu um comando como cd Pictures/ , para alterar um diretório em ambos os buffers, tudo que você teria que fazer agora seria algo como Ctrl + Inserir cd Pictures/ Ctrl + Apagar , para transmitir o comando como é . Mas o interpretador normal do Python não entende esse comando cd . Você poderia usar o IPython , que o entende, em vez do interpretador puro do Python. No entanto, eu assumo que (1) você quer o intérprete puro do Python e (2) você não quer ter que lembrar de pressionar essas combinações de teclas antes e depois de cada comando cd . Então, vamos para a Etapa 3.

Etapa 3: converta e envie o comando cd automaticamente para o buffer do Python

Vamos re-alias do comando builtin cd do Bash para fazer um pouco mais antes de realmente mudar o diretório de trabalho no shell atual. Ou seja, sempre que um usuário digita cd somewhere ,

  1. Traduzimos o comando para o Python
  2. Usamos xdotool para simular pressionando Ctrl + Inserir
  3. Usamos xdotool para simular a digitação do comando traduzido
  4. Usamos xdotool para simular pressionando Return
  5. Usamos xdotool para simular pressionando Ctrl + Excluir

Desta forma, o comando traduzido será enviado para o buffer do Python. Se você não tiver, instale xdotool :

sudo apt-get install xdotool 

O script que queremos como um alias para cd será parecido com isto:

function cd_to_pybuf {
  xdotool type "#"
  xdotool key Ctrl+Insert
  xdotool type "os.chdir(\"\")"
  xdotool key Return
  xdotool key Ctrl+Delete
  cd ""
}
cd_to_pybuf

Explicação: Quando alias cd ao script acima, sempre que digitarmos cd somewhere , o Bash traduz isso para OURSCRIPT somewhere . Como nosso script termina com a chamada de função cd_to_pybuf , ele realmente chamará a função cd_to_pybuf com somewhere como argumento (disponível como dentro da função; observe que a expansão bash não funcionaria aqui, então podemos ' t use algo como !* para obter os argumentos do comando original, e $BASH_COMMAND é problemático também ). Essa função executa exatamente as etapas enumeradas acima. Em um sidenote, também simulamos a digitação de # antes de simular pressionando Ctrl + Inserir , porque o que digitarmos depois disso aparecerá em ambos buffers, e o Bash não entende o comando os.chdir , então com esse sinal # nós o transformamos em um comentário para o Bash. Após o xdotool stuff, também executamos o comando cd real no buffer Bash.

Agora, vamos alias cd para esse script e testamos:

Funciona! Esse comando os.chdir("..") no buffer do Python foi digitado automaticamente. Eu não fiz isso. Tudo que fiz foi digitar cd .. no buffer Bash. Você pode ver que o comando #os.chdir("..") também foi digitado automaticamente no buffer Bash, mas como é um comentário, não teve efeito real.

Para tornar essa alteração permanente, coloque esse alias em ~/.bashrc , ou seja, no seu ~/.bashrc adicione a linha:

alias cd='function cd_to_pybuf { xdotool type "#"; xdotool key Ctrl+Insert; xdotool type "os.chdir(\"\")"; xdotool key Return; xdotool key Ctrl+Delete; cd ""; }; cd_to_pybuf'

E voilà! Foi isso.

Bônus: um alias para pwd

Às vezes, você pode querer verificar qual é o diretório de trabalho atual nos dois buffers de uma só vez. Podemos usar a mesma técnica usada para cd e alias novamente pwd . O seguinte comando fará o truque, e você também pode colocá-lo em seu ~/.bashrc se você quiser:

alias pwd='function pwd_to_pybuf { xdotool type "#"; xdotool key Ctrl+Insert; xdotool type "os.getcwd()"; xdotool key Return; xdotool key Ctrl+Delete; pwd; }; pwd_to_pybuf'

O que você terá que lembrar

Para que isso funcione no futuro, sempre que você abrir uma visualização dividida com um Bash e um buffer Python, terá que fazer duas coisas:

  1. Atribuir os dois buffers ao mesmo grupo no Terminator
  2. import os no seu buffer Python

Isso é tudo.

Solução de problemas

Isso não é perfeito. Existem alguns problemas menores:

  1. É um pouco feio que esse #os.chdir thingy também seja impresso no buffer Bash. É realmente estético, mas você pode considerar fazer algo diferente, por exemplo, depois de simular o comando e antes de simular pressionando Retornar , desative a transmissão temporariamente e remova o comando (por exemplo, simule muitos backspaces ou a seqüência Ctrl + A , Ctrl + K ) do buffer de Bash ou o que quer que seja.

  2. Alguns argumentos especiais para cd não funcionam. Coisas como cd - (altere para $OLDPWD ), cd ~ (altere para $HOME ) ou cd (sem argumentos, altere também para $HOME ). Aqui também, o script pode ser melhorado para considerar tais casos especiais (verifique se é especial e traduza apropriadamente). Essas coisas devem ser um pedaço de bolo daqui.

  3. Parâmetros opcionais para cd , como, por exemplo, cd -P somewhere , não funcionarão porque a tradução seria os.chdir("-P") aqui. Você pode usar $@ em vez de para ver todos os argumentos e, em seguida, fazer a coisa apropriada.

Espero que eu possa ajudar :) Foi um desafio interessante!

    
por Malte Skoruppa 20.08.2014 / 17:05