キーボードショートカットを人間が読める形式で印刷するにはどうすればいいですか?

キーボードショートカットを人間が読める形式で印刷するにはどうすればいいですか?

現在定義されているキーボードショートカットの概要をユーザーフレンドリーに把握できる方法があれば非常に便利です。言い換えると/etc/inputrc

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

~/.inputrc

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

が上書きされていること\e[A、 には 2 つの代替ショートカットがあることbackward-word、 は\e\eOD... を意味していること、 はkill-word実際には現在の (または次の) 単語の末尾まで削除することを意味することなどを理解するために、両方のファイルを調べる必要はないはずです。理想的な解決策は、次のようなものを出力することです。

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

(エスケープ シーケンスをよりよく理解している人がショートカットを修正してくれることを願っています。)

これを印刷する Linux プログラムはありますか?

このようなプログラムは OS、カーネル、さらにはキーボードに依存する可能性があるので、広範な構成 (たとえば、実際に送信されるエスケープ シーケンスを確立するために、さまざまなキーを介してユーザーをポーリングしたりshowkeyxevさまざまなキーを押させたりするためのプログラム) が必要になる可能性がありますが、ターミナル ショートカットを効率的に使用する方法を最終的に理解するための許容できる代償でしょう。

答え1

簡単に答えると、いいえ、そのようなプログラムは存在しないと思います。

原理的にはビルドできますが、readline 構成とターミナル エミュレーターを確認する必要があります (カーネルとハードウェアは関係ありません)。

bind -P | grep 'can be found'Bash ではキーバインディングがリストされます。

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

コマンドにもっとわかりやすい名前を付けるには、bash または readline のドキュメントを解析する必要があります。

キー シーケンスとキーの対応は、端末 (通常は端末エミュレータ) によって決まります。対応はすぐには得られないことが多く、取得する方法も端末によって異なります。

Emacs でもこれに近いことができます。emacs -q -nwターミナルで開始し、Ctrl+ H, C(describe-key-brieflyコマンド) を押してからキーシーケンス ( \eis Escape) を押します。これにより、再構築されたファンクションキー (存在する場合) と、Emacs でのキーの機能が表示されます。Readline のデフォルトのバインディングは Emacs に強く影響を受けているため、多くの場合、Emacs の機能は readline の機能に似ていますが、常にそうであるとは限りません。例:

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

答え2

bind私もまったく同じ問題を抱えており、特にオプションが指定されている場合は、Bash 組み込みコマンドからの数ページにわたる出力を理解できませんでした-p

そこで、私はファイルに定義した次の 2 つの関数を思いつきました.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

上記の 2 つの定義を実行し、ソートされた出力 ( sort) と集計されたpr -t出力 ( ) のどちらが好みかを判断します。width列の数は固定されており、列の数は の比率に関係します$(($COLUMNS/$width))

関連情報