Como criar um atalho de teclado para um comando do terminal


14

Costumo trabalhar com git e adorei o iTerm2 pela capacidade de definir atalhos de teclado para comandos. Por exemplo, eu defino CTRL+ ENTERcomo git status.

Isso é possível com o gnome-terminal ou você pode recomendar outra opção para conseguir isso?

Respostas:


16

Você pode usar bind -xpara vincular um comando a um atalho no Bash. Por exemplo, para vincular o git statuscomando a Crtl+p atalho, você pode usar:

 bind -x '"\C-p":git status'

Coloque dentro ~/.bashrc arquivo para lembrá-lo. Na página do manual:

-x keyseq: comando do shell

Faça com que o comando shell seja executado sempre que digitar keyseq. Quando o comando shell é executado, o shell define a variável READLINE_LINE para o conteúdo do buffer da linha Readline e a variável READLINE_POINT para o local atual do ponto de inserção. Se o comando executado alterar o valor de READLINE_LINE ou READLINE_POINT, esses novos valores serão refletidos no estado de edição.


Impressionante. Estou usando o zsh, mas que tem um equivalente chamado bindkey . Então, para conseguir o que quero, fiz o seguinte: o bindkey -s '^[^M' 'git status\n'que se liga a ALT + ENTER.
Mniess 24/03

1
bind -x '"\C-k":firefox'Eu uso isso, mas não funciona
alhelal 15/05

1
Isso funciona com shell, mas eu quero o tempo todo.
Alhelal 15/0518

Coloque no final do ~/.bashrcarquivo. Se ainda assim não funcionar, verifique este
Nykakin

Mais informações sobre o uso bindpodem ser encontradas aqui: stackoverflow.com/a/4201274/712334
Josh Habdas

2

1. Abra automaticamente uma nova janela de terminal, mostrando a saída do seu comando

Como você precisa manter o terminal aberto após a execução do comando, coloque:

gnome-terminal -e 'bash -c "git status; read line"'

sob uma combinação de teclas de atalho, fará o trabalho. Ele abrirá uma nova gnome-terminal janela e executará o comando dentro dela.

Adicione-o a um atalho

Escolha: Configurações do sistema> "Teclado"> "Atalhos"> "Atalhos personalizados". Clique no "+" e adicione o comando:

gnome-terminal -e 'bash -c "git status; read line"'

para Ctrl+Enter

Nota

Embora o atalho sugerido funcione, você pode escolher outra combinação de teclas depois Ctrl+ Enter, pois pelo menos entra em conflito com oLibreOffice atalho para ir para uma nova página.

Explicação

Para gnome-terminalabrir uma nova janela na linha de comando e executar um comando nela, você pode usar:

gnome-terminal -e 'bash -c <command>'

No entanto, embora o comando seja executado com êxito, a janela do terminal será fechada imediatamente antes que você possa ler a saída.

A seção:

read line

é então manter o terminal aberto (até você pressionar Enter ) após a execução do comando.

Outros comandos

Dessa forma, você pode executar qualquer comando (complexo) no terminal, sem o fechar imediatamente:

$ gnome-terminal -e 'bash -c "wmctrl -d; read line"'

irá produzir (se wmctrlestiver instalado):

insira a descrição da imagem aqui

Depois de pressionar Enter o terminal irá fechar.

2. Executando um comando na janela do terminal do gnome atualmente ativa

É claro que você pode colocar uma linha simples sob uma tecla de atalho (supondo que você tenha xdotoolinstalado):

xdotool type "<command>"

No entanto, isso digitaria o comando às cegas , em qualquer aplicativo, e digitar o comando não é a opção mais limpa.

O pequeno script abaixo, portanto:

  • verifica se a janela ativa é uma gnome-terminaljanela (pelo seu pid)
  • nesse caso, cola o comando na gnome-terminaljanela ativa , pressiona Return.
    Caso contrário, o script não fará nada , portanto não será colado em outros aplicativos.

Como o script usa o comando direcionado como argumento, você pode colocar vários comandos em vários atalhos.

O script

#!/usr/bin/env python3
import subprocess
import sys
import time

app = "gnome-terminal"
s = (" ").join(sys.argv[1:])

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def front(app):
    try:
        # see if gnome-terminal is running at all (raising error if not)
        app = get(["pgrep", app]) 
    except subprocess.CalledProcessError:
        app = False
    if app:
        # if so, see if the active window belongs to gnome-terminal comparing pids)
        active = get(["xdotool", "getwindowpid", get(["xdotool", "getactivewindow"])])
        return True if app == active else False

if front(app):
    # copy command to clipboard
    cm1 = ["/bin/bash", "-c", 'printf "'+s+'" | xclip -selection clipboard']
    # paste in terminal window
    cm2 = ["xdotool", "key", "Control_L+Shift_L+v"]
    # press return
    cm3 = ["xdotool", "key", "Return"]
    for cm in [cm1, cm2, cm3]:
        subprocess.call(cm)

Como usar

  1. O script precisa xdotool

    sudo apt-get install xdotool

  2. Crie um diretório ~/binse ele ainda não existir, faça logout / logout ou executesource ~/.profile

  3. Copie o script acima em um arquivo vazio, salve-o como gterm_keys(sem extensão) ~/bine torne-o executável

Agora você pode executar qualquer comando, a partir de uma tecla de atalho, na gnome-terminaljanela da frente , adicionando o comando:

gterm_keys <command>

para uma tecla de atalho, conforme descrito em [1]


Oi Jacob, obrigado pela sua resposta. Porém, acho que as soluções bind (e bindkey) são melhores, pois são construídas em shell. Dessa forma, não escreverei acidentalmente "status git" no Libreoffice. ;)
mniess

@mniess Concordo que a resposta é boa, mas, para que conste, se você ler minha resposta com atenção, imprimindo no LibreOffice, isso não poderá acontecer . mas você acabou de votar? Isso é hilário.
Jacob Vlijm 24/03

Eu sei, o script verifica o aplicativo em execução. Eu não voto negativo. Escrevi o comentário para lhe agradecer por escrever uma resposta tão detalhada.
Mniess 24/03

@mniess Ah, desculpe por tirar conclusões precipitadas! Os dois aconteceram perfeitamente sincronizados. Fico feliz que não foi você. "Apenas" um voto negativo, não me importo.
Jacob Vlijm 24/03

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.