사람이 읽을 수 있는 형식으로 키보드 단축키를 인쇄하는 방법은 무엇입니까?

사람이 읽을 수 있는 형식으로 키보드 단축키를 인쇄하는 방법은 무엇입니까?

현재 정의된 키보드 단축키를 사용자 친화적으로 설명할 수 있는 방법이 있다면 매우 도움이 될 것입니다. 즉, 다음 /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에서 이것을 인쇄할 수 있는 프로그램이 있습니까?

그러한 프로그램은 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+ 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.

그래서 파일에 다음 두 가지 함수가 정의되어 있습니다 .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( sort) 및 list( pr -t) 출력이 마음에 드는지 결정하세요. 열 개수는 width고정되어 있으며, 열 개수는 의 비율에 따라 달라집니다 $(($COLUMNS/$width)).

관련 정보