Como imprimir atalhos de teclado em formato legível?

Como imprimir atalhos de teclado em formato legível?

Seria muito útil ter uma maneira fácil de obter uma visão geral dos atalhos de teclado definidos atualmente. Em outras palavras, dadas as /etc/inputrclinhas

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

e ~/.inputrclinhas

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

não deveria ser necessário passar por ambos os arquivos para descobrir que \e[Afoi substituído, que existem dois atalhos alternativos para backward-word, isso \e\eODsignifica ... o que quer que isso signifique, e isso kill-wordna verdade significa excluir até o final do atual (ou próxima) palavra. 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 sequências de escape possa consertar os atalhos.)

Existe um programa Linux para imprimir isso?

Eu estou supondo que tal programa pode ser dependente do sistema operacional, do kernel ou até mesmo do teclado, então talvez ele precise de uma configuração extensa (um programa que pesquisa o usuário showkeyou xevpressiona teclas diversas para estabelecer quais seqüências de escape são realmente enviadas, por exemplo ), mas seria um preço aceitável para finalmente entender como usar os atalhos do terminal com eficiência.

Responder1

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

Você poderia, em princípio, construir um; seria necessário examinar a configuração do 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 as combinações de teclas.

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, você precisa analisar a documentação do bash ou do readline.

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

Você pode chegar perto no Emacs: inicie emacs -q -nwem um terminal e pressione Ctrl+ H, C(o describe-key-brieflycomando) e depois a sequência de teclas ( \eis Escape). Isso mostra a tecla de função reconstruída, se houver, e o que a tecla faz no Emacs. As ligações padrão do Readline são fortemente inspiradas no Emacs, muitas vezes a função no Emacs é semelhante à função no readline, mas nem sempre. Exemplo:

Ctrl+H C ESC [ A
<up> runs the command previous-line

Responder2

Eu tive o mesmo problema ao não conseguir digerir as várias páginas de saída do bindcomando interno do Bash, especialmente quando tive a -popção.

Portanto, criei as duas funções a seguir que defini em meu .bashrcarquivo:

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 número widthde colunas é fixo, o número de colunas está relacionado à proporção de $(($COLUMNS/$width)).

informação relacionada