Como imprimir atalhos de teclado em formato legível?

5

Seria muito útil ter uma maneira amigável para obter uma visão geral dos atalhos de teclado atualmente definidos. Em outras palavras, dadas as /etc/inputrc lines

"\e[A": history-search-backward
"\e[11~": backward-word

e ~/.inputrc linhas

"\e[A": kill-word
"\e\eOD": backward-word

não é necessário passar pelos dois arquivos para descobrir que \e[A foi substituído, que há dois atalhos alternativos para backward-word , que \e\eOD significa ... o que isso significa e que kill-word significa, na verdade, excluir até o final da palavra atual (ou próxima). A solução ideal seria imprimir algo como

Delete until next word boundary: Meta-A
Go to the previous word boundary: F1; Ctrl-Left
Search history backwards: Meta-Up

(Espero que alguém com um melhor entendimento das seqüências de escape possa consertar os atalhos.)

Existe um programa Linux para imprimir isso?

Eu estou supondo que tal programa pode ser OS, kernel, ou até mesmo dependente do teclado, então talvez ele precise de uma configuração extensa (um programa que busca o usuário via showkey ou xev para pressionar as teclas diversas para estabelecer quais seqüências de escape são realmente enviadas, por exemplo), mas isso seria um preço aceitável para finalmente entender como usar atalhos de terminal de forma eficiente.

    
por l0b0 19.03.2012 / 15:15

2 respostas

3

A resposta curta é não, tenho certeza de que não existe esse programa.

Você poderia, em princípio, construir um; ele teria que examinar a configuração readline e o emulador de terminal (o kernel e o hardware não estão envolvidos).

bind -P | grep 'can be found' no Bash lista os atalhos de teclado.

abort can be found on "\C-g", "\C-x\C-g", "\e\C-g".
accept-line can be found on "\C-j", "\C-m".

Para ter um nome mais descritivo para o comando, é necessário analisar a documentação do bash ou readline.

A correspondência entre as seqüências de teclas e chaves é determinada pelo terminal (geralmente, o emulador de terminal). Muitas vezes não está prontamente disponível, e quando é o método para obtê-lo é inteiramente específico para o terminal.

Você pode chegar perto do Emacs: iniciar emacs -q -nw em um terminal e pressionar Ctrl + H , C (o% co_de Comando%) e depois a sequência de teclas ( describe-key-briefly é Escape ). Isso mostra a chave de função reconstruída, se houver, e o que a chave faz no Emacs. As ligações padrão do Readline são strongmente inspiradas pelo Emacs, então, muitas vezes a função no Emacs é semelhante à função em readline, mas nem sempre. Exemplo:

Ctrl+H C ESC [ A
<up> runs the command previous-line
    
por 19.03.2012 / 19:42
0

Eu tive o mesmo problema sendo incapaz de digerir as várias páginas de saída do comando interno bind Bash, especialmente quando dada a opção -p .

Por isso, criei as duas funções a seguir que defini em meu arquivo .bashrc :

alias def=function
alias val="declare -r"
alias var=declare
alias final="readonly -f"

def keyfunctions {
  if (( "$#" )); then
    var a
    OPTIND=1
    getopts ":auI:E:" a
  else
    var a=E
    OPTIND=1
    OPTARG='self-insert$|digit-argument$|do-lowercase-version$'
  fi
  case "$a" in
    a)
      bind -p |\
        sort |\
        pr -l1 -W"$COLUMNS" -"$(($COLUMNS/30))"
    ;;
    I)
      bind -p |\
        grep -E "$OPTARG" |\
        sort |\
        pr -l1 -W"$COLUMNS" -"$(($COLUMNS/30))"
    ;;
    E)
      bind -p |\
        grep -Ev '(^$)|^#|'"$OPTARG" |\
        sort |\
        pr -l1 -W"$COLUMNS" -"$(($COLUMNS/30))"
    ;;
    u|*)
      echo >&2 "$FUNCNAME: Usage: $FUNCNAME [-a|-i <eregex>|-e <eregex>]"
      echo >&2 "$FUNCNAME: Invoking $FUNCNAME without arguments assumes -E'self-insert$|digit-argument$|do-lowercase-version$'."
      val -i b="$((OPTIND-1))"
      if [[ "$OPTARG" == : ]]; then
        echo >&2 "$FUNCNAME: Error: Invalid argument \"$OPTARG\" at position $b."
      elif [[ "$OPTARG" == ? ]]; then
        echo >&2 "$FUNCNAME: Error: Invalid option \"$OPTARG\" at position $b."
      fi
    ;;
  esac
}
final keyfunctions

def keymacros {
  bind -s |\
    sort |\
    pr -l1 -W"$COLUMNS" -"$(($COLUMNS/40))"
}
final keyfunctions

Basta executar as duas definições acima e decidir se você gosta da saída classificada ( sort ) e tabulada ( pr -t ). O width de colunas é fixo no número de colunas relacionadas à proporção de $(($COLUMNS/$width)) .

    
por 17.11.2012 / 15:37