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?

mniess
fonte

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.

Nykakin
fonte
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]

Jacob Vlijm
fonte
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
2

Caso o zsh seja usado em vez do bash, a seguinte linha ~/.zshrcse liga git statusa ALT+ ENTER.

bindkey -s '^[^M' 'git status\n'

Para obter ALT+ ENTERno Bash, eu uso esta linha:

bind -x '"\e\C-m":git status'
mniess
fonte
Como alguém identificaria as ligações para outras chaves?
Josh Habdas 17/10/19
1
@JoshHabdas veja aqui unix.stackexchange.com/questions/76566/…
mniess