Bash atalhos de teclado personalizados
Este artigo é dedicado aos atalhos de teclado no terminal com BASH.
Todos os que trabalham com a linha de comando para correr tarefas repetitivas, sabem o quanto é desagradável lidar com o histórico do BASH ou então escrever repetitiva mente os mesmos comandos.
Neste artigo vou descrever uma forma de criar atalhos de teclado para o BASH, para nos facilitar a vida.
Vou dar um exemplo que permite criar atalhos de teclado para trabalhar com repositórios do git. Tarefas rotineiras de quem programa ou desenvolve algum tido de manual, faz tradução em algum software ou qualquer outro trabalho que use o git.
O BASH já traz muito atalhos de teclado que são essenciais mais para uns do que para outros, no entanto muitos deles são de uso comum por quem trabalha no terminal com o BASH.
Tarefas rotineiras com GIT
De seguida mostro os passos mínimos que tenho que fazer para atualizar um software no Gihub. Claro que estes passos vão depender de aquilo que estamos a fazer. No entanto é só para percebermos a necessidade de desenvolver atalhos de teclado.
Git status
O comando “git status” mostra nos o estado do diretório de trabalho, por exemplo os ficheiros que foram modificados e por ai vai.
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
Git commit
O comando ‘git commit -a -m “mensagem”‘, adiciona os ficheiros modificados e adiciona a mensagem ao atual indexe. E se correr tudo bem está pronto para enviar as mudanças para o gitHub.
$ git commit -a -m "Update README"
[master 9beb157] Update README
1 file changed, 1 insertion(+)
Git push
O comando “git push origin master” sincroniza o repositório local com o repositório no gitHub.
$ git push origin master
Counting objects: 5, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 310 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To git@github.com:jomisica/log-credentials.git
7de319f..9beb157 master -> master
Claro que nem sempre as coisas correm bem e entre os comandos acima é necessário resolver problemas. No entanto se tudo correr bem eu consigo atualizar o meu software com estes passos.
Os exemplos que irei postar neste artigo, é para podermos lançar estes comando ou mais em todos os nossos repositórios git, através de atalhos de teclado!
Atalhos de teclado existentes no BASH
A seguinte tabela mostra apenas alguns dos atalhos de teclado do BASH. Muitos mais podem ser encontrados na man page.
Ação | Conjunto de teclas |
Apagar uma palavra | Ctrl+W |
Apagar uma linha | Ctrl+U |
Mover para o início da linha | Ctrl+A |
Mover para o fim da linha | Ctrl+E |
Mover para trás um caractere | Ctrl+B |
Mover para trás uma palavra | Alt+B |
Mover para frente um caractere | Ctrl+F |
Mover para frente uma palavra | Alt+F |
Excluir a partir do cursor até o começo da linha | Ctrl+u |
Excluir a partir do cursor até o final da linha | Ctrl+K |
Excluir a partir do cursor até o começo da palavra | Ctrl+W |
Excluir palavra anterior | Alt+Backspace |
Colar texto da área de transferência | Ctrl+Y |
Limpar a tela deixando a linha atual no topo da janela | Ctrl+L |
Pesquisa incremental inversa do histórico | Ctrl+R |
Pesquisa não-incremental inversa do histórico | Alt+P |
O comando bind
O comando “bind” do BASH é o comando que iremos usar para criar os nossos atalhos de teclado. Este comando permite adicionar atalhos de teclado, remover os existentes, etc.
Nós vamos usa-lo para criar os atalhos de teclado para os comandos do GIT, no entanto a ideia é percebermos como criamos atalhos de teclado e cria los para tudo o que faça sentido para cada um de nós.
Criando um atalho de teclado com o bind
Para criarmos um atalho de teclado com um bind e que ele possa se ativar automaticamente sempre que abrimos um terminal, temos de colocar os atalhos de teclado no ficheiro “.bashrc”. Este ficheiro encontra-se na diretório HOME de cada utilizador. E é nele que iremos colocar os atalhos de teclado.
Sintaxe do comando bind
O comando bind para criar atalhos de teclado tem a seguinte sintaxe:
bind '"atalho de teclado"':"\"comando que queremos lançar\""
Com esta sintaxe, quando premimos a tecla ou o conjunto de teclas, o comando desejado aparece automaticamente no terminal. Se o quisermos executar só temos que premir a tecla ENTER.
exemplo:
bind '"\e[18;5~"':"\"git status\""
Quando queremos que o comando seja executado automaticamente, quando premimos a tecla ou teclas que escolhemos, usamos a seguinte sintaxe para o comando:
bind '"atalho de teclado"':"\"comando que queremos lançar\C-m\""
Exemplo:
bind '"\e[18;5~"':"\"git status\C-m\""
Como podemos ver foi acrescentado os caraters “\C-m” no final do comando.
O conjunto de caracters “\C-m” representa as teclas “Ctrl m
” que é o mesmo que “ENTER”.
Com a ultima sintaxe o comando é escrito no terminal e de seguida executado.
No entanto não desejamos sempre que os comando sejam executados automaticamente. Por vezes, vamos necessitar de preencher o comando com determinados valores de parâmetros, como no caso do comando ‘git commit -a -m “”‘, queremos preencher a mensagem entre as aspas. Neste caso não podemos executar o comando, mas só escreve lo no terminal, para que possamos preencher a mensagem desejada.
Exemplo
bind '"\e[19;5~"':"\"git commit -a -m \"\"\C-b\""
Como podemos ver no comando acima, foi utilizado o conjunto de caracters “\C-b”.
O conjunto de caracteres “\C-b” representa as teclas “backward char” que é o mesmo que que a seta para a esquerda “<-” do teclado. Este conjunto de caracteres é usado para mover o cursor de texto 1 carácter a partir do final para traz. Desta forma o cursor de texto fica automaticamente entre as aspas e só temos que escrever a mensagem desejada. Podemos repetir esta conjunto de caracteres a fim de deslocar o cursor o numero de caracteres que desejarmos. Este conjunto de caracteres não é obrigatório usar, mas seja dita a verdade dá um grande jeito.
Em baixo deixo mais comandos que podem usar para mover o cursor.
Comandos para mover o cursor
Commands for Moving beginning-of-line (C-a) Move to the start of the current line. end-of-line (C-e) Move to the end of the line. forward-char (C-f) Move forward a character. backward-char (C-b) Move back a character. forward-word (M-f) Move forward to the end of the next word. Words are composed of alphanumeric characters (letters and digits). backward-word (M-b) Move back to the start of the current or previous word. Words are composed of alphanumeric characters (letters and digits). shell-forward-word Move forward to the end of the next word. Words are delimited by non-quoted shell backward-char (C-b) metacharacters. shell-backward-word Move back to the start of the current or previous word. Words are delimited by non-quoted shell metacharacters. clear-screen (C-l) Clear the screen leaving the current line at the top of the screen. With an argument, refresh the current line without clearing the screen.
Como saber os códigos das teclas
Para que possamos usar os atalhos de teclado temos de saber o código que cada tecla ou conjunto de teclas tem.
Quando queremos usar o CTRL + alguma tecla simples numero ou letra, os caracteres que representam o CTRL são “\C”. Por exemplo “\C-p” ou “\C-1”.
Quando queremos usar o CTRL + alguma tecla complexa tipo F1, F2, DELETE, etc. Os caracteres que representam o CTRL são “\e”. Por exemplo “\e[18;5~” que representa o conjunto de teclas CTRL + F7.
Quando queremos usar ALT + outra tecla, o caracteres que representam o ALT são “\e”.
Para sabermos o resto dos caracteres temos de correr o comando read, e pressionar as teclas pretendidas. O comando read mostra tudo como recebe, não escapa os códigos por essa razão eu utilizo o comando read.
Temos de fazer este passo, porque os teclados são diferentes uns dos outros. Portanto o código do meu teclado pode ser diferente do seu.
Corremos o comando assim:
$ read
Após lançarmos o comando no terminal ele fica à espera de input, que se escreva no teclado. Neste momento pressionar-se a tecla ou conjunto de teclas desejado.
A titulo de exemplo, se eu pretender o conjunto de teclas CTRL + F7 no meu computador o resultado é o seguinte:
$ read
^[[18;5~
Se eu pretender o conjunto de teclas CTRL + F8 no meu computador o resultado é o seguinte:
$ read
^[[19;5~
Se eu pretender o conjunto de teclas CTRL + F9 no meu computador o resultado é o seguinte:
$ read
^[[20;5~
Estes exemplos acima são os códigos que vou usar no exemplo do git.
Os códigos te teclado que vemos com o comando read começam sempre por “^[” exceto quando são números e letras. Temos de remover os caracteres “^[” do inicio do código que vemos com o comando read. Depois juntamos as peças.
Para CTRL + F7 junta-se “\e” + “[18;5~” que é igual a “\e[18;5~”.
Para usar CTRL + g junta-se “\C” + “-” + “g” que é igual a “\C-g”
Para ALT + p junta-se “\e” +”p” que é igual “\ep”
Eu terei muito gosto em ajudar a resolver alguma duvida, qualquer coisa deixem um comentário.
Exemplos para o GIT
Estes são os exemplos que deixo, são os atalhos de teclado que uso para me facilitar a vida no git!
Estes comandos devem ser colocados no fim do ficheiro “.bashrc”. Este ficheiro encontra-se no diretório HOME de cada utilizador.
# Este atalho de teclado escreve o comando no terminal e de seguida
# executa o mesmo. Ele responde ao conjunto de teclas CTRL + F7
bind '"\e[18;5~"':"\"git status\C-m\""
# Este atalho de teclado escreve o comando no terminal e de desloca
# o cursor de texto do terminal para entre as aspas, para que
# possa escrever a mensagem. Ele responde ao conjunto de teclas
# CTRL + F8
bind '"\e[19;5~"':"\"git commit -a -m \"\"\C-b\""
# Este atalho de teclado escreve o comando no terminal e de seguida
# executa o mesmo. Ele responde ao conjunto de teclas CTRL + F9
bind '"\e[20;5~"':"\"git push origin master\C-m\""
Conclusão
Não posso dizer que criar atalhos de teclado seja a coisa mais fácil deste mundo. A complexidade para perceber todas as partes do problema é grande, no entanto depois de perceber torna se fácil criar os atalhos de teclado.
Com este artigo pretendo desmistificar bastante este problema, visto que o artigo cobre todas as partes necessárias do problema e acredito que qualquer um lendo atentamente este artigo seja capaz de criar os seus atalhos de teclado no BASH.
Qualquer duvida estou disponível para tentar ajudar!