如何以人类可读的形式打印键盘快捷键?

如何以人类可读的形式打印键盘快捷键?

如果有一种用户友好的方式来概述当前定义的键盘快捷键,这将非常有用。换句话说,鉴于这些/etc/inputrc

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

~/.inputrc线条

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

没有必要遍历这两个文件来找出\e[A已被覆盖的文件,有两个替代的快捷方式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 下有打印这个的程序吗?

我猜测这样的程序可能是操作系统、内核、甚至键盘相关的,所以可能需要大量的配置(例如,一个通过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 -q -nw您可以在 Emacs 中进行类似操作:在终端中启动,然后按Ctrl+ H, Cdescribe-key-briefly命令),然后按按键顺序 ( \eis Escape)。这将向您显示重建的功能键(如果有)以及该键在 Emacs 中的作用。 Readline 的默认绑定深受 Emacs 的启发,因此 Emacs 中的函数通常与 readline 中的函数相似,但并非总是如此。例子:

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

答案2

我遇到了同样的问题,无法消化bindBash 内置命令的几页输出,特别是在给出-p选项时。

因此,我在文件中定义了以下两个函数.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

只需执行以上两个定义并决定您是否喜欢排序 ( sort) 和列表 ( pr -t) 输出。列数width是固定的,列数与 的比率有关$(($COLUMNS/$width))

相关内容