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

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

現在定義されているキーボードショートカットをユーザーフレンドリーに説明する方法がある場合は非常に役立ちます。つまり、次の/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、カーネル、またはキーボードによって異なる場合があるため、多くの設定が必要になる場合があります(たとえば、実際に送信されるエスケープ文字列を決定するために別のキーを押すshowkeyか押してユーザーをポーリングするプログラム)。xevしかし、最終的にターミナルショートカットを効果的に使用する方法を知るには、許容可能な価格になります。

答え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 -q -nwEmacsでも同様のことができます。端末で実行し、Ctrl+ HCdescribe-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(sort)とlist(pr -t)の出力が好きかどうかを決定します。列数はwidth固定されており、列数はの比率によって異なります$(($COLUMNS/$width))

関連情報